netmap: vtnet: fix RX initialization after netmap_reset()

At device reset, we must not publish those netmap receive buffers
that are owned by userspace (nm_kr_rxspace).

MFC after:	1 week
This commit is contained in:
Vincenzo Maffione 2021-01-11 21:38:32 +00:00
parent 21f749da82
commit 3005e10ddb

View File

@ -213,20 +213,25 @@ vtnet_netmap_rxq_populate(struct vtnet_rxq *rxq)
struct netmap_kring *kring;
struct netmap_slot *slot;
int error;
int num;
slot = netmap_reset(na, NR_RX, rxq->vtnrx_id, 0);
if (slot == NULL)
return -1;
kring = na->rx_rings[rxq->vtnrx_id];
/* Expose all the RX netmap buffers we can. In case of no indirect
/*
* Expose all the RX netmap buffers we can. In case of no indirect
* buffers, the number of netmap slots in the RX ring matches the
* maximum number of 2-elements sglist that the RX virtqueue can
* accommodate. We need to start from kring->nr_hwcur, which is 0
* on netmap register and may be different from 0 if a virtio
* re-init happens while the device is in use by netmap. */
rxq->vtnrx_nm_refill = kring->nr_hwcur;
error = vtnet_netmap_kring_refill(kring, na->num_rx_desc - 1);
* accommodate. We need to start from kring->nr_hwtail, which is 0
* on the first netmap register and may be different from 0 if a
* virtio re-init (caused by a netma register or i.e., ifconfig)
* happens while the device is in use by netmap.
*/
rxq->vtnrx_nm_refill = kring->nr_hwtail;
num = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
error = vtnet_netmap_kring_refill(kring, num);
virtqueue_notify(rxq->vtnrx_vq);
return error;
@ -256,7 +261,7 @@ vtnet_netmap_rxsync(struct netmap_kring *kring, int flags)
* First part: import newly received packets.
* Only accept our own buffers (matching the token). We should only get
* matching buffers. The hwtail should never overrun hwcur, because
* we publish only N-1 receive buffers (and non N).
* we publish only N-1 receive buffers (and not N).
* In any case we must not leave this routine with the interrupts
* disabled, pending packets in the VQ and hwtail == (hwcur - 1),
* otherwise the pending packets could stall.