[dpdk-dev,V21,4/4] app/testpmd: show example to handle hot unplug
Checks
Commit Message
Use testpmd for example, to show how an application smoothly handle
failure when device being hot unplug. Once app detect the removal event,
the callback would be called, it first stop the packet forwarding, then
stop the port, close the port and finally detach the port.
Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
v21->v20:
fix attach port issue, let it work for multiple device case.
combind rmv callback to only one.
---
app/test-pmd/testpmd.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
Comments
Hi Jeff,
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jeff Guo
> Sent: Thursday, May 3, 2018 11:49 AM
> To: stephen@networkplumber.org; Richardson, Bruce
> <bruce.richardson@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>;
> Ananyev, Konstantin <konstantin.ananyev@intel.com>;
> gaetan.rivet@6wind.com; Wu, Jingjing <jingjing.wu@intel.com>;
> thomas@monjalon.net; motih@mellanox.com; matan@mellanox.com; Van
> Haaren, Harry <harry.van.haaren@intel.com>; Tan, Jianfeng
> <jianfeng.tan@intel.com>
> Cc: jblunck@infradead.org; shreyansh.jain@nxp.com; dev@dpdk.org; Guo,
> Jia <jia.guo@intel.com>; Zhang, Helin <helin.zhang@intel.com>
> Subject: [dpdk-dev] [PATCH V21 4/4] app/testpmd: show example to handle
> hot unplug
>
> Use testpmd for example, to show how an application smoothly handle
> failure when device being hot unplug. Once app detect the removal event,
> the callback would be called, it first stop the packet forwarding, then stop the
> port, close the port and finally detach the port.
>
> Signed-off-by: Jeff Guo <jia.guo@intel.com>
> ---
> v21->v20:
> fix attach port issue, let it work for multiple device case.
> combind rmv callback to only one.
> ---
> app/test-pmd/testpmd.c | 27 ++++++++++++++++++---------
> 1 file changed, 18 insertions(+), 9 deletions(-)
>
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
> db23f23..a1ff8f3 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1908,9 +1908,10 @@ eth_dev_event_callback_unregister(void)
> void
> attach_port(char *identifier)
> {
> - portid_t pi = 0;
> unsigned int socket_id;
>
> + portid_t pi = rte_eth_dev_count_avail();
> +
> printf("Attaching a new port...\n");
>
> if (identifier == NULL) {
> @@ -2071,12 +2072,14 @@ rmv_event_callback(void *arg)
> RTE_ETH_VALID_PORTID_OR_RET(port_id);
> dev = &rte_eth_devices[port_id];
>
> + if (dev->state == RTE_ETH_DEV_UNUSED)
> + return;
> +
> + printf("removing device %s\n", dev->device->name);
> + stop_packet_forwarding();
> stop_port(port_id);
> close_port(port_id);
> - printf("removing device %s\n", dev->device->name);
> - if (rte_eal_dev_detach(dev->device))
> - TESTPMD_LOG(ERR, "Failed to detach device %s\n",
> - dev->device->name);
> + detach_port(port_id);
> }
>
> /* This function is used by the interrupt thread */ @@ -2131,19 +2134,26
> @@ static void eth_dev_event_callback(char *device_name, enum
> rte_dev_event_type type,
> __rte_unused void *arg)
> {
> + uint16_t port_id;
> + int ret;
> +
> if (type >= RTE_DEV_EVENT_MAX) {
> fprintf(stderr, "%s called upon invalid event %d\n",
> __func__, type);
> fflush(stderr);
> }
>
> + ret = rte_eth_dev_get_port_by_name(device_name, &port_id);
> + if (ret) {
> + printf("can not get port by device %s!\n", device_name);
> + return;
> + }
> +
> switch (type) {
> case RTE_DEV_EVENT_REMOVE:
> RTE_LOG(ERR, EAL, "The device: %s has been removed!\n",
> device_name);
> - /* TODO: After finish failure handle, begin to stop
> - * packet forward, stop port, close port, detach port.
> - */
> + rmv_event_callback((void *)(intptr_t)port_id);
> break;
> case RTE_DEV_EVENT_ADD:
> RTE_LOG(ERR, EAL, "The device: %s has been added!\n",
> @@ -2666,7 +2676,6 @@ main(int argc, char** argv)
> return -1;
> }
> eth_dev_event_callback_register();
> -
> }
>
> if (start_port(RTE_PORT_ALL) != 0)
> --
> 2.7.4
This patch fails to apply to dpdk 18.08-rc0 and needs to be rebased.
Regards,
Bernard.
On 6/14/2018 8:59 PM, Iremonger, Bernard wrote:
> Hi Jeff,
>
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jeff Guo
>> Sent: Thursday, May 3, 2018 11:49 AM
>> To: stephen@networkplumber.org; Richardson, Bruce
>> <bruce.richardson@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>;
>> Ananyev, Konstantin <konstantin.ananyev@intel.com>;
>> gaetan.rivet@6wind.com; Wu, Jingjing <jingjing.wu@intel.com>;
>> thomas@monjalon.net; motih@mellanox.com; matan@mellanox.com; Van
>> Haaren, Harry <harry.van.haaren@intel.com>; Tan, Jianfeng
>> <jianfeng.tan@intel.com>
>> Cc: jblunck@infradead.org; shreyansh.jain@nxp.com; dev@dpdk.org; Guo,
>> Jia <jia.guo@intel.com>; Zhang, Helin <helin.zhang@intel.com>
>> Subject: [dpdk-dev] [PATCH V21 4/4] app/testpmd: show example to handle
>> hot unplug
>>
>> Use testpmd for example, to show how an application smoothly handle
>> failure when device being hot unplug. Once app detect the removal event,
>> the callback would be called, it first stop the packet forwarding, then stop the
>> port, close the port and finally detach the port.
>>
>> Signed-off-by: Jeff Guo <jia.guo@intel.com>
>> ---
>> v21->v20:
>> fix attach port issue, let it work for multiple device case.
>> combind rmv callback to only one.
>> ---
>> app/test-pmd/testpmd.c | 27 ++++++++++++++++++---------
>> 1 file changed, 18 insertions(+), 9 deletions(-)
>>
>> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
>> db23f23..a1ff8f3 100644
>> --- a/app/test-pmd/testpmd.c
>> +++ b/app/test-pmd/testpmd.c
>> @@ -1908,9 +1908,10 @@ eth_dev_event_callback_unregister(void)
>> void
>> attach_port(char *identifier)
>> {
>> - portid_t pi = 0;
>> unsigned int socket_id;
>>
>> + portid_t pi = rte_eth_dev_count_avail();
>> +
>> printf("Attaching a new port...\n");
>>
>> if (identifier == NULL) {
>> @@ -2071,12 +2072,14 @@ rmv_event_callback(void *arg)
>> RTE_ETH_VALID_PORTID_OR_RET(port_id);
>> dev = &rte_eth_devices[port_id];
>>
>> + if (dev->state == RTE_ETH_DEV_UNUSED)
>> + return;
>> +
>> + printf("removing device %s\n", dev->device->name);
>> + stop_packet_forwarding();
>> stop_port(port_id);
>> close_port(port_id);
>> - printf("removing device %s\n", dev->device->name);
>> - if (rte_eal_dev_detach(dev->device))
>> - TESTPMD_LOG(ERR, "Failed to detach device %s\n",
>> - dev->device->name);
>> + detach_port(port_id);
>> }
>>
>> /* This function is used by the interrupt thread */ @@ -2131,19 +2134,26
>> @@ static void eth_dev_event_callback(char *device_name, enum
>> rte_dev_event_type type,
>> __rte_unused void *arg)
>> {
>> + uint16_t port_id;
>> + int ret;
>> +
>> if (type >= RTE_DEV_EVENT_MAX) {
>> fprintf(stderr, "%s called upon invalid event %d\n",
>> __func__, type);
>> fflush(stderr);
>> }
>>
>> + ret = rte_eth_dev_get_port_by_name(device_name, &port_id);
>> + if (ret) {
>> + printf("can not get port by device %s!\n", device_name);
>> + return;
>> + }
>> +
>> switch (type) {
>> case RTE_DEV_EVENT_REMOVE:
>> RTE_LOG(ERR, EAL, "The device: %s has been removed!\n",
>> device_name);
>> - /* TODO: After finish failure handle, begin to stop
>> - * packet forward, stop port, close port, detach port.
>> - */
>> + rmv_event_callback((void *)(intptr_t)port_id);
>> break;
>> case RTE_DEV_EVENT_ADD:
>> RTE_LOG(ERR, EAL, "The device: %s has been added!\n",
>> @@ -2666,7 +2676,6 @@ main(int argc, char** argv)
>> return -1;
>> }
>> eth_dev_event_callback_register();
>> -
>> }
>>
>> if (start_port(RTE_PORT_ALL) != 0)
>> --
>> 2.7.4
> This patch fails to apply to dpdk 18.08-rc0 and needs to be rebased.
>
> Regards,
>
> Bernard.
thanks your notify, bernard, the coming next patch set will update to
fix it.
@@ -1908,9 +1908,10 @@ eth_dev_event_callback_unregister(void)
void
attach_port(char *identifier)
{
- portid_t pi = 0;
unsigned int socket_id;
+ portid_t pi = rte_eth_dev_count_avail();
+
printf("Attaching a new port...\n");
if (identifier == NULL) {
@@ -2071,12 +2072,14 @@ rmv_event_callback(void *arg)
RTE_ETH_VALID_PORTID_OR_RET(port_id);
dev = &rte_eth_devices[port_id];
+ if (dev->state == RTE_ETH_DEV_UNUSED)
+ return;
+
+ printf("removing device %s\n", dev->device->name);
+ stop_packet_forwarding();
stop_port(port_id);
close_port(port_id);
- printf("removing device %s\n", dev->device->name);
- if (rte_eal_dev_detach(dev->device))
- TESTPMD_LOG(ERR, "Failed to detach device %s\n",
- dev->device->name);
+ detach_port(port_id);
}
/* This function is used by the interrupt thread */
@@ -2131,19 +2134,26 @@ static void
eth_dev_event_callback(char *device_name, enum rte_dev_event_type type,
__rte_unused void *arg)
{
+ uint16_t port_id;
+ int ret;
+
if (type >= RTE_DEV_EVENT_MAX) {
fprintf(stderr, "%s called upon invalid event %d\n",
__func__, type);
fflush(stderr);
}
+ ret = rte_eth_dev_get_port_by_name(device_name, &port_id);
+ if (ret) {
+ printf("can not get port by device %s!\n", device_name);
+ return;
+ }
+
switch (type) {
case RTE_DEV_EVENT_REMOVE:
RTE_LOG(ERR, EAL, "The device: %s has been removed!\n",
device_name);
- /* TODO: After finish failure handle, begin to stop
- * packet forward, stop port, close port, detach port.
- */
+ rmv_event_callback((void *)(intptr_t)port_id);
break;
case RTE_DEV_EVENT_ADD:
RTE_LOG(ERR, EAL, "The device: %s has been added!\n",
@@ -2666,7 +2676,6 @@ main(int argc, char** argv)
return -1;
}
eth_dev_event_callback_register();
-
}
if (start_port(RTE_PORT_ALL) != 0)