From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wg0-f47.google.com (mail-wg0-f47.google.com [74.125.82.47]) by dpdk.org (Postfix) with ESMTP id 954B0B0B5 for ; Fri, 27 Jun 2014 01:57:53 +0200 (CEST) Received: by mail-wg0-f47.google.com with SMTP id k14so4369430wgh.6 for ; Thu, 26 Jun 2014 16:58:12 -0700 (PDT) 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:mime-version:content-type:content-transfer-encoding; bh=hkx4vMDBBU7TPsV26+2AZxQaKYS53GRCGpJBD0erkRQ=; b=SItQ/rPPH0fSy5Aztzt8NtLJHC5yt9CWZhbwcsKt84lzEENoZZ3i1XhSSlvgsXHAfq hegbgppYR3CM+5fnnlDpCfMQ43JRw+dD8fMTplP3sWhXkWHHJdfTwotua8ez5hWxoqzy BHo9BmbyjI7AQ06kuhC64aF341SrXbc0tYeHFd9Cv8pRFYqz14AC/BOz1hbt4rOMw/pa IuPBivBHzKq5V/P05p7zWmYjhiBUbcnXaDnsqJxK0oDmdFQ7cZPthcY6GuKueywLVI21 smX3tS0e1Hp5sbbTxQ7nA4XkPUCFOADLdKPzJIYBcU5uUzcJWlEVGbSD6b5K89qNVARj fhzg== X-Gm-Message-State: ALoCoQmFyX0s9UUE35FDdRKYFSXwXoq1s4ifUNRkrWp0PSfRcI+NzCGau3kzh2mWt2ZuWBvuAWDX X-Received: by 10.194.243.70 with SMTP id ww6mr21371994wjc.76.1403827092736; Thu, 26 Jun 2014 16:58:12 -0700 (PDT) Received: from localhost.localdomain (136-92-190-109.dsl.ovh.fr. [109.190.92.136]) by mx.google.com with ESMTPSA id gh16sm9820655wic.3.2014.06.26.16.58.11 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 26 Jun 2014 16:58:12 -0700 (PDT) From: Thomas Monjalon To: Declan Doherty Date: Fri, 27 Jun 2014 01:57:53 +0200 Message-Id: <1403827075-9192-4-git-send-email-thomas.monjalon@6wind.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1403827075-9192-1-git-send-email-thomas.monjalon@6wind.com> References: <1403726868-8161-1-git-send-email-declan.doherty@intel.com> <1403827075-9192-1-git-send-email-thomas.monjalon@6wind.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: dev@dpdk.org Subject: [dpdk-dev] [PATCH v9 3/5] eal: support link bonding device initialization 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: Thu, 26 Jun 2014 23:57:53 -0000 From: Declan Doherty Updating functionality in EAL to support adding link bonding devices via –vdev option. Link bonding devices will be initialized after all physical devices have been probed and initialized. Signed-off-by: Declan Doherty Acked-by: Pablo de Lara --- lib/librte_eal/bsdapp/eal/eal.c | 10 ++++- lib/librte_eal/common/eal_common_dev.c | 58 ++++++++++++++++++++--------- lib/librte_eal/common/eal_common_pci.c | 3 ++ lib/librte_eal/common/include/eal_private.h | 7 ---- lib/librte_eal/common/include/rte_dev.h | 14 ++++++- lib/librte_eal/linuxapp/eal/eal.c | 11 +++++- 6 files changed, 74 insertions(+), 29 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c index ce0db03..ec57b26 100644 --- a/lib/librte_eal/bsdapp/eal/eal.c +++ b/lib/librte_eal/bsdapp/eal/eal.c @@ -919,7 +919,7 @@ rte_eal_init(int argc, char **argv) rte_eal_mcfg_complete(); - if (rte_eal_dev_init() < 0) + if (rte_eal_dev_init(PMD_INIT_PRE_PCI_PROBE) < 0) rte_panic("Cannot init pmd devices\n"); RTE_LCORE_FOREACH_SLAVE(i) { @@ -951,6 +951,14 @@ rte_eal_init(int argc, char **argv) rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER); rte_eal_mp_wait_lcore(); + /* Probe & Initialize PCI devices */ + if (rte_eal_pci_probe()) + rte_panic("Cannot probe PCI\n"); + + /* Initialize any outstanding devices */ + if (rte_eal_dev_init(PMD_INIT_POST_PCI_PROBE) < 0) + rte_panic("Cannot init pmd devices\n"); + return fctret; } diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index eae5656..1194419 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -62,7 +62,7 @@ rte_eal_driver_unregister(struct rte_driver *driver) } int -rte_eal_dev_init(void) +rte_eal_dev_init(uint8_t init_pri) { struct rte_devargs *devargs; struct rte_driver *driver; @@ -80,30 +80,52 @@ rte_eal_dev_init(void) continue; TAILQ_FOREACH(driver, &dev_driver_list, next) { - if (driver->type != PMD_VDEV) - continue; + /* RTE_DEVTYPE_VIRTUAL can only be a virtual or bonded device, + * virtual devices are initialized pre PCI probing and bonded + * device are post pci probing */ + if ((driver->type == PMD_VDEV && init_pri == + PMD_INIT_PRE_PCI_PROBE) || + (driver->type == PMD_BDEV && init_pri == + PMD_INIT_POST_PCI_PROBE)) { - /* search a driver prefix in virtual device name */ - if (!strncmp(driver->name, devargs->virtual.drv_name, - strlen(driver->name))) { - driver->init(devargs->virtual.drv_name, - devargs->args); - break; + /* search a driver prefix in virtual device name */ + if (!strncmp(driver->name, devargs->virtual.drv_name, + strlen(driver->name))) { + printf("init (%u) %s\n", init_pri, devargs->virtual.drv_name); + driver->init(devargs->virtual.drv_name, + devargs->args); + break; + } } } - if (driver == NULL) { - rte_panic("no driver found for %s\n", - devargs->virtual.drv_name); + /* If initializing pre PCI probe, then we don't expect a bonded driver + * to be found */ + if (init_pri == PMD_INIT_PRE_PCI_PROBE && + strncmp(PMD_BOND_NAME, devargs->virtual.drv_name, + strlen(PMD_BOND_NAME)) != 0) { + if (driver == NULL) { + rte_panic("no driver found for virtual device %s\n", + devargs->virtual.drv_name); + } + } else if (init_pri == PMD_INIT_POST_PCI_PROBE && + strncmp(PMD_BOND_NAME, devargs->virtual.drv_name, + strlen(PMD_BOND_NAME)) == 0) { + if (driver == NULL) { + rte_panic("no driver found for bonded device %s\n", + devargs->virtual.drv_name); + } } } - /* Once the vdevs are initalized, start calling all the pdev drivers */ - TAILQ_FOREACH(driver, &dev_driver_list, next) { - if (driver->type != PMD_PDEV) - continue; - /* PDEV drivers don't get passed any parameters */ - driver->init(NULL, NULL); + /* Once the vdevs are initialized, start calling all the pdev drivers */ + if (init_pri == PMD_INIT_PRE_PCI_PROBE) { + TAILQ_FOREACH(driver, &dev_driver_list, next) { + if (driver->type != PMD_PDEV) + continue; + /* PDEV drivers don't get passed any parameters */ + driver->init(NULL, NULL); + } } return 0; } diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index af809a8..c637361 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -150,6 +150,9 @@ rte_eal_pci_probe(void) probe_all = 1; TAILQ_FOREACH(dev, &pci_device_list, next) { + /* check if device has already been initialized */ + if (dev->driver != NULL) + continue; /* set devargs in PCI structure */ devargs = pci_devargs_lookup(dev); diff --git a/lib/librte_eal/common/include/eal_private.h b/lib/librte_eal/common/include/eal_private.h index 232fcec..b440ffb 100644 --- a/lib/librte_eal/common/include/eal_private.h +++ b/lib/librte_eal/common/include/eal_private.h @@ -196,11 +196,4 @@ int rte_eal_intr_init(void); */ int rte_eal_alarm_init(void); -/** - * This function initialises any virtual devices - * - * This function is private to the EAL. - */ -int rte_eal_dev_init(void); - #endif /* _EAL_PRIVATE_H_ */ diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index f7e3a10..d89f1a5 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -62,6 +62,16 @@ typedef int (rte_dev_init_t)(const char *name, const char *args); enum pmd_type { PMD_VDEV = 0, PMD_PDEV = 1, + PMD_BDEV = 2, /**< Poll Mode Driver Bonded Device*/ +}; + +#define PMD_BOND_NAME "eth_bond" + +/** + * Driver initialization */ +enum pmd_init_priority { + PMD_INIT_PRE_PCI_PROBE = 0, + PMD_INIT_POST_PCI_PROBE = 1, }; /** @@ -93,9 +103,9 @@ void rte_eal_driver_register(struct rte_driver *driver); void rte_eal_driver_unregister(struct rte_driver *driver); /** - * Initalize all the registered drivers in this process + * Initialize all the registered drivers in this process */ -int rte_eal_dev_init(void); +int rte_eal_dev_init(uint8_t init_priority); #define PMD_REGISTER_DRIVER(d)\ void devinitfn_ ##d(void);\ diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index 00d74ed..d1c082d 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -75,6 +75,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_thread.h" @@ -1142,7 +1143,7 @@ rte_eal_init(int argc, char **argv) RTE_LOG(DEBUG, EAL, "Master core %u is ready (tid=%x)\n", rte_config.master_lcore, (int)thread_id); - if (rte_eal_dev_init() < 0) + if (rte_eal_dev_init(PMD_INIT_PRE_PCI_PROBE) < 0) rte_panic("Cannot init pmd devices\n"); RTE_LCORE_FOREACH_SLAVE(i) { @@ -1172,6 +1173,14 @@ rte_eal_init(int argc, char **argv) rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER); rte_eal_mp_wait_lcore(); + /* Probe & Initialize PCI devices */ + if (rte_eal_pci_probe()) + rte_panic("Cannot probe PCI\n"); + + /* Initialize any outstanding devices */ + if (rte_eal_dev_init(PMD_INIT_POST_PCI_PROBE) < 0) + rte_panic("Cannot init pmd devices\n"); + return fctret; } -- 2.0.0