* [PATCH] net/netvsc: replace the pointers to vmbus device from secondary process
@ 2022-06-29 23:29 longli
2022-06-29 23:52 ` Stephen Hemminger
0 siblings, 1 reply; 3+ messages in thread
From: longli @ 2022-06-29 23:29 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev, Long Li, stable
From: Long Li <longli@microsoft.com>
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 <longli@microsoft.com>
---
drivers/bus/vmbus/private.h | 2 ++
drivers/bus/vmbus/vmbus_channel.c | 15 +++++++--------
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(+), 23 deletions(-)
diff --git a/drivers/bus/vmbus/private.h b/drivers/bus/vmbus/private.h
index 1bca147e12..658303bc27 100644
--- a/drivers/bus/vmbus/private.h
+++ b/drivers/bus/vmbus/private.h
@@ -74,6 +74,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 119b9b367e..9bd01679c3 100644
--- a/drivers/bus/vmbus/vmbus_channel.c
+++ b/drivers/bus/vmbus/vmbus_channel.c
@@ -27,7 +27,7 @@ vmbus_sync_set_bit(volatile uint32_t *addr, uint32_t 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;
@@ -35,15 +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_set_monitor(dev, chan->monitor_id);
+ vmbus_set_monitor(chan, chan->monitor_id);
}
/*
@@ -81,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 */
@@ -91,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);
}
@@ -218,7 +216,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,
@@ -325,6 +323,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 a6202d898b..9af630136a 100644
--- a/drivers/net/netvsc/hn_ethdev.c
+++ b/drivers/net/netvsc/hn_ethdev.c
@@ -1169,8 +1169,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->rx_copybreak = HN_RXCOPY_THRESHOLD;
diff --git a/drivers/net/netvsc/hn_nvs.c b/drivers/net/netvsc/hn_nvs.c
index 89dbba6cd9..6434439c46 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 34f40be5b8..96f79bf928 100644
--- a/drivers/net/netvsc/hn_rxtx.c
+++ b/drivers/net/netvsc/hn_rxtx.c
@@ -582,7 +582,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;
@@ -765,8 +765,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;
@@ -1266,7 +1266,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 416c042a27..98a3b83033 100644
--- a/drivers/net/netvsc/hn_var.h
+++ b/drivers/net/netvsc/hn_var.h
@@ -147,7 +147,7 @@ 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 */
uint32_t rx_copybreak;
uint32_t rx_extmbuf_enable;
@@ -156,7 +156,7 @@ struct hn_data {
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 tx_copybreak;
--
2.17.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] net/netvsc: replace the pointers to vmbus device from secondary process
2022-06-29 23:29 [PATCH] net/netvsc: replace the pointers to vmbus device from secondary process longli
@ 2022-06-29 23:52 ` Stephen Hemminger
2022-06-30 12:53 ` Ferruh Yigit
0 siblings, 1 reply; 3+ messages in thread
From: Stephen Hemminger @ 2022-06-29 23:52 UTC (permalink / raw)
To: longli; +Cc: longli, Stephen Hemminger, dev, stable
On Wed, 29 Jun 2022 16:29:44 -0700
longli@linuxonhyperv.com wrote:
> From: Long Li <longli@microsoft.com>
>
> 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 <longli@microsoft.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] net/netvsc: replace the pointers to vmbus device from secondary process
2022-06-29 23:52 ` Stephen Hemminger
@ 2022-06-30 12:53 ` Ferruh Yigit
0 siblings, 0 replies; 3+ messages in thread
From: Ferruh Yigit @ 2022-06-30 12:53 UTC (permalink / raw)
To: Stephen Hemminger, longli; +Cc: longli, Stephen Hemminger, dev, stable
On 6/30/2022 12:52 AM, Stephen Hemminger wrote:
> On Wed, 29 Jun 2022 16:29:44 -0700
> longli@linuxonhyperv.com wrote:
>
>> From: Long Li <longli@microsoft.com>
>>
>> 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 <longli@microsoft.com>
>
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Applied to dpdk-next-net/main, thanks.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-06-30 12:53 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-29 23:29 [PATCH] net/netvsc: replace the pointers to vmbus device from secondary process longli
2022-06-29 23:52 ` Stephen Hemminger
2022-06-30 12:53 ` Ferruh Yigit
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).