Commit 3a403076 authored by Jason Wang's avatar Jason Wang Committed by David S. Miller

vhost_net: examine pointer types during un-producing

After commit fc72d1d5 ("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: fc72d1d5 ("tuntap: XDP transmission")
Reported-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 303fd71b
...@@ -655,7 +655,7 @@ static struct tun_struct *tun_enable_queue(struct tun_file *tfile) ...@@ -655,7 +655,7 @@ static struct tun_struct *tun_enable_queue(struct tun_file *tfile)
return tun; return tun;
} }
static void tun_ptr_free(void *ptr) void tun_ptr_free(void *ptr)
{ {
if (!ptr) if (!ptr)
return; return;
...@@ -667,6 +667,7 @@ static void tun_ptr_free(void *ptr) ...@@ -667,6 +667,7 @@ static void tun_ptr_free(void *ptr)
__skb_array_destroy_skb(ptr); __skb_array_destroy_skb(ptr);
} }
} }
EXPORT_SYMBOL_GPL(tun_ptr_free);
static void tun_queue_purge(struct tun_file *tfile) static void tun_queue_purge(struct tun_file *tfile)
{ {
......
...@@ -170,7 +170,7 @@ static void vhost_net_buf_unproduce(struct vhost_net_virtqueue *nvq) ...@@ -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)) { if (nvq->rx_ring && !vhost_net_buf_is_empty(rxq)) {
ptr_ring_unconsume(nvq->rx_ring, rxq->queue + rxq->head, ptr_ring_unconsume(nvq->rx_ring, rxq->queue + rxq->head,
vhost_net_buf_get_size(rxq), vhost_net_buf_get_size(rxq),
__skb_array_destroy_skb); tun_ptr_free);
rxq->head = rxq->tail = 0; rxq->head = rxq->tail = 0;
} }
} }
......
...@@ -25,6 +25,7 @@ struct ptr_ring *tun_get_tx_ring(struct file *file); ...@@ -25,6 +25,7 @@ struct ptr_ring *tun_get_tx_ring(struct file *file);
bool tun_is_xdp_buff(void *ptr); bool tun_is_xdp_buff(void *ptr);
void *tun_xdp_to_ptr(void *ptr); void *tun_xdp_to_ptr(void *ptr);
void *tun_ptr_to_xdp(void *ptr); void *tun_ptr_to_xdp(void *ptr);
void tun_ptr_free(void *ptr);
#else #else
#include <linux/err.h> #include <linux/err.h>
#include <linux/errno.h> #include <linux/errno.h>
...@@ -50,5 +51,8 @@ static inline void *tun_ptr_to_xdp(void *ptr) ...@@ -50,5 +51,8 @@ static inline void *tun_ptr_to_xdp(void *ptr)
{ {
return NULL; return NULL;
} }
static inline void tun_ptr_free(void *ptr)
{
}
#endif /* CONFIG_TUN */ #endif /* CONFIG_TUN */
#endif /* __IF_TUN_H */ #endif /* __IF_TUN_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment