[dpdk-dev] [RFC PATCH v2 00/25] Port Hotplug Framework

Tetsuya Mukawa mukawa at igel.co.jp
Tue Nov 18 09:55:46 CET 2014


Hi Folks,

I may not be able to attend todays conference call because it will be
midnight in my country.
So I just collect up current status of this function.

- I've received a email that let me know some bugs and suggestions in my
RFC. Now I am fixing it.
- Anyway, to use this function, we need to change PMDs. But still I
don't have implementations for physical PMDs.
- If there is someone who can develop hotplug function together, it's nice!

Thanks,
Tetsuya


(2014/11/04 12:45), Tetsuya Mukawa wrote:
> This patch series adds a dynamic port hotplug framework to DPDK.
> With the patches, DPDK apps can attach or detach ports at runtime.
>
> The basic concept of the port hotplug is like followings.
> - DPDK apps must have resposibility to manage ports.
>   DPDK apps only know which ports are attached or detached at the moment.
>   The port hotplug framework is implemented to allow DPDK apps to manage ports.
>   For example, when DPDK apps call port attach function, attached port number
>   will be returned. Also DPDK apps can detach port by port number.
> - Kernel support is needed for attaching or detaching physical device ports.
>   To attach new device, the device will be recognized by kernel at first and
>   controlled by kernel driver. Then user can bind the device to igb_uio
>   by 'dpdk_nic_bind.py'. Finally, DPDK apps can call the port hotplug
>   functions to attach ports.
>   For detaching, steps are vice versa.
> - Before detach ports, ports must be stopped and closed.
>   DPDK application must call rte_eth_dev_stop() and rte_eth_dev_close() before
>   detaching ports. These function will call finalization codes of PMDs.
>   But so far, no PMD frees all resources allocated by initialization.
>   It means PMDs are needed to be fixed to support the port hotplug.
>   'RTE_PCI_DRV_DETACHABLE' is a new flag indicating a PMD supports detaching.
>   Without this flag, detaching will be failed.
> - Mustn't affect legacy DPDK apps.
>   No DPDK EAL behavior is changed, if the port hotplug functions are't called.
>   So all legacy DPDK apps can still work without modifications.
>
> And few limitations.
> - The port hotplug functions are not thread safe.
>   DPDK apps should handle it.
> - Only support Linux and igb_uio so far.
>   BSD and VFIO is not supported. I will send VFIO patches at least, but I don't
>   have a plan to submit BSD patch so far.
>
>
> Here is port hotplug APIs.
> -------------------------------------------------------------------------------
> /**
>  * Attach a new physical device.
>  *
>  * @param addr
>  *   A pointer to a pci address structure describing the new
>  *   device to be attached.
>  * @param port_id
>  *  A pointer to a port identifier actually attached.
>  * @return
>  *  0 on success and port_id is filled, negative on error
>  */
> int rte_eal_dev_attach_pdev(struct rte_pci_addr *addr, uint8_t *port_id);
>
> /**
>  * Attach a new virtual device.
>  *
>  * @param vdevargs
>  *   A pointer to a strings array describing the new device
>  *   to be attached.
>  * @param port_id
>  *  A pointer to a port identifier actually attached.
>  * @return
>  *  0 on success and port_id is filled, negative on error
>  */
> int rte_eal_dev_attach_vdev(const char *vdevargs, uint8_t *port_id);
>
> /**
>  * Detach a physical device.
>  *
>  * @param port_id
>  *   The port identifier of the physical device to detach.
>  * @param addr
>  *  A pointer to a pci address structure actually detached.
>  * @return
>  *  0 on success and addr is filled, negative on error
>  */
> int rte_eal_dev_detach_pdev(uint8_t port_id, struct rte_pci_addr *addr);
>
> /**
>  * Detach a virtual device.
>  *
>  * @param port_id
>  *   The port identifier of the virtual device to detach.
>  * @param addr
>  *  A pointer to a virtual device name actually detached.
>  * @return
>  *  0 on success and vdevname is filled, negative on error
>  */
> int rte_eal_dev_detach_vdev(uint8_t port_id, char *vdevname);
> -------------------------------------------------------------------------------
>
> This patch series are for DPDK EAL. To use port hotplug function by DPDK apps,
> each PMD should be fixed to support 'RTE_PCI_DRV_DETACHABLE' flag. I've already
> sent an example patch for pcap PMD.
>
> Also I've sent patch for testpmd. The patch is an example of fixing legacy DPDK
> apps to support hot plug framework.
>
> Thanks,
> Tetsuya Mukawa
>
> Changes included in v2:
> - remove 'rte_eth_dev_validate_port()', and cleanup codes.
>
> Tetsuya Mukawa (25):
>   eal/pci: Add a new flag indicating a driver can detach devices at
>     runtime.
>   ethdev: Remove assumption that port will not be detached
>   eal/pci: Replace pci address comparison code by eal_compare_pci_addr
>   ethdev: Add rte_eth_dev_free to free specified device
>   eal,ethdev: Add function pointer for closing a device
>   ethdev: Add rte_eth_dev_shutdown for closing PCI devices.
>   ethdev: Add functions to know which port is attached or detached
>   ethdev: Add rte_eth_dev_get_addr_by_port
>   ethdev: Add rte_eth_dev_get_port_by_addr
>   ethdev: Add rte_eth_dev_get_name_by_port
>   ethdev: Add rte_eth_dev_check_detachable
>   ethdev: Change scope of rte_eth_dev_allocated to global
>   eal/pci: Prevent double registration for devargs_list
>   eal/pci: Add rte_eal_devargs_remove
>   eal/pci: Add probe and close function for virtual drivers
>   eal/pci: Add port hotplug functions for virtual devices.
>   eal/linux/pci: Add functions for unmapping igb_uio resources
>   eal/pci: Prevent double registrations for pci_device_list
>   eal/pci: Change scope of rte_eal_pci_scan to global
>   eal/pci: Add rte_eal_pci_close_one_driver
>   eal/pci: Fix pci_probe_all_drivers to share code with closing function
>   eal/pci: Add pci_close_all_drivers
>   eal/pci: Add rte_eal_pci_probe_one and rte_eal_pci_close_one
>   eal/pci: Add port hotplug functions for physical devices.
>   eal: Enable port hotplug framework in Linux
>
>  config/common_linuxapp                             |   5 +
>  lib/librte_eal/bsdapp/eal/eal_pci.c                |  16 +-
>  lib/librte_eal/common/eal_common_dev.c             | 208 ++++++++++++
>  lib/librte_eal/common/eal_common_devargs.c         |  45 +++
>  lib/librte_eal/common/eal_common_pci.c             | 107 +++++-
>  lib/librte_eal/common/include/eal_private.h        |  22 ++
>  lib/librte_eal/common/include/rte_dev.h            |  60 ++++
>  lib/librte_eal/common/include/rte_devargs.h        |  18 +
>  lib/librte_eal/common/include/rte_pci.h            |  64 ++++
>  lib/librte_eal/linuxapp/eal/Makefile               |   1 +
>  lib/librte_eal/linuxapp/eal/eal_pci.c              | 119 +++++--
>  lib/librte_eal/linuxapp/eal/eal_pci_uio.c          |  58 +++-
>  lib/librte_eal/linuxapp/eal/include/eal_pci_init.h |   7 +
>  lib/librte_ether/rte_ethdev.c                      | 371 +++++++++++++++------
>  lib/librte_ether/rte_ethdev.h                      | 100 ++++++
>  15 files changed, 1046 insertions(+), 155 deletions(-)
>



More information about the dev mailing list