From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 55E05A0032 for ; Fri, 15 Jul 2022 07:05:08 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 410CB40696; Fri, 15 Jul 2022 07:05:08 +0200 (CEST) Received: from smtp-relay-internal-0.canonical.com (smtp-relay-internal-0.canonical.com [185.125.188.122]) by mails.dpdk.org (Postfix) with ESMTP id 3EBE140042 for ; Fri, 15 Jul 2022 07:05:07 +0200 (CEST) Received: from mail-lj1-f198.google.com (mail-lj1-f198.google.com [209.85.208.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id DD6243F15F for ; Fri, 15 Jul 2022 05:05:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1657861506; bh=2Y3GRYNNgeZtdprw+7H11D6TElYcZt0yFCElrQxnoP8=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=eONRQZ7ZYAvcixWTwqb1GLPS3ddw8vwpq6VaMDV4BoWF7nAmm/jnQfqHrJvKe+sS0 FpBb4vMX/Pnc+pJsiU/8nF7BPe4LKrfBnFc1mC4me3TIBa8oA8UcqXzvl0/LSVN4r+ Pekj7Up3t/EcOAqHEPgF/6IJHF2KmoVUa7/kgNUGo9bvFB59KKJ0v3XoLYyufrYdXp XjWbPH4e/k/GTpDogm7eFQy4c3aB2IBWWLLRVXx8mfTASCJgGu0IeJNCJePGS59NJv NHaNhBQzaC0dYDxiP6DXEpB+TEoadssIlyLpHR7d9XavblvjleJBojet1K5IdPzaba WAcNKf5AWujMA== Received: by mail-lj1-f198.google.com with SMTP id c12-20020a2ebf0c000000b00258e5e6e125so844275ljr.17 for ; Thu, 14 Jul 2022 22:05:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=2Y3GRYNNgeZtdprw+7H11D6TElYcZt0yFCElrQxnoP8=; b=D+EYElMa2h38cFRItZ51Fx3wNazim+KIiuzFWnGWEAqsnCaXcpt/b1afs1iqgBf2gO oZvn1WJOtFLbWV0t39qvdhstwFpf6Xpwi716XQDZzXEc1fnsoxKb/njsk1FAB0B8x7f0 w/nlamXkYUpM6gQa4qXQFlJSyJgT+9sT9CwFX+adUl0i5C+FZi+GeuGXh/Mnt++UbJiD TnQdtOZv8+AChfuP/SqthaNLYK5IyrXVgJc1XEl20VLM3Y/N0jeyYE1EqhoMi8BUowYa NlvbZv99L0nace2vJC7VpCS85OPe3ibxah3+tZVHU5jMFeUGVUFwmMG9w89YcgoPBClY RqjQ== X-Gm-Message-State: AJIora8X8f7ZqQ6XbR7uldccUKWVBePPCbGFXBjiodlnZWLPWi+T3hnJ Z4NC/z8/3pYM0rBYNIVZX5XAJBfjdXOKz7lg2+gDdcFj2zrggimj5WJbgajsiFasBcJwO9G8AEJ K2VbY6/zo5gdGVJnabf9ZAfP7+8xFAQevlWTmfseB X-Received: by 2002:a05:6512:baa:b0:489:eca1:fd32 with SMTP id b42-20020a0565120baa00b00489eca1fd32mr6796960lfv.258.1657861505828; Thu, 14 Jul 2022 22:05:05 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tsyjOHzm881n76Yl3qL2Yumxh+OMLrLPzwPN9+PepuZEQbNCqHUQZYyX75urwMvmqS/bidkHzMCsrVc3PXo+I= X-Received: by 2002:a05:6512:baa:b0:489:eca1:fd32 with SMTP id b42-20020a0565120baa00b00489eca1fd32mr6796953lfv.258.1657861505552; Thu, 14 Jul 2022 22:05:05 -0700 (PDT) MIME-Version: 1.0 References: <1657833368-8212-1-git-send-email-longli@linuxonhyperv.com> <1657833368-8212-2-git-send-email-longli@linuxonhyperv.com> In-Reply-To: <1657833368-8212-2-git-send-email-longli@linuxonhyperv.com> From: Christian Ehrhardt Date: Fri, 15 Jul 2022 07:04:39 +0200 Message-ID: Subject: Re: [PATCH 19.11] net/netvsc: fix vmbus device reference in multi-process To: longli@microsoft.com Cc: stable@dpdk.org Content-Type: text/plain; charset="UTF-8" X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org On Thu, Jul 14, 2022 at 11:16 PM wrote: > > From: Long Li > > [ upstream commit 7b1a614dcbe2017f1984be28a01efabcd7fed8b8 ] Thanks, applied > The vmbus device is allocated via "calloc" before the EAL memory is > initialized. The secondary process can't reference the vmbus device as > it is not mapped correctly in the shared memory region. > > Replace all references to the vmbus device (and its contents) with the > pointers/contents set by the primary process. > > Fixes: 4e9c73e96e ("net/netvsc: add Hyper-V network device") > Cc: stable@dpdk.org > > Signed-off-by: Long Li > Acked-by: Stephen Hemminger > --- > drivers/bus/vmbus/private.h | 2 ++ > drivers/bus/vmbus/vmbus_channel.c | 28 +++++++--------------------- > drivers/net/netvsc/hn_ethdev.c | 4 ++-- > drivers/net/netvsc/hn_nvs.c | 14 +++++++------- > drivers/net/netvsc/hn_rxtx.c | 8 ++++---- > drivers/net/netvsc/hn_var.h | 4 ++-- > 6 files changed, 24 insertions(+), 36 deletions(-) > > diff --git a/drivers/bus/vmbus/private.h b/drivers/bus/vmbus/private.h > index 74ef948282..5b8b01b808 100644 > --- a/drivers/bus/vmbus/private.h > +++ b/drivers/bus/vmbus/private.h > @@ -77,6 +77,8 @@ struct vmbus_channel { > uint16_t relid; > uint16_t subchannel_id; > uint8_t monitor_id; > + > + struct vmbus_mon_page *monitor_page; > }; > > #define VMBUS_MAX_CHANNELS 64 > diff --git a/drivers/bus/vmbus/vmbus_channel.c b/drivers/bus/vmbus/vmbus_channel.c > index f6a76dcbb8..43c6c32d7e 100644 > --- a/drivers/bus/vmbus/vmbus_channel.c > +++ b/drivers/bus/vmbus/vmbus_channel.c > @@ -27,19 +27,7 @@ vmbus_sync_set_bit(volatile uint32_t *addr, uint32_t mask) > } > > static inline void > -vmbus_send_interrupt(const struct rte_vmbus_device *dev, uint32_t relid) > -{ > - uint32_t *int_addr; > - uint32_t int_mask; > - > - int_addr = dev->int_page + relid / 32; > - int_mask = 1u << (relid % 32); > - > - vmbus_sync_set_bit(int_addr, int_mask); > -} > - > -static inline void > -vmbus_set_monitor(const struct rte_vmbus_device *dev, uint32_t monitor_id) > +vmbus_set_monitor(const struct vmbus_channel *channel, uint32_t monitor_id) > { > uint32_t *monitor_addr, monitor_mask; > unsigned int trigger_index; > @@ -47,16 +35,14 @@ vmbus_set_monitor(const struct rte_vmbus_device *dev, uint32_t monitor_id) > trigger_index = monitor_id / HV_MON_TRIG_LEN; > monitor_mask = 1u << (monitor_id % HV_MON_TRIG_LEN); > > - monitor_addr = &dev->monitor_page->trigs[trigger_index].pending; > + monitor_addr = &channel->monitor_page->trigs[trigger_index].pending; > vmbus_sync_set_bit(monitor_addr, monitor_mask); > } > > static void > -vmbus_set_event(const struct rte_vmbus_device *dev, > - const struct vmbus_channel *chan) > +vmbus_set_event(const struct vmbus_channel *chan) > { > - vmbus_send_interrupt(dev, chan->relid); > - vmbus_set_monitor(dev, chan->monitor_id); > + vmbus_set_monitor(chan, chan->monitor_id); > } > > /* > @@ -94,7 +80,6 @@ rte_vmbus_set_latency(const struct rte_vmbus_device *dev, > void > rte_vmbus_chan_signal_tx(const struct vmbus_channel *chan) > { > - const struct rte_vmbus_device *dev = chan->device; > const struct vmbus_br *tbr = &chan->txbr; > > /* Make sure all updates are done before signaling host */ > @@ -104,7 +89,7 @@ rte_vmbus_chan_signal_tx(const struct vmbus_channel *chan) > if (tbr->vbr->imask) > return; > > - vmbus_set_event(dev, chan); > + vmbus_set_event(chan); > } > > > @@ -230,7 +215,7 @@ void rte_vmbus_chan_signal_read(struct vmbus_channel *chan, uint32_t bytes_read) > if (write_sz <= pending_sz) > return; > > - vmbus_set_event(chan->device, chan); > + vmbus_set_event(chan); > } > > int rte_vmbus_chan_recv(struct vmbus_channel *chan, void *data, uint32_t *len, > @@ -337,6 +322,7 @@ int vmbus_chan_create(const struct rte_vmbus_device *device, > chan->subchannel_id = subid; > chan->relid = relid; > chan->monitor_id = monitor_id; > + chan->monitor_page = device->monitor_page; > *new_chan = chan; > > err = vmbus_uio_map_rings(chan); > diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c > index 74a6c0ebb7..22f58fa62b 100644 > --- a/drivers/net/netvsc/hn_ethdev.c > +++ b/drivers/net/netvsc/hn_ethdev.c > @@ -955,8 +955,8 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev) > } > > hv->vmbus = vmbus; > - hv->rxbuf_res = &vmbus->resource[HV_RECV_BUF_MAP]; > - hv->chim_res = &vmbus->resource[HV_SEND_BUF_MAP]; > + hv->rxbuf_res = vmbus->resource[HV_RECV_BUF_MAP]; > + hv->chim_res = vmbus->resource[HV_SEND_BUF_MAP]; > hv->port_id = eth_dev->data->port_id; > hv->latency = HN_CHAN_LATENCY_NS; > hv->max_queues = 1; > diff --git a/drivers/net/netvsc/hn_nvs.c b/drivers/net/netvsc/hn_nvs.c > index 03b6cc1551..09f363cb9d 100644 > --- a/drivers/net/netvsc/hn_nvs.c > +++ b/drivers/net/netvsc/hn_nvs.c > @@ -193,11 +193,11 @@ hn_nvs_conn_rxbuf(struct hn_data *hv) > * Connect RXBUF to NVS. > */ > conn.type = NVS_TYPE_RXBUF_CONN; > - conn.gpadl = hv->rxbuf_res->phys_addr; > + conn.gpadl = hv->rxbuf_res.phys_addr; > conn.sig = NVS_RXBUF_SIG; > PMD_DRV_LOG(DEBUG, "connect rxbuff va=%p gpad=%#" PRIx64, > - hv->rxbuf_res->addr, > - hv->rxbuf_res->phys_addr); > + hv->rxbuf_res.addr, > + hv->rxbuf_res.phys_addr); > > error = hn_nvs_execute(hv, &conn, sizeof(conn), > &resp, sizeof(resp), > @@ -308,17 +308,17 @@ hn_nvs_conn_chim(struct hn_data *hv) > struct hn_nvs_chim_conn chim; > struct hn_nvs_chim_connresp resp; > uint32_t sectsz; > - unsigned long len = hv->chim_res->len; > + unsigned long len = hv->chim_res.len; > int error; > > /* Connect chimney sending buffer to NVS */ > memset(&chim, 0, sizeof(chim)); > chim.type = NVS_TYPE_CHIM_CONN; > - chim.gpadl = hv->chim_res->phys_addr; > + chim.gpadl = hv->chim_res.phys_addr; > chim.sig = NVS_CHIM_SIG; > PMD_DRV_LOG(DEBUG, "connect send buf va=%p gpad=%#" PRIx64, > - hv->chim_res->addr, > - hv->chim_res->phys_addr); > + hv->chim_res.addr, > + hv->chim_res.phys_addr); > > error = hn_nvs_execute(hv, &chim, sizeof(chim), > &resp, sizeof(resp), > diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c > index ece242f84b..8adf1525fd 100644 > --- a/drivers/net/netvsc/hn_rxtx.c > +++ b/drivers/net/netvsc/hn_rxtx.c > @@ -553,7 +553,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, > * Use refcount to handle multiple packets in same > * receive buffer section. > */ > - rxbuf = hv->rxbuf_res->addr; > + rxbuf = hv->rxbuf_res.addr; > iova = rte_mem_virt2iova(rxbuf) + RTE_PTR_DIFF(data, rxbuf); > shinfo = &rxb->shinfo; > > @@ -730,8 +730,8 @@ hn_nvs_handle_rxbuf(struct rte_eth_dev *dev, > { > const struct vmbus_chanpkt_rxbuf *pkt; > const struct hn_nvs_hdr *nvs_hdr = buf; > - uint32_t rxbuf_sz = hv->rxbuf_res->len; > - char *rxbuf = hv->rxbuf_res->addr; > + uint32_t rxbuf_sz = hv->rxbuf_res.len; > + char *rxbuf = hv->rxbuf_res.addr; > unsigned int i, hlen, count; > struct hn_rx_bufinfo *rxb; > > @@ -1180,7 +1180,7 @@ hn_try_txagg(struct hn_data *hv, struct hn_tx_queue *txq, > if (txd->chim_index == NVS_CHIM_IDX_INVALID) > return NULL; > > - chim = (uint8_t *)hv->chim_res->addr > + chim = (uint8_t *)hv->chim_res.addr > + txd->chim_index * hv->chim_szmax; > > txq->agg_txd = txd; > diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h > index 9814113a0c..66cb084a51 100644 > --- a/drivers/net/netvsc/hn_var.h > +++ b/drivers/net/netvsc/hn_var.h > @@ -113,14 +113,14 @@ struct hn_data { > uint32_t link_status; > uint32_t link_speed; > > - struct rte_mem_resource *rxbuf_res; /* UIO resource for Rx */ > + struct rte_mem_resource rxbuf_res; /* UIO resource for Rx */ > uint32_t rxbuf_section_cnt; /* # of Rx sections */ > uint16_t max_queues; /* Max available queues */ > uint16_t num_queues; > uint64_t rss_offloads; > > rte_spinlock_t chim_lock; > - struct rte_mem_resource *chim_res; /* UIO resource for Tx */ > + struct rte_mem_resource chim_res; /* UIO resource for Tx */ > struct rte_bitmap *chim_bmap; /* Send buffer map */ > void *chim_bmem; > uint32_t chim_szmax; /* Max size per buffer */ > -- > 2.17.1 > -- Christian Ehrhardt Senior Staff Engineer, Ubuntu Server Canonical Ltd