From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pa0-f49.google.com (mail-pa0-f49.google.com [209.85.220.49]) by dpdk.org (Postfix) with ESMTP id 80B2258EE for ; Tue, 4 Nov 2014 04:36:57 +0100 (CET) Received: by mail-pa0-f49.google.com with SMTP id lj1so13507183pab.36 for ; Mon, 03 Nov 2014 19:46:13 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=SW2I+xEOSG+9qlZTsS3uguPcBz0tvd+7N4qC7JwK63w=; b=m5deT+il5R5zAL25cuiylHvtztTAXfQ/6l1+Ngh7vrHzabUOzBUDuHamYfeKC/i+jH QWhIbt1jUAP0pZpDs+cDoS8KL67G5mhHTOdfVOAH4bojKRLZsmktkNJOGdcLOV4+Q8bJ GCS+jOgV3EgT+r5lOvEZNjiQfLlicOX9ibNcP1jtH2wdQ4kPZSI6C9CvEMTg40unJD6J k1KdaIR+cPqeONHq2cIe9qD/+DKX72IdcdUypKQUjKOdtMKfCzAPisg0neaP0oV/3QKG e0lnAk+KCEl/1vyUDbSNWab7psbGeNHZr1U6KwrvEmdTcErKH3erWVJmQk330O0xE9zT 6gJQ== X-Gm-Message-State: ALoCoQl6AqZGhX6DEBsrRo+5To9c9EHnChLYsD6ndLZ7ReUvCaX8M1c0DRWt/RcBzneJXn1w00An X-Received: by 10.70.124.196 with SMTP id mk4mr4921594pdb.14.1415072773030; Mon, 03 Nov 2014 19:46:13 -0800 (PST) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by mx.google.com with ESMTPSA id jc3sm18430580pbb.49.2014.11.03.19.46.11 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 03 Nov 2014 19:46:12 -0800 (PST) From: Tetsuya Mukawa To: dev@dpdk.org Date: Tue, 4 Nov 2014 12:45:20 +0900 Message-Id: <1415072748-31937-1-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1414572576-21371-1-git-send-email-mukawa@igel.co.jp> References: <1414572576-21371-1-git-send-email-mukawa@igel.co.jp> Cc: nakajima.yoshihiro@lab.ntt.co.jp, masutani.hitoshi@lab.ntt.co.jp Subject: [dpdk-dev] [RFC PATCH v2 00/25] Port Hotplug Framework X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Nov 2014 03:36:58 -0000 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(-) -- 1.9.1