diff options
author | Jason Wang <jasowang@redhat.com> | 2018-03-09 14:50:34 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-03-09 12:02:59 -0500 |
commit | 3a4030761ea88ff439030ca98e3094b9900e96b7 (patch) | |
tree | c0d48a1da4ce356c2ce2037ba1b4fc210abba7e6 /drivers | |
parent | 303fd71b37fb710b26f5ff5444029d62cfd627bd (diff) | |
download | linux-stable-3a4030761ea88ff439030ca98e3094b9900e96b7.tar.gz linux-stable-3a4030761ea88ff439030ca98e3094b9900e96b7.tar.bz2 linux-stable-3a4030761ea88ff439030ca98e3094b9900e96b7.zip |
vhost_net: examine pointer types during un-producing
After commit fc72d1d54dd9 ("tuntap: XDP transmission"), we can
actually queueing XDP pointers in the pointer ring, so we should
examine the pointer type before freeing the pointer.
Fixes: fc72d1d54dd9 ("tuntap: XDP transmission")
Reported-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/tun.c | 3 | ||||
-rw-r--r-- | drivers/vhost/net.c | 2 |
2 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 7433bb2e4451..28cfa642e39a 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -655,7 +655,7 @@ static struct tun_struct *tun_enable_queue(struct tun_file *tfile) return tun; } -static void tun_ptr_free(void *ptr) +void tun_ptr_free(void *ptr) { if (!ptr) return; @@ -667,6 +667,7 @@ static void tun_ptr_free(void *ptr) __skb_array_destroy_skb(ptr); } } +EXPORT_SYMBOL_GPL(tun_ptr_free); static void tun_queue_purge(struct tun_file *tfile) { diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index efb93063fda1..8139bc70ad7d 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -170,7 +170,7 @@ static void vhost_net_buf_unproduce(struct vhost_net_virtqueue *nvq) if (nvq->rx_ring && !vhost_net_buf_is_empty(rxq)) { ptr_ring_unconsume(nvq->rx_ring, rxq->queue + rxq->head, vhost_net_buf_get_size(rxq), - __skb_array_destroy_skb); + tun_ptr_free); rxq->head = rxq->tail = 0; } } |