From patchwork Fri Feb 8 03:44:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 50243 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EA44C1B73F; Fri, 8 Feb 2019 04:44:19 +0100 (CET) Received: from mail-pl1-f196.google.com (mail-pl1-f196.google.com [209.85.214.196]) by dpdk.org (Postfix) with ESMTP id CF21F1B72A for ; Fri, 8 Feb 2019 04:44:17 +0100 (CET) Received: by mail-pl1-f196.google.com with SMTP id s1so1022886plp.9 for ; Thu, 07 Feb 2019 19:44:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=uMqeantR8Ftre/8j9Xjj08VOQ73Tz922ZlVc0wpVmgk=; b=gKU9f1W2NY1MhUr4JTvnKyhx1m+VjljreMkdIMezxcbibpYrMLwm5f4HFe9CXHo15J aNFS03O0YJ9h9fgKNeN1ifZFfl1YmptIoGXh1KyxghBZNo3l/FWO990X1aghQ2wZ3gKJ KUfQyXguz6mkH8nq3aCIIGHt4bpS3JkVsYXyrjz42t3TrfNL0+OWgjUFTEcFJKALlrcV ZaNE26WXegyJe5Qu5o2+tvZ39kL3vGkNrmAnHjTG+Z3yMzzekuB+01z3JJGWVrD1HEbh K8YbimWGhU63OLx4PvWpFS670Kf2yAFCgpovDpBIMAVwucQDQiNKCPhiset+2BhPDn72 bnQw== 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:mime-version:content-transfer-encoding; bh=uMqeantR8Ftre/8j9Xjj08VOQ73Tz922ZlVc0wpVmgk=; b=LDbigaVZV4vSuIDYP2kyQ0ZATPM9i4khlEdtcltQdWhQaQd+z0qRd6OeS4TWuy+tRX FOuqqkCHTU34d7VEJNPMiisByudqya1r2QeK3yogK+jm2k1IgYEvJ9vUVBcAcBs8+wc1 4Los00zxejKx2xriedFBJsFXRNWc4tN+Vxxwpmg3AUG4DkUPW6J/L0mN5xRiQoRvDFFV 0aNZZxCN2A1gm+n1zlFQR7gkcM1GL6tobHBLMNC9Ou12FsOES/MMS/TA6qCQfmuOQI+1 kjJUYttUe3d1nf0VvtPziRoBJWOALGSyw2F5g5XEelZEpY39nxVgBUCsBMZ2W5EoEzvt IFBg== X-Gm-Message-State: AHQUAuYVY2NXwhQtNxsvHFB86EejJy1EC1QTZhRryzmBzzXjS1NFKyCn y8A9bClXgM2oaiwmeZrVYojOdFEUY34= X-Google-Smtp-Source: AHgI3IbUqVKV5v9hE9XNh9futEQhNd0VbRuhxnhfBS1lS+qNmqFdwsrtJEzYe+wkQKTCqjbbisy6ag== X-Received: by 2002:a17:902:9885:: with SMTP id s5mr20625188plp.52.1549597456661; Thu, 07 Feb 2019 19:44:16 -0800 (PST) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id i4sm873275pfj.82.2019.02.07.19.44.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Feb 2019 19:44:15 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: stable@dpdk.org, Stephen Hemminger Date: Thu, 7 Feb 2019 19:44:01 -0800 Message-Id: <20190208034407.7865-2-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190208034407.7865-1-stephen@networkplumber.org> References: <20190208034407.7865-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 1/7] bus/vmbus: fix secondary process setup 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" From: Stephen Hemminger The secondary process doesn't correctly map the second and later resources because it doesn't change the offset. Fixes: 831dba47bd36 ("bus/vmbus: add Hyper-V virtual bus support") Signed-off-by: Stephen Hemminger --- drivers/bus/vmbus/vmbus_common_uio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/bus/vmbus/vmbus_common_uio.c b/drivers/bus/vmbus/vmbus_common_uio.c index 5ddd36ab62d2..46e233d9fac3 100644 --- a/drivers/bus/vmbus/vmbus_common_uio.c +++ b/drivers/bus/vmbus/vmbus_common_uio.c @@ -47,9 +47,10 @@ vmbus_uio_map_secondary(struct rte_vmbus_device *dev) for (i = 0; i != uio_res->nb_maps; i++) { void *mapaddr; + off_t offset = i * PAGE_SIZE; mapaddr = vmbus_map_resource(uio_res->maps[i].addr, - fd, 0, + fd, offset, uio_res->maps[i].size, 0); if (mapaddr == uio_res->maps[i].addr) From patchwork Fri Feb 8 03:44:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 50246 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 320DF1B766; Fri, 8 Feb 2019 04:44:22 +0100 (CET) Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) by dpdk.org (Postfix) with ESMTP id E2BC51B739 for ; Fri, 8 Feb 2019 04:44:19 +0100 (CET) Received: by mail-pl1-f194.google.com with SMTP id o6so1013452pls.13 for ; Thu, 07 Feb 2019 19:44:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=E6+oYjjKe4wOQMbRAEPazYduEDHpICUMFytsTTii9UU=; b=ZrqhP4x4GRKsd0mgds0nlAdDuBe7pq3wfVyf5llg1LPW+PFbkij+OYcJ0Drpuijplo FhRQ11zPbbcbSfh3TrTSTm9UdrNGZ8bOyViFYHr3vnaD7xU3YVrZH/PxU1i0ooFkfySK 5ieCkmoPYN/gmwsbs4RLh/bmUkvDjA5XzTqO9ITZreaHZOnDGvVjUo0fDjRnuC68CfTE gKKdbYIsUC8463DDBQnYG3PRCB4Z49U0HcuHBKFX1FH/r4g1UHcvXtWvALq8psCwI2rc dZYlwXdVNh+A9SqvYaImRKm9FfwCxON4/jRdXERiyIzomGC7ImV1lRzYOtAwwssQwqe9 TWqg== 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:mime-version:content-transfer-encoding; bh=E6+oYjjKe4wOQMbRAEPazYduEDHpICUMFytsTTii9UU=; b=eoPZ8kuoZ3e1IYeN//2NRMT/z1pNfxNEkR7b+Xigo5VKGkg4GcQIY4piI+0PFtXDpd /i9cmvAiL1tlUqBeX2Stm91Rn8FODNxNuvrL5fY9zhI1NP2jxQWPPiirnA+yfuJQDDIv voba/zC7bb2dekTRuX9rv4RPSUkEuSWlBYQnCsIB+Vrl3SGRy08oP+wCXzCPTRSRPj1s lf6Z7ALH6ML4CtdRQADPgVVyvNO5e9QyIvTn+75I7xraHpd7Nb7MKPJbxrLliIttayQG t8sXwDfgwCF0pu63x8Gen8Rz+gEaR0B+8EAEyVQWIqMp6LO3WQ1LgS/s1ElRE2hdtqEg bthw== X-Gm-Message-State: AHQUAuacH3mqG/3Nu9M4BSIDYFETMz7AUf5sgTQQU58ZW+FvMHNvcnwa n32QQy4Amr/dk26/HLD6zECUHAXzms0= X-Google-Smtp-Source: AHgI3IYG/FB61ItbFtuYHkLJcdad0oJHzI0n86KFFViIQaBF32BlBuFvOQQH9mFtvT+jdHU7APPqag== X-Received: by 2002:a17:902:a411:: with SMTP id p17mr20197463plq.292.1549597458534; Thu, 07 Feb 2019 19:44:18 -0800 (PST) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id i4sm873275pfj.82.2019.02.07.19.44.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Feb 2019 19:44:16 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: stable@dpdk.org, Stephen Hemminger Date: Thu, 7 Feb 2019 19:44:02 -0800 Message-Id: <20190208034407.7865-3-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190208034407.7865-1-stephen@networkplumber.org> References: <20190208034407.7865-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 2/7] net/netvsc: fix VF support with secondary process 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" From: Stephen Hemminger The VF device management in netvsc was using a pointer to the rte_eth_devices. But the actual rte_eth_devices array is likely to be place in the secondary process; which causes a crash. The solution is to record the port of the VF (instead of a pointer) and find the device in the per process array as needed. Fixes: dc7680e8597c ("net/netvsc: support integrated VF") Signed-off-by: Stephen Hemminger --- drivers/net/netvsc/hn_ethdev.c | 3 +- drivers/net/netvsc/hn_rxtx.c | 8 ++-- drivers/net/netvsc/hn_var.h | 30 ++++++++++++- drivers/net/netvsc/hn_vf.c | 82 +++++++++++++++++----------------- 4 files changed, 75 insertions(+), 48 deletions(-) diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index 49b7ca7b2244..407ee484935a 100644 --- a/drivers/net/netvsc/hn_ethdev.c +++ b/drivers/net/netvsc/hn_ethdev.c @@ -735,6 +735,7 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev) hv->port_id = eth_dev->data->port_id; hv->latency = HN_CHAN_LATENCY_NS; hv->max_queues = 1; + hv->vf_port = HN_INVALID_PORT; err = hn_parse_args(eth_dev); if (err) @@ -788,7 +789,7 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev) hv->max_queues = RTE_MIN(rxr_cnt, (unsigned int)max_chan); /* If VF was reported but not added, do it now */ - if (hv->vf_present && !hv->vf_dev) { + if (hv->vf_present && !hn_vf_attached(hv)) { PMD_INIT_LOG(DEBUG, "Adding VF device"); err = hn_vf_add(eth_dev, hv); diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c index 6197118b01ee..fecd69887e2b 100644 --- a/drivers/net/netvsc/hn_rxtx.c +++ b/drivers/net/netvsc/hn_rxtx.c @@ -1313,8 +1313,8 @@ hn_xmit_pkts(void *ptxq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) return 0; /* Transmit over VF if present and up */ - vf_dev = hv->vf_dev; - rte_compiler_barrier(); + vf_dev = hn_get_vf_dev(hv); + if (vf_dev && vf_dev->data->dev_started) { void *sub_q = vf_dev->data->tx_queues[queue_id]; @@ -1404,8 +1404,8 @@ hn_recv_pkts(void *prxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) if (unlikely(hv->closed)) return 0; - vf_dev = hv->vf_dev; - rte_compiler_barrier(); + /* Transmit over VF if present and up */ + vf_dev = hn_get_vf_dev(hv); if (vf_dev && vf_dev->data->dev_started) { /* Normally, with SR-IOV the ring buffer will be empty */ diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h index 7f3266c451fb..8383f3246ca4 100644 --- a/drivers/net/netvsc/hn_var.h +++ b/drivers/net/netvsc/hn_var.h @@ -91,15 +91,19 @@ struct hn_rx_bufinfo { struct rte_mbuf_ext_shared_info shinfo; } __rte_cache_aligned; +#define HN_INVALID_PORT UINT16_MAX + struct hn_data { struct rte_vmbus_device *vmbus; struct hn_rx_queue *primary; - struct rte_eth_dev *vf_dev; /* Subordinate device */ rte_spinlock_t vf_lock; uint16_t port_id; - uint8_t closed; + uint16_t vf_port; + uint8_t vf_present; + uint8_t closed; uint8_t vlan_strip; + uint32_t link_status; uint32_t link_speed; @@ -170,6 +174,28 @@ int hn_dev_rx_queue_setup(struct rte_eth_dev *dev, struct rte_mempool *mp); void hn_dev_rx_queue_release(void *arg); +/* Check if VF is attached */ +static inline bool +hn_vf_attached(const struct hn_data *hv) +{ + return hv->vf_port != HN_INVALID_PORT; +} + +/* Get VF device for existing netvsc device */ +static inline struct rte_eth_dev * +hn_get_vf_dev(const struct hn_data *hv) +{ + uint16_t vf_port = hv->vf_port; + + /* make sure vf_port is loaded */ + rte_smp_rmb(); + + if (vf_port == HN_INVALID_PORT) + return NULL; + else + return &rte_eth_devices[vf_port]; +} + void hn_vf_info_get(struct hn_data *hv, struct rte_eth_dev_info *info); int hn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv); diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c index 3f714ec99029..de278eb7b403 100644 --- a/drivers/net/netvsc/hn_vf.c +++ b/drivers/net/netvsc/hn_vf.c @@ -51,15 +51,20 @@ static int hn_vf_match(const struct rte_eth_dev *dev) return -ENOENT; } + /* * Attach new PCI VF device and return the port_id */ -static int hn_vf_attach(struct hn_data *hv, uint16_t port_id, - struct rte_eth_dev **vf_dev) +static int hn_vf_attach(struct hn_data *hv, uint16_t port_id) { struct rte_eth_dev_owner owner = { .id = RTE_ETH_DEV_NO_OWNER }; int ret; + if (hn_vf_attached(hv)) { + PMD_DRV_LOG(ERR, "VF already attached"); + return -EEXIST; + } + ret = rte_eth_dev_owner_get(port_id, &owner); if (ret < 0) { PMD_DRV_LOG(ERR, "Can not find owner for port %d", port_id); @@ -79,8 +84,9 @@ static int hn_vf_attach(struct hn_data *hv, uint16_t port_id, } PMD_DRV_LOG(DEBUG, "Attach VF device %u", port_id); + hv->vf_port = port_id; rte_smp_wmb(); - *vf_dev = &rte_eth_devices[port_id]; + return 0; } @@ -96,12 +102,7 @@ int hn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv) } rte_spinlock_lock(&hv->vf_lock); - if (hv->vf_dev) { - PMD_DRV_LOG(ERR, "VF already attached"); - err = -EBUSY; - } else { - err = hn_vf_attach(hv, port, &hv->vf_dev); - } + err = hn_vf_attach(hv, port); if (err == 0) { dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; @@ -120,22 +121,22 @@ int hn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv) /* Remove new VF device */ static void hn_vf_remove(struct hn_data *hv) { - struct rte_eth_dev *vf_dev; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; - if (!vf_dev) { + + if (!hn_vf_attached(hv)) { PMD_DRV_LOG(ERR, "VF path not active"); - rte_spinlock_unlock(&hv->vf_lock); - return; - } + } else { + /* Stop incoming packets from arriving on VF */ + hn_nvs_set_datapath(hv, NVS_DATAPATH_SYNTHETIC); - /* Stop incoming packets from arriving on VF */ - hn_nvs_set_datapath(hv, NVS_DATAPATH_SYNTHETIC); - hv->vf_dev = NULL; + /* Stop transmission over VF */ + hv->vf_port = HN_INVALID_PORT; + rte_smp_wmb(); - /* Give back ownership */ - rte_eth_dev_owner_unset(vf_dev->data->port_id, hv->owner.id); + /* Give back ownership */ + rte_eth_dev_owner_unset(hv->vf_port, hv->owner.id); + } rte_spinlock_unlock(&hv->vf_lock); } @@ -207,7 +208,7 @@ void hn_vf_info_get(struct hn_data *hv, struct rte_eth_dev_info *info) struct rte_eth_dev *vf_dev; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev) hn_vf_info_merge(vf_dev, info); rte_spinlock_unlock(&hv->vf_lock); @@ -221,7 +222,7 @@ int hn_vf_link_update(struct rte_eth_dev *dev, int ret = 0; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev && vf_dev->dev_ops->link_update) ret = (*vf_dev->dev_ops->link_update)(vf_dev, wait_to_complete); rte_spinlock_unlock(&hv->vf_lock); @@ -249,13 +250,14 @@ static int hn_vf_lsc_event(uint16_t port_id __rte_unused, } static int _hn_vf_configure(struct rte_eth_dev *dev, - struct rte_eth_dev *vf_dev, + uint16_t vf_port, const struct rte_eth_conf *dev_conf) { struct rte_eth_conf vf_conf = *dev_conf; - uint16_t vf_port = vf_dev->data->port_id; + struct rte_eth_dev *vf_dev; int ret; + vf_dev = &rte_eth_devices[vf_port]; if (dev_conf->intr_conf.lsc && (vf_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)) { PMD_DRV_LOG(DEBUG, "enabling LSC for VF %u", @@ -294,13 +296,11 @@ int hn_vf_configure(struct rte_eth_dev *dev, const struct rte_eth_conf *dev_conf) { struct hn_data *hv = dev->data->dev_private; - struct rte_eth_dev *vf_dev; int ret = 0; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; - if (vf_dev) - ret = _hn_vf_configure(dev, vf_dev, dev_conf); + if (hv->vf_port != HN_INVALID_PORT) + ret = _hn_vf_configure(dev, hv->vf_port, dev_conf); rte_spinlock_unlock(&hv->vf_lock); return ret; } @@ -312,7 +312,7 @@ const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev) const uint32_t *ptypes = NULL; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev && vf_dev->dev_ops->dev_supported_ptypes_get) ptypes = (*vf_dev->dev_ops->dev_supported_ptypes_get)(vf_dev); rte_spinlock_unlock(&hv->vf_lock); @@ -327,7 +327,7 @@ int hn_vf_start(struct rte_eth_dev *dev) int ret = 0; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev) ret = rte_eth_dev_start(vf_dev->data->port_id); rte_spinlock_unlock(&hv->vf_lock); @@ -340,7 +340,7 @@ void hn_vf_stop(struct rte_eth_dev *dev) struct rte_eth_dev *vf_dev; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev) rte_eth_dev_stop(vf_dev->data->port_id); rte_spinlock_unlock(&hv->vf_lock); @@ -352,7 +352,7 @@ void hn_vf_stop(struct rte_eth_dev *dev) struct hn_data *hv = (dev)->data->dev_private; \ struct rte_eth_dev *vf_dev; \ rte_spinlock_lock(&hv->vf_lock); \ - vf_dev = hv->vf_dev; \ + vf_dev = hn_get_vf_dev(hv); \ if (vf_dev) \ func(vf_dev->data->port_id); \ rte_spinlock_unlock(&hv->vf_lock); \ @@ -402,7 +402,7 @@ int hn_vf_mc_addr_list(struct rte_eth_dev *dev, int ret = 0; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev) ret = rte_eth_dev_set_mc_addr_list(vf_dev->data->port_id, mc_addr_set, nb_mc_addr); @@ -420,7 +420,7 @@ int hn_vf_tx_queue_setup(struct rte_eth_dev *dev, int ret = 0; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev) ret = rte_eth_tx_queue_setup(vf_dev->data->port_id, queue_idx, nb_desc, @@ -434,7 +434,7 @@ void hn_vf_tx_queue_release(struct hn_data *hv, uint16_t queue_id) struct rte_eth_dev *vf_dev; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev && vf_dev->dev_ops->tx_queue_release) { void *subq = vf_dev->data->tx_queues[queue_id]; @@ -455,7 +455,7 @@ int hn_vf_rx_queue_setup(struct rte_eth_dev *dev, int ret = 0; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev) ret = rte_eth_rx_queue_setup(vf_dev->data->port_id, queue_idx, nb_desc, @@ -469,7 +469,7 @@ void hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id) struct rte_eth_dev *vf_dev; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev && vf_dev->dev_ops->rx_queue_release) { void *subq = vf_dev->data->rx_queues[queue_id]; @@ -486,7 +486,7 @@ int hn_vf_stats_get(struct rte_eth_dev *dev, int ret = 0; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev) ret = rte_eth_stats_get(vf_dev->data->port_id, stats); rte_spinlock_unlock(&hv->vf_lock); @@ -503,7 +503,7 @@ int hn_vf_xstats_get_names(struct rte_eth_dev *dev, char tmp[RTE_ETH_XSTATS_NAME_SIZE]; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev && vf_dev->dev_ops->xstats_get_names) count = vf_dev->dev_ops->xstats_get_names(vf_dev, names, n); rte_spinlock_unlock(&hv->vf_lock); @@ -528,7 +528,7 @@ int hn_vf_xstats_get(struct rte_eth_dev *dev, int count = 0; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev && vf_dev->dev_ops->xstats_get) count = vf_dev->dev_ops->xstats_get(vf_dev, xstats, n); rte_spinlock_unlock(&hv->vf_lock); @@ -542,7 +542,7 @@ void hn_vf_xstats_reset(struct rte_eth_dev *dev) struct rte_eth_dev *vf_dev; rte_spinlock_lock(&hv->vf_lock); - vf_dev = hv->vf_dev; + vf_dev = hn_get_vf_dev(hv); if (vf_dev && vf_dev->dev_ops->xstats_reset) vf_dev->dev_ops->xstats_reset(vf_dev); rte_spinlock_unlock(&hv->vf_lock); From patchwork Fri Feb 8 03:44:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 50245 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6C0D21B7D9; Fri, 8 Feb 2019 04:44:23 +0100 (CET) Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) by dpdk.org (Postfix) with ESMTP id CB2441B759 for ; Fri, 8 Feb 2019 04:44:20 +0100 (CET) Received: by mail-pl1-f193.google.com with SMTP id a14so1017576plm.12 for ; Thu, 07 Feb 2019 19:44:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ArJKO28hLj0K5VjH+0jBSnG6Yg4WWDwmTUVgCvjH65w=; b=OwKjsqoxzE1DjQ3i3SFtAKxWdFLhwHLLVg0gc55rpVNHfT5Llu9Ei/doTqg2PWjhq2 OUz/JlaQa06DFP2XVLo3tOwYviI6Md0BMF2xTTJHvdTVzsSaCzI+enx4CQoWAaAhmCYv VmvJqCV1pyOm25QZDEnrPR5QSqCn40nUG9EB22k/82pXtKNthu1mFZ1OnJ6+dQ0wE3// FGieIA/JvbPuPFc4OBkz6ZpyG5iliBGGJb8OR9W/M5EeXtRTt732uwduHii4gcvLaeuk Qo0c/N8cIgU6t/luIvmEYD0iJPWAMiTMKxhgPFBerzXkVS2/rrqP7ru12eEUGeNZyvmw DMkA== 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:mime-version:content-transfer-encoding; bh=ArJKO28hLj0K5VjH+0jBSnG6Yg4WWDwmTUVgCvjH65w=; b=R56/tJJpVGTnqU1RhPEAg2KIYEqbZCd5atA4AQ1zLExN2L64nb/v/WQ2sU1goEjSZF qP8Lnx0SIHB8X3EM578I5NyQcOPAEIUzOkfwC7+yBnvfyj9HT8LQBhh0TQZv7Y+FsQHr rV56EgjytQC6vwchZEqtq0FAnX7AsnuqkXOw62Mple7/vsZsg+THzxl5rTKCEbD+BYoT 5iR2XQgsG2+fmIVe62LOJ6WMz/vH8a0gBJc8ZPczfDch/IRFeL4vjwc6jdaD8yU26UIO lg+I/DL3RrAWn9YVaJce39ys2i2CgbtOy6Bk0AO+qDddcpYtrzv44XSm9Ukyn/t1zRdF cSmw== X-Gm-Message-State: AHQUAuY7FFl7OMc7FQhhKuTNSbdDPVluYY8BNLKTmYtUf7SKYUJ+DRMk u9eQ0rVyJijDfBt6xabkMxY6Ad52xdM= X-Google-Smtp-Source: AHgI3IboWsezZXt2jUW9T1YQEB3TlXlerh2SEmbx4xlZSlyYQWHNY+kFhIDOHowReaqMROsLDqpeRg== X-Received: by 2002:a17:902:765:: with SMTP id 92mr20443362pli.242.1549597459703; Thu, 07 Feb 2019 19:44:19 -0800 (PST) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id i4sm873275pfj.82.2019.02.07.19.44.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Feb 2019 19:44:18 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: stable@dpdk.org, Stephen Hemminger Date: Thu, 7 Feb 2019 19:44:03 -0800 Message-Id: <20190208034407.7865-4-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190208034407.7865-1-stephen@networkplumber.org> References: <20190208034407.7865-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 3/7] bus/vmbus: fix check for mmap failure 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" From: Stephen Hemminger The code was testing the result of mmap incorrectly. I.e the test that a local pointer is not MAP_FAILED would always succeed and therefore hid any potential problems. Fixes: 831dba47bd36 ("bus/vmbus: add Hyper-V virtual bus support") Signed-off-by: Stephen Hemminger --- drivers/bus/vmbus/linux/vmbus_uio.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/bus/vmbus/linux/vmbus_uio.c b/drivers/bus/vmbus/linux/vmbus_uio.c index 09f7efdca286..8c6bc52fd475 100644 --- a/drivers/bus/vmbus/linux/vmbus_uio.c +++ b/drivers/bus/vmbus/linux/vmbus_uio.c @@ -202,6 +202,7 @@ static int vmbus_uio_map_subchan(const struct rte_vmbus_device *dev, char ring_path[PATH_MAX]; size_t file_size; struct stat sb; + void *mapaddr; int fd; snprintf(ring_path, sizeof(ring_path), @@ -232,14 +233,16 @@ static int vmbus_uio_map_subchan(const struct rte_vmbus_device *dev, return -EINVAL; } - *ring_size = file_size / 2; - *ring_buf = vmbus_map_resource(vmbus_map_addr, fd, - 0, sb.st_size, 0); + mapaddr = vmbus_map_resource(vmbus_map_addr, fd, + 0, file_size, 0); close(fd); - if (ring_buf == MAP_FAILED) + if (mapaddr == MAP_FAILED) return -EIO; + *ring_size = file_size / 2; + *ring_buf = mapaddr; + vmbus_map_addr = RTE_PTR_ADD(ring_buf, file_size); return 0; } From patchwork Fri Feb 8 03:44:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 50247 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AFBA01B82F; Fri, 8 Feb 2019 04:44:24 +0100 (CET) Received: from mail-pg1-f196.google.com (mail-pg1-f196.google.com [209.85.215.196]) by dpdk.org (Postfix) with ESMTP id 4E3661B642 for ; Fri, 8 Feb 2019 04:44:22 +0100 (CET) Received: by mail-pg1-f196.google.com with SMTP id y4so952562pgc.12 for ; Thu, 07 Feb 2019 19:44:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=MpiYCMsFaEOjli1KVAU43+G7aYNgTfotKzBILh6TIdk=; b=qizOtV0Ao/dBZXBBfe8fIJil5FMKXytavr1jSmtx4wWrdhZUDKVVChTBwsxTWr/CsQ eeBxPirSCjQ7RI8NfHl4Sb7noYS6JsplKmRYOwuwslKyDh2w8y3kRNdDHcPFcEUcnRgo j6W/IEMB2CNfOtj23QRnsX7UFUvxoYP7JyR4ZjtPY6QtUWEeJz0suqyYeNo3WEuaR0v2 d0aNTICBOPWnpya42rphs2KTMR4MlhZx6nQxl4CCbV0KHpfOCHZAuih6fb8prJGM1QM0 Si+L7fQb1arQx+zp4/FcltdDnZFsvvy/93PE6hBU91XhIQWiG/tjbxM7KaYOEuFOa0+M 4k9w== 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:mime-version:content-transfer-encoding; bh=MpiYCMsFaEOjli1KVAU43+G7aYNgTfotKzBILh6TIdk=; b=PSJiBJDEn3vGv7l2AI8vEKm9fFP6Dw0i37GCdHnuIdfKU++3cFgQfS76+p6mVRWL4n 737Zquji9sxmphuduw0nW6k7naakhTeU4h7l7ijHyBjwHM7vE9NQS++dpY45pndzyQC9 ZAthfuy8RDIicw8TBWO0dXV5UpxmR08lEn2NXq1c+drkDYbKZq3Ewhl4E0+1gHYt9bOp l5X+MfSNYLijf7VTn2+voqeEdTsjTPV52RfaEN/Yv931jXZFrMONrUj5Y2LH+wvqtjGn Od3fAAOEKa787taMMeUyfnEX2kGzVYMfk8LsrlCBjy2DEOWJYtRewTHJlbwVn/pIG3V7 aRvw== X-Gm-Message-State: AHQUAuYh+13Ux6DCacQ9rWXhjV9v0CI09ecd5DqOafloL4X5myFvh1CC P4QhkdyQBVusGCYYvIXBFTBGgQAle+0= X-Google-Smtp-Source: AHgI3IYdhRFGZ3644m3WvtCAiu6xBjt29VF8ZqL+f1iNdC/x3LvGNVvzY4qav1okVVa2ESq9r5UaRw== X-Received: by 2002:a62:5301:: with SMTP id h1mr19772218pfb.17.1549597461180; Thu, 07 Feb 2019 19:44:21 -0800 (PST) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id i4sm873275pfj.82.2019.02.07.19.44.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Feb 2019 19:44:19 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: stable@dpdk.org, Stephen Hemminger Date: Thu, 7 Feb 2019 19:44:04 -0800 Message-Id: <20190208034407.7865-5-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190208034407.7865-1-stephen@networkplumber.org> References: <20190208034407.7865-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 4/7] bus/vmbus: stop mapping if empty resource found 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" From: Stephen Hemminger If vmbus is run on older kernel (without all the uio mappings), then the bus driver should stop when it hits the missing mappings rather than recording the empty values. Fixes: 831dba47bd36 ("bus/vmbus: add Hyper-V virtual bus support") Signed-off-by: Stephen Hemminger --- drivers/bus/vmbus/vmbus_common_uio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/bus/vmbus/vmbus_common_uio.c b/drivers/bus/vmbus/vmbus_common_uio.c index 46e233d9fac3..a6545b758e36 100644 --- a/drivers/bus/vmbus/vmbus_common_uio.c +++ b/drivers/bus/vmbus/vmbus_common_uio.c @@ -98,9 +98,9 @@ vmbus_uio_map_primary(struct rte_vmbus_device *dev) /* Map the resources */ for (i = 0; i < VMBUS_MAX_RESOURCE; i++) { - /* skip empty BAR */ + /* stop at empty BAR */ if (dev->resource[i].len == 0) - continue; + break; ret = vmbus_uio_map_resource_by_index(dev, i, uio_res, 0); if (ret) From patchwork Fri Feb 8 03:44:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 50248 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C6FC71B890; Fri, 8 Feb 2019 04:44:25 +0100 (CET) Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by dpdk.org (Postfix) with ESMTP id 2ABBA1B75D for ; Fri, 8 Feb 2019 04:44:24 +0100 (CET) Received: by mail-pf1-f195.google.com with SMTP id m6so1020731pfa.9 for ; Thu, 07 Feb 2019 19:44:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tNLmwkhhX0tuGLxvMfLDVmsc1WtKIHb65lnQnwwhhXw=; b=lIunXtjwbuIEtKfls4zm8AS4dgzsW47xkYPxtjHcpNO8ZVYWCFyK2+koWdb79XYXAd smaLtQT1c3QsRSYEfg7djTIMQuOUrcjF+Y7p4PahZY4wzo01m93FmBEbSYC7wX+mnhHr /r2kMjeeeSFcdh5A3BrUslpGIVGTvKRFzThBACqbJEaN8kjpDWZxO51GAdOsTd8hkWxx HYSpnPG1yx7k0fbTfigu3EVlTwxBXFkMK6XMloE2YZkMEKSLW04Q5S3lSHAMnI2Q/I+3 knWaMdCpAo3D5u67MbceB2ZlC4vMMglRwaYliivRJr+1zwGQ0eG5VlnxIWGKlvVqwOy1 38tQ== 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:mime-version:content-transfer-encoding; bh=tNLmwkhhX0tuGLxvMfLDVmsc1WtKIHb65lnQnwwhhXw=; b=UFuKjgRj18HrqPTXqXzVsD7/TSw9hbokh5J0xrbWQTBMWUytkJhOeZ+73R+Ya/V7JZ C2KEpAJykQwKEDgtuJsaGK5mkLx03VZqfADpkHrJ3/AMitdUZ60A3oD4vq7g+LsVL8jp 8rgKabedQT+VZdEpiA2GXbkSjQA7RjJNM4qe9mfNHGHCjFrQob1DQQOpSOGZ6IESG5ZR /8rBR9Ge8zRmfqcWKrg+tc9ZiPGQ49CUUB/I0n1RpiQAwZQy201EXlBDYx2wiofKenf2 ujGQj6EPDvvx4bhNLbBl9EDqZkLqUC4XqU2fVGb8/nlqUXTC55ls2ZpvIHrUmWvZy4Co dJgw== X-Gm-Message-State: AHQUAuYOeo2GM2BIKhNfAjP9tDRXUJ84ATTQCXl8P79NixC6y5ZJt/jb s0WwxzDZByAbSaTCbdqUZ3gMETPTH9A= X-Google-Smtp-Source: AHgI3Ia7mjYKknoMZDRckNHY1qXU4mngawT/onYF6vUyNbw5NtXxxa1vIt/nKx/n19oOvICvesTONQ== X-Received: by 2002:a62:ca9c:: with SMTP id y28mr19868181pfk.236.1549597462843; Thu, 07 Feb 2019 19:44:22 -0800 (PST) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id i4sm873275pfj.82.2019.02.07.19.44.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Feb 2019 19:44:21 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: stable@dpdk.org, Stephen Hemminger Date: Thu, 7 Feb 2019 19:44:05 -0800 Message-Id: <20190208034407.7865-6-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190208034407.7865-1-stephen@networkplumber.org> References: <20190208034407.7865-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 5/7] bus/vmbus: map ring in secondary 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" From: Stephen Hemminger Need to remember primary channel in secondary process. Then use it to iterate over subchannels in secondary process mapping setup. Fixes: 831dba47bd36 ("bus/vmbus: add Hyper-V virtual bus support") Signed-off-by: Stephen Hemminger --- drivers/bus/vmbus/linux/vmbus_uio.c | 43 ++++++++++++++++++++++++++++ drivers/bus/vmbus/private.h | 3 ++ drivers/bus/vmbus/vmbus_channel.c | 20 +++++++++++-- drivers/bus/vmbus/vmbus_common_uio.c | 15 ++++++++++ 4 files changed, 78 insertions(+), 3 deletions(-) diff --git a/drivers/bus/vmbus/linux/vmbus_uio.c b/drivers/bus/vmbus/linux/vmbus_uio.c index 8c6bc52fd475..fb60ee126d9b 100644 --- a/drivers/bus/vmbus/linux/vmbus_uio.c +++ b/drivers/bus/vmbus/linux/vmbus_uio.c @@ -247,6 +247,49 @@ static int vmbus_uio_map_subchan(const struct rte_vmbus_device *dev, return 0; } +int +vmbus_uio_map_secondary_subchan(const struct rte_vmbus_device *dev, + const struct vmbus_channel *chan) +{ + const struct vmbus_br *br = &chan->txbr; + char ring_path[PATH_MAX]; + void *mapaddr, *ring_buf; + uint32_t ring_size; + int fd; + + snprintf(ring_path, sizeof(ring_path), + "%s/%s/channels/%u/ring", + SYSFS_VMBUS_DEVICES, dev->device.name, + chan->relid); + + ring_buf = br->vbr; + ring_size = br->dsize + sizeof(struct vmbus_bufring); + VMBUS_LOG(INFO, "secondary ring_buf %p size %u", + ring_buf, ring_size); + + fd = open(ring_path, O_RDWR); + if (fd < 0) { + VMBUS_LOG(ERR, "Cannot open %s: %s", + ring_path, strerror(errno)); + return -errno; + } + + mapaddr = vmbus_map_resource(ring_buf, fd, 0, 2 * ring_size, 0); + close(fd); + + if (mapaddr == ring_buf) + return 0; + + if (mapaddr == MAP_FAILED) + VMBUS_LOG(ERR, + "mmap subchan %u in secondary failed", chan->relid); + else + VMBUS_LOG(ERR, + "mmap subchan %u in secondary address mismatch", + chan->relid); + return -1; +} + int vmbus_uio_map_rings(struct vmbus_channel *chan) { const struct rte_vmbus_device *dev = chan->device; diff --git a/drivers/bus/vmbus/private.h b/drivers/bus/vmbus/private.h index 211127dd8db5..f19b14e4a657 100644 --- a/drivers/bus/vmbus/private.h +++ b/drivers/bus/vmbus/private.h @@ -45,6 +45,7 @@ struct mapped_vmbus_resource { rte_uuid_t id; int nb_maps; + struct vmbus_channel *primary; struct vmbus_map maps[VMBUS_MAX_RESOURCE]; char path[PATH_MAX]; }; @@ -107,6 +108,8 @@ bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev, int vmbus_uio_get_subchan(struct vmbus_channel *primary, struct vmbus_channel **subchan); int vmbus_uio_map_rings(struct vmbus_channel *chan); +int vmbus_uio_map_secondary_subchan(const struct rte_vmbus_device *dev, + const struct vmbus_channel *chan); void vmbus_br_setup(struct vmbus_br *br, void *buf, unsigned int blen); diff --git a/drivers/bus/vmbus/vmbus_channel.c b/drivers/bus/vmbus/vmbus_channel.c index bd14c0662b46..46b3ba3f9f9e 100644 --- a/drivers/bus/vmbus/vmbus_channel.c +++ b/drivers/bus/vmbus/vmbus_channel.c @@ -352,12 +352,21 @@ int vmbus_chan_create(const struct rte_vmbus_device *device, int rte_vmbus_chan_open(struct rte_vmbus_device *device, struct vmbus_channel **new_chan) { + struct mapped_vmbus_resource *uio_res; int err; + uio_res = vmbus_uio_find_resource(device); + if (!uio_res) { + VMBUS_LOG(ERR, "can't find uio resource"); + return -EINVAL; + } + err = vmbus_chan_create(device, device->relid, 0, device->monitor_id, new_chan); - if (!err) + if (!err) { device->primary = *new_chan; + uio_res->primary = *new_chan; + } return err; } @@ -396,11 +405,16 @@ void rte_vmbus_chan_close(struct vmbus_channel *chan) const struct rte_vmbus_device *device = chan->device; struct vmbus_channel *primary = device->primary; - if (chan != primary) + /* + * intentionally leak primary channel because + * secondary may still reference it + */ + if (chan != primary) { STAILQ_REMOVE(&primary->subchannel_list, chan, vmbus_channel, next); + rte_free(chan); + } - rte_free(chan); } static void vmbus_dump_ring(FILE *f, const char *id, const struct vmbus_br *br) diff --git a/drivers/bus/vmbus/vmbus_common_uio.c b/drivers/bus/vmbus/vmbus_common_uio.c index a6545b758e36..9947f82ab194 100644 --- a/drivers/bus/vmbus/vmbus_common_uio.c +++ b/drivers/bus/vmbus/vmbus_common_uio.c @@ -27,6 +27,7 @@ static int vmbus_uio_map_secondary(struct rte_vmbus_device *dev) { int fd, i; + struct vmbus_channel *chan; struct mapped_vmbus_resource *uio_res; struct mapped_vmbus_res_list *uio_res_list = RTE_TAILQ_CAST(vmbus_tailq.head, mapped_vmbus_res_list); @@ -76,6 +77,20 @@ vmbus_uio_map_secondary(struct rte_vmbus_device *dev) /* fd is not needed in slave process, close it */ close(fd); + + dev->primary = uio_res->primary; + if (!dev->primary) { + VMBUS_LOG(ERR, "missing primary channel"); + return -1; + } + + STAILQ_FOREACH(chan, &dev->primary->subchannel_list, next) { + if (vmbus_uio_map_secondary_subchan(dev, chan) != 0) { + VMBUS_LOG(ERR, "cannot map secondary subchan"); + return -1; + } + } + return 0; } From patchwork Fri Feb 8 03:44:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 50249 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0C07A1B8B2; Fri, 8 Feb 2019 04:44:28 +0100 (CET) Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) by dpdk.org (Postfix) with ESMTP id 011FA1B87F for ; Fri, 8 Feb 2019 04:44:25 +0100 (CET) Received: by mail-pf1-f193.google.com with SMTP id j18so1040685pfe.1 for ; Thu, 07 Feb 2019 19:44:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/MqK8UDStPd5wVP8rUHvet3+T9Mv+3+WkMrG6pNWrmw=; b=Gk+7GKfz66pU0wtSjr15KPy1ku0ALl1ltEuhoEoTYhVYyG/5lRyHnu6LAiIIET3K8k XoNOapN3YMtbHbXQvLwjlLtaOesufSOUQKcOsEKcAaYDdVddufoIufgByYS2y3zLMf+6 8rjM74TJEHupsD9yFLQ9NOEUvXss8L+K0reHY/TW0+yvlrUXlMJbmqUyKXq2s70qxW7I GQqJvinBDSw939T7Vpvw+Z6NY4lXSoc31pe+OtrQi7heHdDntuBm7dn/5nqrvI7n2IAj ksYg4eeT7f1EFfkRPa8g1DrKW55DOobJnnKfFHwq8j4CtziKohbsrH7SD/Q0Kya/vERk teJw== 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:mime-version:content-transfer-encoding; bh=/MqK8UDStPd5wVP8rUHvet3+T9Mv+3+WkMrG6pNWrmw=; b=O31Y/63cKA228/o1NTt88Cb8Q1eWnybjwnzzGepjZ8y94yH+g0nXncBRX0Lzfaj2pz 08g4hRzJ6zw17qcOC2+ornYX9JHyMkP5aMjA/Epe6DSHQf2ShpZZa4IUNa31RUB0h2jG TwmzwoC2a1Ky1mTK40cgy3vvJp6T5MjHmloW4kTEpPZLbRgwXQXzTj54Lt93Znrc/nZh 39h/9PAogo6FH2LviVYbb1A/H73gS1ttpbcRdmC/DAADImlCvnNQJ8BxbZQt0T5cl2Ln QXRsj0tA24OS4XDNSzVBxRvSdEHZ6BsfYS5StgWSUB3l38SJzdbWlrv35rZyaOZrkI+G ABBA== X-Gm-Message-State: AHQUAuZj813yeHwQn1i0Y1uj6B6JdndcdwM+XCjOhpRT0/o5wz2YnZcC ov6Ld4ochaXq4WdDcsjISdjgFL+TvDQ= X-Google-Smtp-Source: AHgI3IZ5OLhHfa88s9YvWXKbgcFyoYLJQeeG7vAK7gH6fzN0zArmWTpSgkGpR8+w7dyt8Rd76g/3zg== X-Received: by 2002:a62:1112:: with SMTP id z18mr19782175pfi.173.1549597463847; Thu, 07 Feb 2019 19:44:23 -0800 (PST) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id i4sm873275pfj.82.2019.02.07.19.44.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Feb 2019 19:44:23 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: stable@dpdk.org, Stephen Hemminger Date: Thu, 7 Feb 2019 19:44:06 -0800 Message-Id: <20190208034407.7865-7-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190208034407.7865-1-stephen@networkplumber.org> References: <20190208034407.7865-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 6/7] bus/vmbus: refactor secondary mapping 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" From: Stephen Hemminger The secondary mapping function was duplicating the code used to search the uio_resource list. Skip the unwinding since map failure already makes device unusable. Signed-off-by: Stephen Hemminger --- drivers/bus/vmbus/vmbus_common_uio.c | 132 ++++++++++++--------------- 1 file changed, 58 insertions(+), 74 deletions(-) diff --git a/drivers/bus/vmbus/vmbus_common_uio.c b/drivers/bus/vmbus/vmbus_common_uio.c index 9947f82ab194..1aa5cb2e4b92 100644 --- a/drivers/bus/vmbus/vmbus_common_uio.c +++ b/drivers/bus/vmbus/vmbus_common_uio.c @@ -23,79 +23,82 @@ static struct rte_tailq_elem vmbus_tailq = { }; EAL_REGISTER_TAILQ(vmbus_tailq) -static int -vmbus_uio_map_secondary(struct rte_vmbus_device *dev) +struct mapped_vmbus_resource * +vmbus_uio_find_resource(const struct rte_vmbus_device *dev) { - int fd, i; - struct vmbus_channel *chan; struct mapped_vmbus_resource *uio_res; - struct mapped_vmbus_res_list *uio_res_list - = RTE_TAILQ_CAST(vmbus_tailq.head, mapped_vmbus_res_list); + struct mapped_vmbus_res_list *uio_res_list = + RTE_TAILQ_CAST(vmbus_tailq.head, mapped_vmbus_res_list); + + if (dev == NULL) + return NULL; TAILQ_FOREACH(uio_res, uio_res_list, next) { + if (rte_uuid_compare(uio_res->id, dev->device_id) == 0) + return uio_res; + } + return NULL; +} - /* skip this element if it doesn't match our UUID */ - if (rte_uuid_compare(uio_res->id, dev->device_id) != 0) - continue; +static int +vmbus_uio_map_secondary(struct rte_vmbus_device *dev) +{ + struct mapped_vmbus_resource *uio_res; + struct vmbus_channel *chan; + int fd, i; - /* open /dev/uioX */ - fd = open(uio_res->path, O_RDWR); - if (fd < 0) { - VMBUS_LOG(ERR, "Cannot open %s: %s", - uio_res->path, strerror(errno)); - return -1; - } + uio_res = vmbus_uio_find_resource(dev); + if (!uio_res) { + VMBUS_LOG(ERR, "Cannot find resource for device"); + return -1; + } - for (i = 0; i != uio_res->nb_maps; i++) { - void *mapaddr; - off_t offset = i * PAGE_SIZE; + /* open /dev/uioX */ + fd = open(uio_res->path, O_RDWR); + if (fd < 0) { + VMBUS_LOG(ERR, "Cannot open %s: %s", + uio_res->path, strerror(errno)); + return -1; + } - mapaddr = vmbus_map_resource(uio_res->maps[i].addr, - fd, offset, - uio_res->maps[i].size, 0); + for (i = 0; i != uio_res->nb_maps; i++) { + void *mapaddr; + off_t offset = i * PAGE_SIZE; - if (mapaddr == uio_res->maps[i].addr) - continue; + mapaddr = vmbus_map_resource(uio_res->maps[i].addr, + fd, offset, + uio_res->maps[i].size, 0); - VMBUS_LOG(ERR, - "Cannot mmap device resource file %s to address: %p", - uio_res->path, uio_res->maps[i].addr); + if (mapaddr == uio_res->maps[i].addr) + continue; /* successful map */ - if (mapaddr != MAP_FAILED) - /* unmap addr wrongly mapped */ - vmbus_unmap_resource(mapaddr, - (size_t)uio_res->maps[i].size); + if (mapaddr == MAP_FAILED) + VMBUS_LOG(ERR, + "mmap resource %d in secondary failed", i); + else + VMBUS_LOG(ERR, + "mmap resource %d address mismatch", i); - /* unmap addrs correctly mapped */ - while (--i >= 0) - vmbus_unmap_resource(uio_res->maps[i].addr, - (size_t)uio_res->maps[i].size); + close(fd); + return -1; + } - close(fd); - return -1; - } + /* fd is not needed in slave process, close it */ + close(fd); - /* fd is not needed in slave process, close it */ - close(fd); + dev->primary = uio_res->primary; + if (!dev->primary) { + VMBUS_LOG(ERR, "missing primary channel"); + return -1; + } - dev->primary = uio_res->primary; - if (!dev->primary) { - VMBUS_LOG(ERR, "missing primary channel"); + STAILQ_FOREACH(chan, &dev->primary->subchannel_list, next) { + if (vmbus_uio_map_secondary_subchan(dev, chan) != 0) { + VMBUS_LOG(ERR, "cannot map secondary subchan"); return -1; } - - STAILQ_FOREACH(chan, &dev->primary->subchannel_list, next) { - if (vmbus_uio_map_secondary_subchan(dev, chan) != 0) { - VMBUS_LOG(ERR, "cannot map secondary subchan"); - return -1; - } - } - - return 0; } - - VMBUS_LOG(ERR, "Cannot find resource for device"); - return 1; + return 0; } static int @@ -136,25 +139,6 @@ vmbus_uio_map_primary(struct rte_vmbus_device *dev) return -1; } - -struct mapped_vmbus_resource * -vmbus_uio_find_resource(const struct rte_vmbus_device *dev) -{ - struct mapped_vmbus_resource *uio_res; - struct mapped_vmbus_res_list *uio_res_list = - RTE_TAILQ_CAST(vmbus_tailq.head, mapped_vmbus_res_list); - - if (dev == NULL) - return NULL; - - TAILQ_FOREACH(uio_res, uio_res_list, next) { - /* skip this element if it doesn't match our VMBUS address */ - if (rte_uuid_compare(uio_res->id, dev->device_id) == 0) - return uio_res; - } - return NULL; -} - /* map the VMBUS resource of a VMBUS device in virtual memory */ int vmbus_uio_map_resource(struct rte_vmbus_device *dev) From patchwork Fri Feb 8 03:44:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 50250 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2C3A01B8BB; Fri, 8 Feb 2019 04:44:29 +0100 (CET) Received: from mail-pf1-f194.google.com (mail-pf1-f194.google.com [209.85.210.194]) by dpdk.org (Postfix) with ESMTP id 6D44D1B759 for ; Fri, 8 Feb 2019 04:44:26 +0100 (CET) Received: by mail-pf1-f194.google.com with SMTP id u6so1014871pfh.11 for ; Thu, 07 Feb 2019 19:44:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+rdfSmrt1AkmhfRWlkXemA1trsaMO0xOo7KWYkv61wQ=; b=Yh5Tqqa1XlntA2UaADXbE+vilHFVdoOy2tCMwqwmjfvKctYMB/bEf8UctV5OaeDBdo 3nseLzdU1tDUpM83i1QvQIA0CLR4Cfbh7wX87ynjaUvaddCioKbDdi3sx5JOQzfUiZ47 /Qq44f4fdfDDAA4rptK0CiYXB7SNpVpQfOAE0rj8rFkVL459r8sp5w+hTHXDWeq+LqW6 LCpNVcePWooZajTUW1YM5gHt/K8EKh9i9/a+74XrZKIXFQhkTqm6QyPNuicP+yb1uN7z XCoSl4ooryotWqJA/p7elz4cTAWpYT8KBiy3DASoV0m4uc2ltsVV/+JZfxQnV7V/MS4v 6ZPw== 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:mime-version:content-transfer-encoding; bh=+rdfSmrt1AkmhfRWlkXemA1trsaMO0xOo7KWYkv61wQ=; b=f47sfxBLQdMF6rpuSXcz2OggC/VkGP99TrEfvZ3yAyS66qhTTd1Ya7AYVLwxWUiD1J umBTcyJSiCWfsAIlOT6ET8XYA1tw2HBI6E8JN8m6BEKOCx0aQSjCfcGmn7un7r4Ix1eZ igA8Zj1ax/KL6noXHe3iOmL2EM7kmUTWgEWDD7Jz13XKM/wDeIJfOc8DMzC7SwoB3nYV H85//cdbT6uwwYkpYLRjZ6MuiSKT1E9g0l6vWHwaOU+GiXeWwS7A1V+noRplmpGAfxsJ 7alpAkmaVop9v0i8Hr4L/QnwW2zNn7rvF63Kz+vvFDO+kWHRsnnyV1c7dPCJkigtHdsu paiA== X-Gm-Message-State: AHQUAuY6Ewovr/zBo4zyKk2LBdhI4dob02lfMcWlJhZQRK1RPilXnIjb UKVDejR5F3Pvq7XY/p3zrTWuMzwWusY= X-Google-Smtp-Source: AHgI3IZF9tvkzj4DMh90hwyC7xPBPkNkvwgKMC+yNEQysiE1zwjYjn6yBdOteTyYJWq/oqRbUoXS6w== X-Received: by 2002:a62:ea09:: with SMTP id t9mr20756324pfh.228.1549597465292; Thu, 07 Feb 2019 19:44:25 -0800 (PST) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id i4sm873275pfj.82.2019.02.07.19.44.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Feb 2019 19:44:24 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: stable@dpdk.org, Stephen Hemminger Date: Thu, 7 Feb 2019 19:44:07 -0800 Message-Id: <20190208034407.7865-8-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190208034407.7865-1-stephen@networkplumber.org> References: <20190208034407.7865-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 7/7] net/netvsc: remove unnecessary format of ether address 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" From: Stephen Hemminger The ethernet address was being converted to a string but the code using that is no longer present. Signed-off-by: Stephen Hemminger --- drivers/net/netvsc/hn_vf.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c index de278eb7b403..f68e1f9c5473 100644 --- a/drivers/net/netvsc/hn_vf.c +++ b/drivers/net/netvsc/hn_vf.c @@ -33,10 +33,8 @@ static int hn_vf_match(const struct rte_eth_dev *dev) { const struct ether_addr *mac = dev->data->mac_addrs; - char buf[32]; int i; - ether_format_addr(buf, sizeof(buf), mac); RTE_ETH_FOREACH_DEV(i) { const struct rte_eth_dev *vf_dev = &rte_eth_devices[i]; const struct ether_addr *vf_mac = vf_dev->data->mac_addrs; @@ -44,7 +42,6 @@ static int hn_vf_match(const struct rte_eth_dev *dev) if (vf_dev == dev) continue; - ether_format_addr(buf, sizeof(buf), vf_mac); if (is_same_ether_addr(mac, vf_mac)) return i; }