tun/tap: use ptr_ring instead of skb_array
This patch switches to use ptr_ring instead of skb_array. This will be used to enqueue different types of pointers by encoding type into lower bits. Signed-off-by: Jason Wang <jasowang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
a0ce093180
commit
5990a30510
@@ -89,7 +89,7 @@ struct vhost_net_ubuf_ref {
|
||||
|
||||
#define VHOST_RX_BATCH 64
|
||||
struct vhost_net_buf {
|
||||
struct sk_buff **queue;
|
||||
void **queue;
|
||||
int tail;
|
||||
int head;
|
||||
};
|
||||
@@ -108,7 +108,7 @@ struct vhost_net_virtqueue {
|
||||
/* Reference counting for outstanding ubufs.
|
||||
* Protected by vq mutex. Writers must also take device mutex. */
|
||||
struct vhost_net_ubuf_ref *ubufs;
|
||||
struct skb_array *rx_array;
|
||||
struct ptr_ring *rx_ring;
|
||||
struct vhost_net_buf rxq;
|
||||
};
|
||||
|
||||
@@ -158,7 +158,7 @@ static int vhost_net_buf_produce(struct vhost_net_virtqueue *nvq)
|
||||
struct vhost_net_buf *rxq = &nvq->rxq;
|
||||
|
||||
rxq->head = 0;
|
||||
rxq->tail = skb_array_consume_batched(nvq->rx_array, rxq->queue,
|
||||
rxq->tail = ptr_ring_consume_batched(nvq->rx_ring, rxq->queue,
|
||||
VHOST_RX_BATCH);
|
||||
return rxq->tail;
|
||||
}
|
||||
@@ -167,9 +167,10 @@ static void vhost_net_buf_unproduce(struct vhost_net_virtqueue *nvq)
|
||||
{
|
||||
struct vhost_net_buf *rxq = &nvq->rxq;
|
||||
|
||||
if (nvq->rx_array && !vhost_net_buf_is_empty(rxq)) {
|
||||
skb_array_unconsume(nvq->rx_array, rxq->queue + rxq->head,
|
||||
vhost_net_buf_get_size(rxq));
|
||||
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);
|
||||
rxq->head = rxq->tail = 0;
|
||||
}
|
||||
}
|
||||
@@ -583,7 +584,7 @@ static int peek_head_len(struct vhost_net_virtqueue *rvq, struct sock *sk)
|
||||
int len = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (rvq->rx_array)
|
||||
if (rvq->rx_ring)
|
||||
return vhost_net_buf_peek(rvq);
|
||||
|
||||
spin_lock_irqsave(&sk->sk_receive_queue.lock, flags);
|
||||
@@ -790,7 +791,7 @@ static void handle_rx(struct vhost_net *net)
|
||||
* they refilled. */
|
||||
goto out;
|
||||
}
|
||||
if (nvq->rx_array)
|
||||
if (nvq->rx_ring)
|
||||
msg.msg_control = vhost_net_buf_consume(&nvq->rxq);
|
||||
/* On overrun, truncate and discard */
|
||||
if (unlikely(headcount > UIO_MAXIOV)) {
|
||||
@@ -896,7 +897,7 @@ static int vhost_net_open(struct inode *inode, struct file *f)
|
||||
struct vhost_net *n;
|
||||
struct vhost_dev *dev;
|
||||
struct vhost_virtqueue **vqs;
|
||||
struct sk_buff **queue;
|
||||
void **queue;
|
||||
int i;
|
||||
|
||||
n = kvmalloc(sizeof *n, GFP_KERNEL | __GFP_RETRY_MAYFAIL);
|
||||
@@ -908,7 +909,7 @@ static int vhost_net_open(struct inode *inode, struct file *f)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
queue = kmalloc_array(VHOST_RX_BATCH, sizeof(struct sk_buff *),
|
||||
queue = kmalloc_array(VHOST_RX_BATCH, sizeof(void *),
|
||||
GFP_KERNEL);
|
||||
if (!queue) {
|
||||
kfree(vqs);
|
||||
@@ -1046,23 +1047,23 @@ err:
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
static struct skb_array *get_tap_skb_array(int fd)
|
||||
static struct ptr_ring *get_tap_ptr_ring(int fd)
|
||||
{
|
||||
struct skb_array *array;
|
||||
struct ptr_ring *ring;
|
||||
struct file *file = fget(fd);
|
||||
|
||||
if (!file)
|
||||
return NULL;
|
||||
array = tun_get_skb_array(file);
|
||||
if (!IS_ERR(array))
|
||||
ring = tun_get_tx_ring(file);
|
||||
if (!IS_ERR(ring))
|
||||
goto out;
|
||||
array = tap_get_skb_array(file);
|
||||
if (!IS_ERR(array))
|
||||
ring = tap_get_ptr_ring(file);
|
||||
if (!IS_ERR(ring))
|
||||
goto out;
|
||||
array = NULL;
|
||||
ring = NULL;
|
||||
out:
|
||||
fput(file);
|
||||
return array;
|
||||
return ring;
|
||||
}
|
||||
|
||||
static struct socket *get_tap_socket(int fd)
|
||||
@@ -1143,7 +1144,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
|
||||
vq->private_data = sock;
|
||||
vhost_net_buf_unproduce(nvq);
|
||||
if (index == VHOST_NET_VQ_RX)
|
||||
nvq->rx_array = get_tap_skb_array(fd);
|
||||
nvq->rx_ring = get_tap_ptr_ring(fd);
|
||||
r = vhost_vq_init_access(vq);
|
||||
if (r)
|
||||
goto err_used;
|
||||
|
Reference in New Issue
Block a user