From patchwork Sat Jul 15 17:56:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 26948 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 9ECF77CB1; Sat, 15 Jul 2017 19:57:12 +0200 (CEST) Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by dpdk.org (Postfix) with ESMTP id 3FF442BF5 for ; Sat, 15 Jul 2017 19:57:04 +0200 (CEST) Received: by mail-wm0-f53.google.com with SMTP id b134so13212831wma.0 for ; Sat, 15 Jul 2017 10:57:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=xCh7Pv74F7ETE8f76i7WqWpCy2RIMahN5DG4nAUE2Ew=; b=CAEHgTDmQgrCP7UD8rYPXurU4tungYWJc7kODrJgDSCYlLD3gmf6ws2jSfpgGda8oP F26eOTqEWA/cWBEkFesqLPzgBuAXRJASI0PhHfBuB9KJnkCGrlcwuIacZTFYSVeohMbc xsLDadMw7JZ89xLTY0W1tyKHRptlRYDpc1mwmfUKpyYZW0m5x74r8jl8WMld52SK6h1E q2pG6SBYHTkGyS3JK3WgzZ6L1Lwizoa8V20/EmS5wNxzLBkMMttPLSVshgroOEt0jZqo LmMfsP7ZVaOFiuscGA/WW3rCmC09NGWgV+nPQngbHyS5qamvodqrA/aaw951BQzkEUpO rb/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=xCh7Pv74F7ETE8f76i7WqWpCy2RIMahN5DG4nAUE2Ew=; b=l4HZRyovuooZy0c2i4+xHD31vkv5azF37e/mmmmUM/z1l9DUWvEe+5e3UVYkAz6j6m MfwKj5ZDmMHw85j6KWciA2dAKwIOjdizIhcSiRoFysZ0pyfq1XyPKi84wA6YskeKa8sG 2IbCsMjGqhukKQhKFqFkUGMSH/tXlbg8mBixmu8G8mE0RJOxC/G5VWXnVg9sD+6RxvJD iQbp2DPmuim2lDaUelHXHhf0+1EayGzUSt1+UGIP3PRwzqb0rnljwQgudlbK9iqAKVEb IfQsymxipqeltKPhnxWd1c6Hc9wzhjlSlfjfp2Hk25mLJr/V/qNII0OsDZ7Sg75tY50p bULg== X-Gm-Message-State: AIVw112D1xbXmB43woLmvabs+zGP/+kUOi4pEjLiU/DKRwvT+WvsujH6 shzX4lm9nIX0Vf77fZA= X-Received: by 10.28.15.137 with SMTP id 131mr1487679wmp.129.1500141423541; Sat, 15 Jul 2017 10:57:03 -0700 (PDT) Received: from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id 79sm2479445wmj.2.2017.07.15.10.57.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 15 Jul 2017 10:57:02 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Sat, 15 Jul 2017 19:56:38 +0200 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v4 4/8] eal: fix hotplug add / remove X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The hotplug API requires a few properties that were not previously explicitly enforced: - Idempotency, two consecutive scans should result in the same state. - Upon returning, internal devices are now allocated and available through the new `find_device` operator, meaning that they should be identifiable. The current rte_eal_hotplug_add implementation identifies devices by their names, as it is readily available and easy to define. The device name must be passed to the internal rte_device handle in order to be available during scan, when it is then assigned to the device. The current way of passing down this information from the device declaration is through the global rte_devargs list. Furthermore, the rte_device cannot take a bus-specific generated name, as it is then not identifiable by the `find_device` operator. The device must take the user-defined name. Ideally, an rte_device name should not change during its existence. This commit generates a new rte_devargs associated with the plugged device and inserts it in the global rte_devargs list. It consequently releases it upon device removal. Fixes: a3ee360f4440 ("eal: add hotplug add/remove device") Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/eal_common_dev.c | 56 ++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 32e12b5..2540fb3 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -118,11 +118,32 @@ int rte_eal_dev_detach(struct rte_device *dev) return ret; } +static char * +full_dev_name(const char *bus, const char *dev, const char *args) +{ + char *name; + size_t len; + + len = strlen(bus) + 1 + + strlen(dev) + 1 + + strlen(args) + 1; + name = calloc(1, len); + if (name == NULL) { + RTE_LOG(ERR, EAL, "Could not allocate full device name\n"); + return NULL; + } + snprintf(name, len, "%s:%s,%s", bus, dev, + args ? args : ""); + return name; +} + int rte_eal_hotplug_add(const char *busname, const char *devname, const char *devargs) { struct rte_bus *bus; struct rte_device *dev; + struct rte_devargs *da; + char *name; int ret; bus = rte_bus_find_by_name(busname); @@ -137,21 +158,49 @@ int rte_eal_hotplug_add(const char *busname, const char *devname, return -ENOTSUP; } + name = full_dev_name(busname, devname, devargs); + if (name == NULL) + return -ENOMEM; + + da = calloc(1, sizeof(*da)); + if (da == NULL) { + ret = -ENOMEM; + goto err_name; + } + + ret = rte_eal_devargs_parse(name, da); + if (ret) + goto err_devarg; + + ret = rte_eal_devargs_insert(da); + if (ret) + goto err_devarg; + ret = bus->scan(); if (ret) - return ret; + goto err_devarg; dev = bus->find_device(NULL, cmp_detached_dev_name, devname); if (dev == NULL) { RTE_LOG(ERR, EAL, "Cannot find unplugged device (%s)\n", devname); - return -EINVAL; + ret = -ENODEV; + goto err_devarg; } ret = bus->plug(dev, devargs); - if (ret) + if (ret) { RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", dev->name); + goto err_devarg; + } + free(name); + return 0; + +err_devarg: + rte_eal_devargs_remove(busname, devname); +err_name: + free(name); return ret; } @@ -183,5 +232,6 @@ int rte_eal_hotplug_remove(const char *busname, const char *devname) if (ret) RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n", dev->name); + rte_eal_devargs_remove(busname, devname); return ret; }