All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] vhost and vhost-net cleanups
@ 2013-05-03  6:25 Asias He
  2013-05-03  6:25 ` [PATCH 1/4] vhost: Remove comments for hdr in vhost.h Asias He
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Asias He @ 2013-05-03  6:25 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: kvm, virtualization, target-devel

Asias He (4):
  vhost: Remove comments for hdr in vhost.h
  vhost: Simplify dev->vqs[i] access
  vhost-net: Free ubuf when vhost_dev_ioctl fails
  vhost-net: Cleanup vhost_ubuf adn vhost_zcopy

 drivers/vhost/net.c   | 76 +++++++++++++++++++++++++++++++--------------------
 drivers/vhost/vhost.c | 35 ++++++++++++------------
 drivers/vhost/vhost.h |  3 --
 3 files changed, 65 insertions(+), 49 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/4] vhost: Remove comments for hdr in vhost.h
  2013-05-03  6:25 [PATCH 0/4] vhost and vhost-net cleanups Asias He
@ 2013-05-03  6:25 ` Asias He
  2013-05-03  6:25 ` [PATCH 2/4] vhost: Simplify dev->vqs[i] access Asias He
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Asias He @ 2013-05-03  6:25 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: kvm, virtualization, target-devel

It is supposed to be removed when hdr is moved into vhost_net_virtqueue.

Signed-off-by: Asias He <asias@redhat.com>
---
 drivers/vhost/vhost.h | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
index 6fefebf..f9045b4 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -101,9 +101,6 @@ struct vhost_virtqueue {
 	u64 log_addr;
 
 	struct iovec iov[UIO_MAXIOV];
-	/* hdr is used to store the virtio header.
-	 * Since each iovec has >= 1 byte length, we never need more than
-	 * header length entries to store the header. */
 	struct iovec *indirect;
 	struct vring_used_elem *heads;
 	/* We use a kind of RCU to access private pointer.
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/4] vhost: Simplify dev->vqs[i] access
  2013-05-03  6:25 [PATCH 0/4] vhost and vhost-net cleanups Asias He
  2013-05-03  6:25 ` [PATCH 1/4] vhost: Remove comments for hdr in vhost.h Asias He
@ 2013-05-03  6:25 ` Asias He
  2013-05-03  6:25 ` [PATCH 3/4] vhost-net: Free ubuf when vhost_dev_ioctl fails Asias He
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Asias He @ 2013-05-03  6:25 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: kvm, virtualization, target-devel

Signed-off-by: Asias He <asias@redhat.com>
---
 drivers/vhost/vhost.c | 35 ++++++++++++++++++-----------------
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 73100fe..0003bab 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -260,17 +260,16 @@ static void vhost_vq_free_iovecs(struct vhost_virtqueue *vq)
 /* Helper to allocate iovec buffers for all vqs. */
 static long vhost_dev_alloc_iovecs(struct vhost_dev *dev)
 {
+	struct vhost_virtqueue *vq;
 	int i;
 
 	for (i = 0; i < dev->nvqs; ++i) {
-		dev->vqs[i]->indirect = kmalloc(sizeof *dev->vqs[i]->indirect *
-					       UIO_MAXIOV, GFP_KERNEL);
-		dev->vqs[i]->log = kmalloc(sizeof *dev->vqs[i]->log * UIO_MAXIOV,
-					  GFP_KERNEL);
-		dev->vqs[i]->heads = kmalloc(sizeof *dev->vqs[i]->heads *
-					    UIO_MAXIOV, GFP_KERNEL);
-		if (!dev->vqs[i]->indirect || !dev->vqs[i]->log ||
-			!dev->vqs[i]->heads)
+		vq = dev->vqs[i];
+		vq->indirect = kmalloc(sizeof *vq->indirect * UIO_MAXIOV,
+				       GFP_KERNEL);
+		vq->log = kmalloc(sizeof *vq->log * UIO_MAXIOV, GFP_KERNEL);
+		vq->heads = kmalloc(sizeof *vq->heads * UIO_MAXIOV, GFP_KERNEL);
+		if (!vq->indirect || !vq->log || !vq->heads)
 			goto err_nomem;
 	}
 	return 0;
@@ -292,6 +291,7 @@ static void vhost_dev_free_iovecs(struct vhost_dev *dev)
 long vhost_dev_init(struct vhost_dev *dev,
 		    struct vhost_virtqueue **vqs, int nvqs)
 {
+	struct vhost_virtqueue *vq;
 	int i;
 
 	dev->vqs = vqs;
@@ -306,15 +306,16 @@ long vhost_dev_init(struct vhost_dev *dev,
 	dev->worker = NULL;
 
 	for (i = 0; i < dev->nvqs; ++i) {
-		dev->vqs[i]->log = NULL;
-		dev->vqs[i]->indirect = NULL;
-		dev->vqs[i]->heads = NULL;
-		dev->vqs[i]->dev = dev;
-		mutex_init(&dev->vqs[i]->mutex);
-		vhost_vq_reset(dev, dev->vqs[i]);
-		if (dev->vqs[i]->handle_kick)
-			vhost_poll_init(&dev->vqs[i]->poll,
-					dev->vqs[i]->handle_kick, POLLIN, dev);
+		vq = dev->vqs[i];
+		vq->log = NULL;
+		vq->indirect = NULL;
+		vq->heads = NULL;
+		vq->dev = dev;
+		mutex_init(&vq->mutex);
+		vhost_vq_reset(dev, vq);
+		if (vq->handle_kick)
+			vhost_poll_init(&vq->poll, vq->handle_kick,
+					POLLIN, dev);
 	}
 
 	return 0;
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/4] vhost-net: Free ubuf when vhost_dev_ioctl fails
  2013-05-03  6:25 [PATCH 0/4] vhost and vhost-net cleanups Asias He
  2013-05-03  6:25 ` [PATCH 1/4] vhost: Remove comments for hdr in vhost.h Asias He
  2013-05-03  6:25 ` [PATCH 2/4] vhost: Simplify dev->vqs[i] access Asias He
@ 2013-05-03  6:25 ` Asias He
  2013-05-05 13:50   ` Michael S. Tsirkin
  2013-05-03  6:25 ` [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy Asias He
  2013-05-03  6:25 ` Asias He
  4 siblings, 1 reply; 11+ messages in thread
From: Asias He @ 2013-05-03  6:25 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: kvm, virtualization, target-devel

Free ubuf when vhost_dev_ioctl for VHOST_SET_OWNER fails.

Signed-off-by: Asias He <asias@redhat.com>
---
 drivers/vhost/net.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index b2f6b41..eb73217 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -152,6 +152,19 @@ void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs)
 	kfree(ubufs);
 }
 
+static void vhost_net_clear_ubuf_info(struct vhost_net *n)
+{
+
+	bool zcopy;
+	int i;
+
+	for (i = 0; i < n->dev.nvqs; ++i) {
+		zcopy = vhost_zcopy_mask & (0x1 << i);
+		if (zcopy)
+			kfree(n->vqs[i].ubuf_info);
+	}
+}
+
 int vhost_net_set_ubuf_info(struct vhost_net *n)
 {
 	bool zcopy;
@@ -1069,10 +1082,13 @@ static long vhost_net_ioctl(struct file *f, unsigned int ioctl,
 				goto out;
 		}
 		r = vhost_dev_ioctl(&n->dev, ioctl, argp);
-		if (r == -ENOIOCTLCMD)
+		if (r == -ENOIOCTLCMD) {
 			r = vhost_vring_ioctl(&n->dev, ioctl, argp);
-		else
+		} else {
+			if (r < 0 && ioctl == VHOST_SET_OWNER)
+				vhost_net_clear_ubuf_info(n);
 			vhost_net_flush(n);
+		}
 out:
 		mutex_unlock(&n->dev.mutex);
 		return r;
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy
  2013-05-03  6:25 [PATCH 0/4] vhost and vhost-net cleanups Asias He
                   ` (2 preceding siblings ...)
  2013-05-03  6:25 ` [PATCH 3/4] vhost-net: Free ubuf when vhost_dev_ioctl fails Asias He
@ 2013-05-03  6:25 ` Asias He
  2013-05-06  8:17   ` Michael S. Tsirkin
  2013-05-03  6:25 ` Asias He
  4 siblings, 1 reply; 11+ messages in thread
From: Asias He @ 2013-05-03  6:25 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Nicholas Bellinger, Rusty Russell, kvm, virtualization,
	target-devel, Asias He

- Rename vhost_ubuf to vhost_net_ubuf
- Rename vhost_zcopy_mask to vhost_net_zcopy_mask
- Make funcs static

Signed-off-by: Asias He <asias@redhat.com>
---
 drivers/vhost/net.c | 58 +++++++++++++++++++++++++++--------------------------
 1 file changed, 30 insertions(+), 28 deletions(-)

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index eb73217..4548c0b 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -70,7 +70,7 @@ enum {
 	VHOST_NET_VQ_MAX = 2,
 };
 
-struct vhost_ubuf_ref {
+struct vhost_net_ubuf_ref {
 	struct kref kref;
 	wait_queue_head_t wait;
 	struct vhost_virtqueue *vq;
@@ -93,7 +93,7 @@ struct vhost_net_virtqueue {
 	struct ubuf_info *ubuf_info;
 	/* Reference counting for outstanding ubufs.
 	 * Protected by vq mutex. Writers must also take device mutex. */
-	struct vhost_ubuf_ref *ubufs;
+	struct vhost_net_ubuf_ref *ubufs;
 };
 
 struct vhost_net {
@@ -110,24 +110,25 @@ struct vhost_net {
 	bool tx_flush;
 };
 
-static unsigned vhost_zcopy_mask __read_mostly;
+static unsigned vhost_net_zcopy_mask __read_mostly;
 
-void vhost_enable_zcopy(int vq)
+static void vhost_net_enable_zcopy(int vq)
 {
-	vhost_zcopy_mask |= 0x1 << vq;
+	vhost_net_zcopy_mask |= 0x1 << vq;
 }
 
-static void vhost_zerocopy_done_signal(struct kref *kref)
+static void vhost_net_zerocopy_done_signal(struct kref *kref)
 {
-	struct vhost_ubuf_ref *ubufs = container_of(kref, struct vhost_ubuf_ref,
-						    kref);
+	struct vhost_net_ubuf_ref *ubufs;
+
+	ubufs = container_of(kref, struct vhost_net_ubuf_ref, kref);
 	wake_up(&ubufs->wait);
 }
 
-struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
-					bool zcopy)
+static struct vhost_net_ubuf_ref *
+vhost_net_ubuf_alloc(struct vhost_virtqueue *vq, bool zcopy)
 {
-	struct vhost_ubuf_ref *ubufs;
+	struct vhost_net_ubuf_ref *ubufs;
 	/* No zero copy backend? Nothing to count. */
 	if (!zcopy)
 		return NULL;
@@ -140,14 +141,14 @@ struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
 	return ubufs;
 }
 
-void vhost_ubuf_put(struct vhost_ubuf_ref *ubufs)
+static void vhost_net_ubuf_put(struct vhost_net_ubuf_ref *ubufs)
 {
-	kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
+	kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
 }
 
-void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs)
+static void vhost_net_ubuf_put_and_wait(struct vhost_net_ubuf_ref *ubufs)
 {
-	kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
+	kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
 	wait_event(ubufs->wait, !atomic_read(&ubufs->kref.refcount));
 	kfree(ubufs);
 }
@@ -159,7 +160,7 @@ static void vhost_net_clear_ubuf_info(struct vhost_net *n)
 	int i;
 
 	for (i = 0; i < n->dev.nvqs; ++i) {
-		zcopy = vhost_zcopy_mask & (0x1 << i);
+		zcopy = vhost_net_zcopy_mask & (0x1 << i);
 		if (zcopy)
 			kfree(n->vqs[i].ubuf_info);
 	}
@@ -171,7 +172,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
 	int i;
 
 	for (i = 0; i < n->dev.nvqs; ++i) {
-		zcopy = vhost_zcopy_mask & (0x1 << i);
+		zcopy = vhost_net_zcopy_mask & (0x1 << i);
 		if (!zcopy)
 			continue;
 		n->vqs[i].ubuf_info = kmalloc(sizeof(*n->vqs[i].ubuf_info) *
@@ -183,7 +184,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
 
 err:
 	while (i--) {
-		zcopy = vhost_zcopy_mask & (0x1 << i);
+		zcopy = vhost_net_zcopy_mask & (0x1 << i);
 		if (!zcopy)
 			continue;
 		kfree(n->vqs[i].ubuf_info);
@@ -305,7 +306,7 @@ static int vhost_zerocopy_signal_used(struct vhost_net *net,
 
 static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
 {
-	struct vhost_ubuf_ref *ubufs = ubuf->ctx;
+	struct vhost_net_ubuf_ref *ubufs = ubuf->ctx;
 	struct vhost_virtqueue *vq = ubufs->vq;
 	int cnt = atomic_read(&ubufs->kref.refcount);
 
@@ -322,7 +323,7 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
 	/* set len to mark this desc buffers done DMA */
 	vq->heads[ubuf->desc].len = success ?
 		VHOST_DMA_DONE_LEN : VHOST_DMA_FAILED_LEN;
-	vhost_ubuf_put(ubufs);
+	vhost_net_ubuf_put(ubufs);
 }
 
 /* Expects to be always run from workqueue - which acts as
@@ -345,7 +346,7 @@ static void handle_tx(struct vhost_net *net)
 	int err;
 	size_t hdr_size;
 	struct socket *sock;
-	struct vhost_ubuf_ref *uninitialized_var(ubufs);
+	struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
 	bool zcopy, zcopy_used;
 
 	/* TODO: check that we are running from vhost_worker? */
@@ -441,7 +442,7 @@ static void handle_tx(struct vhost_net *net)
 		if (unlikely(err < 0)) {
 			if (zcopy_used) {
 				if (ubufs)
-					vhost_ubuf_put(ubufs);
+					vhost_net_ubuf_put(ubufs);
 				nvq->upend_idx = ((unsigned)nvq->upend_idx - 1)
 					% UIO_MAXIOV;
 			}
@@ -795,7 +796,7 @@ static void vhost_net_flush(struct vhost_net *n)
 		n->tx_flush = true;
 		mutex_unlock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
 		/* Wait for all lower device DMAs done. */
-		vhost_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
+		vhost_net_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
 		mutex_lock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
 		n->tx_flush = false;
 		kref_init(&n->vqs[VHOST_NET_VQ_TX].ubufs->kref);
@@ -896,7 +897,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
 	struct socket *sock, *oldsock;
 	struct vhost_virtqueue *vq;
 	struct vhost_net_virtqueue *nvq;
-	struct vhost_ubuf_ref *ubufs, *oldubufs = NULL;
+	struct vhost_net_ubuf_ref *ubufs, *oldubufs = NULL;
 	int r;
 
 	mutex_lock(&n->dev.mutex);
@@ -927,7 +928,8 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
 	oldsock = rcu_dereference_protected(vq->private_data,
 					    lockdep_is_held(&vq->mutex));
 	if (sock != oldsock) {
-		ubufs = vhost_ubuf_alloc(vq, sock && vhost_sock_zcopy(sock));
+		ubufs = vhost_net_ubuf_alloc(vq,
+					     sock && vhost_sock_zcopy(sock));
 		if (IS_ERR(ubufs)) {
 			r = PTR_ERR(ubufs);
 			goto err_ubufs;
@@ -953,7 +955,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
 	mutex_unlock(&vq->mutex);
 
 	if (oldubufs) {
-		vhost_ubuf_put_and_wait(oldubufs);
+		vhost_net_ubuf_put_and_wait(oldubufs);
 		mutex_lock(&vq->mutex);
 		vhost_zerocopy_signal_used(n, vq);
 		mutex_unlock(&vq->mutex);
@@ -971,7 +973,7 @@ err_used:
 	rcu_assign_pointer(vq->private_data, oldsock);
 	vhost_net_enable_vq(n, vq);
 	if (ubufs)
-		vhost_ubuf_put_and_wait(ubufs);
+		vhost_net_ubuf_put_and_wait(ubufs);
 err_ubufs:
 	fput(sock->file);
 err_vq:
@@ -1123,7 +1125,7 @@ static struct miscdevice vhost_net_misc = {
 static int vhost_net_init(void)
 {
 	if (experimental_zcopytx)
-		vhost_enable_zcopy(VHOST_NET_VQ_TX);
+		vhost_net_enable_zcopy(VHOST_NET_VQ_TX);
 	return misc_register(&vhost_net_misc);
 }
 module_init(vhost_net_init);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy
  2013-05-03  6:25 [PATCH 0/4] vhost and vhost-net cleanups Asias He
                   ` (3 preceding siblings ...)
  2013-05-03  6:25 ` [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy Asias He
@ 2013-05-03  6:25 ` Asias He
  4 siblings, 0 replies; 11+ messages in thread
From: Asias He @ 2013-05-03  6:25 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: kvm, virtualization, target-devel

- Rename vhost_ubuf to vhost_net_ubuf
- Rename vhost_zcopy_mask to vhost_net_zcopy_mask
- Make funcs static

Signed-off-by: Asias He <asias@redhat.com>
---
 drivers/vhost/net.c | 58 +++++++++++++++++++++++++++--------------------------
 1 file changed, 30 insertions(+), 28 deletions(-)

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index eb73217..4548c0b 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -70,7 +70,7 @@ enum {
 	VHOST_NET_VQ_MAX = 2,
 };
 
-struct vhost_ubuf_ref {
+struct vhost_net_ubuf_ref {
 	struct kref kref;
 	wait_queue_head_t wait;
 	struct vhost_virtqueue *vq;
@@ -93,7 +93,7 @@ struct vhost_net_virtqueue {
 	struct ubuf_info *ubuf_info;
 	/* Reference counting for outstanding ubufs.
 	 * Protected by vq mutex. Writers must also take device mutex. */
-	struct vhost_ubuf_ref *ubufs;
+	struct vhost_net_ubuf_ref *ubufs;
 };
 
 struct vhost_net {
@@ -110,24 +110,25 @@ struct vhost_net {
 	bool tx_flush;
 };
 
-static unsigned vhost_zcopy_mask __read_mostly;
+static unsigned vhost_net_zcopy_mask __read_mostly;
 
-void vhost_enable_zcopy(int vq)
+static void vhost_net_enable_zcopy(int vq)
 {
-	vhost_zcopy_mask |= 0x1 << vq;
+	vhost_net_zcopy_mask |= 0x1 << vq;
 }
 
-static void vhost_zerocopy_done_signal(struct kref *kref)
+static void vhost_net_zerocopy_done_signal(struct kref *kref)
 {
-	struct vhost_ubuf_ref *ubufs = container_of(kref, struct vhost_ubuf_ref,
-						    kref);
+	struct vhost_net_ubuf_ref *ubufs;
+
+	ubufs = container_of(kref, struct vhost_net_ubuf_ref, kref);
 	wake_up(&ubufs->wait);
 }
 
-struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
-					bool zcopy)
+static struct vhost_net_ubuf_ref *
+vhost_net_ubuf_alloc(struct vhost_virtqueue *vq, bool zcopy)
 {
-	struct vhost_ubuf_ref *ubufs;
+	struct vhost_net_ubuf_ref *ubufs;
 	/* No zero copy backend? Nothing to count. */
 	if (!zcopy)
 		return NULL;
@@ -140,14 +141,14 @@ struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
 	return ubufs;
 }
 
-void vhost_ubuf_put(struct vhost_ubuf_ref *ubufs)
+static void vhost_net_ubuf_put(struct vhost_net_ubuf_ref *ubufs)
 {
-	kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
+	kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
 }
 
-void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs)
+static void vhost_net_ubuf_put_and_wait(struct vhost_net_ubuf_ref *ubufs)
 {
-	kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
+	kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
 	wait_event(ubufs->wait, !atomic_read(&ubufs->kref.refcount));
 	kfree(ubufs);
 }
@@ -159,7 +160,7 @@ static void vhost_net_clear_ubuf_info(struct vhost_net *n)
 	int i;
 
 	for (i = 0; i < n->dev.nvqs; ++i) {
-		zcopy = vhost_zcopy_mask & (0x1 << i);
+		zcopy = vhost_net_zcopy_mask & (0x1 << i);
 		if (zcopy)
 			kfree(n->vqs[i].ubuf_info);
 	}
@@ -171,7 +172,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
 	int i;
 
 	for (i = 0; i < n->dev.nvqs; ++i) {
-		zcopy = vhost_zcopy_mask & (0x1 << i);
+		zcopy = vhost_net_zcopy_mask & (0x1 << i);
 		if (!zcopy)
 			continue;
 		n->vqs[i].ubuf_info = kmalloc(sizeof(*n->vqs[i].ubuf_info) *
@@ -183,7 +184,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
 
 err:
 	while (i--) {
-		zcopy = vhost_zcopy_mask & (0x1 << i);
+		zcopy = vhost_net_zcopy_mask & (0x1 << i);
 		if (!zcopy)
 			continue;
 		kfree(n->vqs[i].ubuf_info);
@@ -305,7 +306,7 @@ static int vhost_zerocopy_signal_used(struct vhost_net *net,
 
 static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
 {
-	struct vhost_ubuf_ref *ubufs = ubuf->ctx;
+	struct vhost_net_ubuf_ref *ubufs = ubuf->ctx;
 	struct vhost_virtqueue *vq = ubufs->vq;
 	int cnt = atomic_read(&ubufs->kref.refcount);
 
@@ -322,7 +323,7 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
 	/* set len to mark this desc buffers done DMA */
 	vq->heads[ubuf->desc].len = success ?
 		VHOST_DMA_DONE_LEN : VHOST_DMA_FAILED_LEN;
-	vhost_ubuf_put(ubufs);
+	vhost_net_ubuf_put(ubufs);
 }
 
 /* Expects to be always run from workqueue - which acts as
@@ -345,7 +346,7 @@ static void handle_tx(struct vhost_net *net)
 	int err;
 	size_t hdr_size;
 	struct socket *sock;
-	struct vhost_ubuf_ref *uninitialized_var(ubufs);
+	struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
 	bool zcopy, zcopy_used;
 
 	/* TODO: check that we are running from vhost_worker? */
@@ -441,7 +442,7 @@ static void handle_tx(struct vhost_net *net)
 		if (unlikely(err < 0)) {
 			if (zcopy_used) {
 				if (ubufs)
-					vhost_ubuf_put(ubufs);
+					vhost_net_ubuf_put(ubufs);
 				nvq->upend_idx = ((unsigned)nvq->upend_idx - 1)
 					% UIO_MAXIOV;
 			}
@@ -795,7 +796,7 @@ static void vhost_net_flush(struct vhost_net *n)
 		n->tx_flush = true;
 		mutex_unlock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
 		/* Wait for all lower device DMAs done. */
-		vhost_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
+		vhost_net_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
 		mutex_lock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
 		n->tx_flush = false;
 		kref_init(&n->vqs[VHOST_NET_VQ_TX].ubufs->kref);
@@ -896,7 +897,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
 	struct socket *sock, *oldsock;
 	struct vhost_virtqueue *vq;
 	struct vhost_net_virtqueue *nvq;
-	struct vhost_ubuf_ref *ubufs, *oldubufs = NULL;
+	struct vhost_net_ubuf_ref *ubufs, *oldubufs = NULL;
 	int r;
 
 	mutex_lock(&n->dev.mutex);
@@ -927,7 +928,8 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
 	oldsock = rcu_dereference_protected(vq->private_data,
 					    lockdep_is_held(&vq->mutex));
 	if (sock != oldsock) {
-		ubufs = vhost_ubuf_alloc(vq, sock && vhost_sock_zcopy(sock));
+		ubufs = vhost_net_ubuf_alloc(vq,
+					     sock && vhost_sock_zcopy(sock));
 		if (IS_ERR(ubufs)) {
 			r = PTR_ERR(ubufs);
 			goto err_ubufs;
@@ -953,7 +955,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
 	mutex_unlock(&vq->mutex);
 
 	if (oldubufs) {
-		vhost_ubuf_put_and_wait(oldubufs);
+		vhost_net_ubuf_put_and_wait(oldubufs);
 		mutex_lock(&vq->mutex);
 		vhost_zerocopy_signal_used(n, vq);
 		mutex_unlock(&vq->mutex);
@@ -971,7 +973,7 @@ err_used:
 	rcu_assign_pointer(vq->private_data, oldsock);
 	vhost_net_enable_vq(n, vq);
 	if (ubufs)
-		vhost_ubuf_put_and_wait(ubufs);
+		vhost_net_ubuf_put_and_wait(ubufs);
 err_ubufs:
 	fput(sock->file);
 err_vq:
@@ -1123,7 +1125,7 @@ static struct miscdevice vhost_net_misc = {
 static int vhost_net_init(void)
 {
 	if (experimental_zcopytx)
-		vhost_enable_zcopy(VHOST_NET_VQ_TX);
+		vhost_net_enable_zcopy(VHOST_NET_VQ_TX);
 	return misc_register(&vhost_net_misc);
 }
 module_init(vhost_net_init);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] vhost-net: Free ubuf when vhost_dev_ioctl fails
  2013-05-03  6:25 ` [PATCH 3/4] vhost-net: Free ubuf when vhost_dev_ioctl fails Asias He
@ 2013-05-05 13:50   ` Michael S. Tsirkin
  2013-05-06  3:17     ` Asias He
  0 siblings, 1 reply; 11+ messages in thread
From: Michael S. Tsirkin @ 2013-05-05 13:50 UTC (permalink / raw)
  To: Asias He; +Cc: target-devel, kvm, virtualization

On Fri, May 03, 2013 at 02:25:17PM +0800, Asias He wrote:
> Free ubuf when vhost_dev_ioctl for VHOST_SET_OWNER fails.
> 
> Signed-off-by: Asias He <asias@redhat.com>
> ---
>  drivers/vhost/net.c | 20 ++++++++++++++++++--
>  1 file changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
> index b2f6b41..eb73217 100644
> --- a/drivers/vhost/net.c
> +++ b/drivers/vhost/net.c
> @@ -152,6 +152,19 @@ void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs)
>  	kfree(ubufs);
>  }
>  
> +static void vhost_net_clear_ubuf_info(struct vhost_net *n)
> +{
> +
> +	bool zcopy;
> +	int i;
> +
> +	for (i = 0; i < n->dev.nvqs; ++i) {
> +		zcopy = vhost_zcopy_mask & (0x1 << i);
> +		if (zcopy)
> +			kfree(n->vqs[i].ubuf_info);
> +	}
> +}
> +
>  int vhost_net_set_ubuf_info(struct vhost_net *n)
>  {
>  	bool zcopy;
> @@ -1069,10 +1082,13 @@ static long vhost_net_ioctl(struct file *f, unsigned int ioctl,
>  				goto out;
>  		}
>  		r = vhost_dev_ioctl(&n->dev, ioctl, argp);
> -		if (r == -ENOIOCTLCMD)
> +		if (r == -ENOIOCTLCMD) {
>  			r = vhost_vring_ioctl(&n->dev, ioctl, argp);
> -		else
> +		} else {
> +			if (r < 0 && ioctl == VHOST_SET_OWNER)
> +				vhost_net_clear_ubuf_info(n);
>  			vhost_net_flush(n);
> +		}

This is becoming too complex.
Let's just export vhost_dev_set_owner from vhost.c
and have a separate case statement for VHOST_SET_OWNER.


Also - could you please send a separate series
with bugfixes, so I can apply for 3.10?
Cleanups I will queue for 3.11.

Thanks!

>  out:
>  		mutex_unlock(&n->dev.mutex);
>  		return r;
> -- 
> 1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] vhost-net: Free ubuf when vhost_dev_ioctl fails
  2013-05-05 13:50   ` Michael S. Tsirkin
@ 2013-05-06  3:17     ` Asias He
  0 siblings, 0 replies; 11+ messages in thread
From: Asias He @ 2013-05-06  3:17 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: target-devel, kvm, virtualization

On Sun, May 05, 2013 at 04:50:07PM +0300, Michael S. Tsirkin wrote:
> On Fri, May 03, 2013 at 02:25:17PM +0800, Asias He wrote:
> > Free ubuf when vhost_dev_ioctl for VHOST_SET_OWNER fails.
> > 
> > Signed-off-by: Asias He <asias@redhat.com>
> > ---
> >  drivers/vhost/net.c | 20 ++++++++++++++++++--
> >  1 file changed, 18 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
> > index b2f6b41..eb73217 100644
> > --- a/drivers/vhost/net.c
> > +++ b/drivers/vhost/net.c
> > @@ -152,6 +152,19 @@ void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs)
> >  	kfree(ubufs);
> >  }
> >  
> > +static void vhost_net_clear_ubuf_info(struct vhost_net *n)
> > +{
> > +
> > +	bool zcopy;
> > +	int i;
> > +
> > +	for (i = 0; i < n->dev.nvqs; ++i) {
> > +		zcopy = vhost_zcopy_mask & (0x1 << i);
> > +		if (zcopy)
> > +			kfree(n->vqs[i].ubuf_info);
> > +	}
> > +}
> > +
> >  int vhost_net_set_ubuf_info(struct vhost_net *n)
> >  {
> >  	bool zcopy;
> > @@ -1069,10 +1082,13 @@ static long vhost_net_ioctl(struct file *f, unsigned int ioctl,
> >  				goto out;
> >  		}
> >  		r = vhost_dev_ioctl(&n->dev, ioctl, argp);
> > -		if (r == -ENOIOCTLCMD)
> > +		if (r == -ENOIOCTLCMD) {
> >  			r = vhost_vring_ioctl(&n->dev, ioctl, argp);
> > -		else
> > +		} else {
> > +			if (r < 0 && ioctl == VHOST_SET_OWNER)
> > +				vhost_net_clear_ubuf_info(n);
> >  			vhost_net_flush(n);
> > +		}
> 
> This is becoming too complex.
> Let's just export vhost_dev_set_owner from vhost.c
> and have a separate case statement for VHOST_SET_OWNER.

done.

> 
> Also - could you please send a separate series
> with bugfixes, so I can apply for 3.10?
> Cleanups I will queue for 3.11.

done.

> Thanks!
> 
> >  out:
> >  		mutex_unlock(&n->dev.mutex);
> >  		return r;
> > -- 
> > 1.8.1.4

-- 
Asias

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy
  2013-05-03  6:25 ` [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy Asias He
@ 2013-05-06  8:17   ` Michael S. Tsirkin
  2013-05-06  8:25     ` Asias He
  2013-05-06  8:25     ` Asias He
  0 siblings, 2 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2013-05-06  8:17 UTC (permalink / raw)
  To: Asias He; +Cc: target-devel, kvm, virtualization

Typo a/adn/and/

On Fri, May 03, 2013 at 02:25:18PM +0800, Asias He wrote:
> - Rename vhost_ubuf to vhost_net_ubuf
> - Rename vhost_zcopy_mask to vhost_net_zcopy_mask
> - Make funcs static
> 
> Signed-off-by: Asias He <asias@redhat.com>
> ---
>  drivers/vhost/net.c | 58 +++++++++++++++++++++++++++--------------------------
>  1 file changed, 30 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
> index eb73217..4548c0b 100644
> --- a/drivers/vhost/net.c
> +++ b/drivers/vhost/net.c
> @@ -70,7 +70,7 @@ enum {
>  	VHOST_NET_VQ_MAX = 2,
>  };
>  
> -struct vhost_ubuf_ref {
> +struct vhost_net_ubuf_ref {
>  	struct kref kref;
>  	wait_queue_head_t wait;
>  	struct vhost_virtqueue *vq;
> @@ -93,7 +93,7 @@ struct vhost_net_virtqueue {
>  	struct ubuf_info *ubuf_info;
>  	/* Reference counting for outstanding ubufs.
>  	 * Protected by vq mutex. Writers must also take device mutex. */
> -	struct vhost_ubuf_ref *ubufs;
> +	struct vhost_net_ubuf_ref *ubufs;
>  };
>  
>  struct vhost_net {
> @@ -110,24 +110,25 @@ struct vhost_net {
>  	bool tx_flush;
>  };
>  
> -static unsigned vhost_zcopy_mask __read_mostly;
> +static unsigned vhost_net_zcopy_mask __read_mostly;
>  
> -void vhost_enable_zcopy(int vq)
> +static void vhost_net_enable_zcopy(int vq)
>  {
> -	vhost_zcopy_mask |= 0x1 << vq;
> +	vhost_net_zcopy_mask |= 0x1 << vq;
>  }
>  
> -static void vhost_zerocopy_done_signal(struct kref *kref)
> +static void vhost_net_zerocopy_done_signal(struct kref *kref)
>  {
> -	struct vhost_ubuf_ref *ubufs = container_of(kref, struct vhost_ubuf_ref,
> -						    kref);
> +	struct vhost_net_ubuf_ref *ubufs;
> +
> +	ubufs = container_of(kref, struct vhost_net_ubuf_ref, kref);
>  	wake_up(&ubufs->wait);
>  }
>  
> -struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
> -					bool zcopy)
> +static struct vhost_net_ubuf_ref *
> +vhost_net_ubuf_alloc(struct vhost_virtqueue *vq, bool zcopy)
>  {
> -	struct vhost_ubuf_ref *ubufs;
> +	struct vhost_net_ubuf_ref *ubufs;
>  	/* No zero copy backend? Nothing to count. */
>  	if (!zcopy)
>  		return NULL;
> @@ -140,14 +141,14 @@ struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
>  	return ubufs;
>  }
>  
> -void vhost_ubuf_put(struct vhost_ubuf_ref *ubufs)
> +static void vhost_net_ubuf_put(struct vhost_net_ubuf_ref *ubufs)
>  {
> -	kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
> +	kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
>  }
>  
> -void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs)
> +static void vhost_net_ubuf_put_and_wait(struct vhost_net_ubuf_ref *ubufs)
>  {
> -	kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
> +	kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
>  	wait_event(ubufs->wait, !atomic_read(&ubufs->kref.refcount));
>  	kfree(ubufs);
>  }
> @@ -159,7 +160,7 @@ static void vhost_net_clear_ubuf_info(struct vhost_net *n)
>  	int i;
>  
>  	for (i = 0; i < n->dev.nvqs; ++i) {
> -		zcopy = vhost_zcopy_mask & (0x1 << i);
> +		zcopy = vhost_net_zcopy_mask & (0x1 << i);
>  		if (zcopy)
>  			kfree(n->vqs[i].ubuf_info);
>  	}
> @@ -171,7 +172,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
>  	int i;
>  
>  	for (i = 0; i < n->dev.nvqs; ++i) {
> -		zcopy = vhost_zcopy_mask & (0x1 << i);
> +		zcopy = vhost_net_zcopy_mask & (0x1 << i);
>  		if (!zcopy)
>  			continue;
>  		n->vqs[i].ubuf_info = kmalloc(sizeof(*n->vqs[i].ubuf_info) *
> @@ -183,7 +184,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
>  
>  err:
>  	while (i--) {
> -		zcopy = vhost_zcopy_mask & (0x1 << i);
> +		zcopy = vhost_net_zcopy_mask & (0x1 << i);
>  		if (!zcopy)
>  			continue;
>  		kfree(n->vqs[i].ubuf_info);
> @@ -305,7 +306,7 @@ static int vhost_zerocopy_signal_used(struct vhost_net *net,
>  
>  static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
>  {
> -	struct vhost_ubuf_ref *ubufs = ubuf->ctx;
> +	struct vhost_net_ubuf_ref *ubufs = ubuf->ctx;
>  	struct vhost_virtqueue *vq = ubufs->vq;
>  	int cnt = atomic_read(&ubufs->kref.refcount);
>  
> @@ -322,7 +323,7 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
>  	/* set len to mark this desc buffers done DMA */
>  	vq->heads[ubuf->desc].len = success ?
>  		VHOST_DMA_DONE_LEN : VHOST_DMA_FAILED_LEN;
> -	vhost_ubuf_put(ubufs);
> +	vhost_net_ubuf_put(ubufs);
>  }
>  
>  /* Expects to be always run from workqueue - which acts as
> @@ -345,7 +346,7 @@ static void handle_tx(struct vhost_net *net)
>  	int err;
>  	size_t hdr_size;
>  	struct socket *sock;
> -	struct vhost_ubuf_ref *uninitialized_var(ubufs);
> +	struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
>  	bool zcopy, zcopy_used;
>  
>  	/* TODO: check that we are running from vhost_worker? */
> @@ -441,7 +442,7 @@ static void handle_tx(struct vhost_net *net)
>  		if (unlikely(err < 0)) {
>  			if (zcopy_used) {
>  				if (ubufs)
> -					vhost_ubuf_put(ubufs);
> +					vhost_net_ubuf_put(ubufs);
>  				nvq->upend_idx = ((unsigned)nvq->upend_idx - 1)
>  					% UIO_MAXIOV;
>  			}
> @@ -795,7 +796,7 @@ static void vhost_net_flush(struct vhost_net *n)
>  		n->tx_flush = true;
>  		mutex_unlock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
>  		/* Wait for all lower device DMAs done. */
> -		vhost_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
> +		vhost_net_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
>  		mutex_lock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
>  		n->tx_flush = false;
>  		kref_init(&n->vqs[VHOST_NET_VQ_TX].ubufs->kref);
> @@ -896,7 +897,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>  	struct socket *sock, *oldsock;
>  	struct vhost_virtqueue *vq;
>  	struct vhost_net_virtqueue *nvq;
> -	struct vhost_ubuf_ref *ubufs, *oldubufs = NULL;
> +	struct vhost_net_ubuf_ref *ubufs, *oldubufs = NULL;
>  	int r;
>  
>  	mutex_lock(&n->dev.mutex);
> @@ -927,7 +928,8 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>  	oldsock = rcu_dereference_protected(vq->private_data,
>  					    lockdep_is_held(&vq->mutex));
>  	if (sock != oldsock) {
> -		ubufs = vhost_ubuf_alloc(vq, sock && vhost_sock_zcopy(sock));
> +		ubufs = vhost_net_ubuf_alloc(vq,
> +					     sock && vhost_sock_zcopy(sock));
>  		if (IS_ERR(ubufs)) {
>  			r = PTR_ERR(ubufs);
>  			goto err_ubufs;
> @@ -953,7 +955,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>  	mutex_unlock(&vq->mutex);
>  
>  	if (oldubufs) {
> -		vhost_ubuf_put_and_wait(oldubufs);
> +		vhost_net_ubuf_put_and_wait(oldubufs);
>  		mutex_lock(&vq->mutex);
>  		vhost_zerocopy_signal_used(n, vq);
>  		mutex_unlock(&vq->mutex);
> @@ -971,7 +973,7 @@ err_used:
>  	rcu_assign_pointer(vq->private_data, oldsock);
>  	vhost_net_enable_vq(n, vq);
>  	if (ubufs)
> -		vhost_ubuf_put_and_wait(ubufs);
> +		vhost_net_ubuf_put_and_wait(ubufs);
>  err_ubufs:
>  	fput(sock->file);
>  err_vq:
> @@ -1123,7 +1125,7 @@ static struct miscdevice vhost_net_misc = {
>  static int vhost_net_init(void)
>  {
>  	if (experimental_zcopytx)
> -		vhost_enable_zcopy(VHOST_NET_VQ_TX);
> +		vhost_net_enable_zcopy(VHOST_NET_VQ_TX);
>  	return misc_register(&vhost_net_misc);
>  }
>  module_init(vhost_net_init);
> -- 
> 1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy
  2013-05-06  8:17   ` Michael S. Tsirkin
  2013-05-06  8:25     ` Asias He
@ 2013-05-06  8:25     ` Asias He
  1 sibling, 0 replies; 11+ messages in thread
From: Asias He @ 2013-05-06  8:25 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Asias He, target-devel, KVM, VIRTUAL

On Mon, May 6, 2013 at 4:17 PM, Michael S. Tsirkin <mst@redhat.com> wrote:
> Typo a/adn/and/

Yes.  Catched  this up and and fixed already.

>
> On Fri, May 03, 2013 at 02:25:18PM +0800, Asias He wrote:
>> - Rename vhost_ubuf to vhost_net_ubuf
>> - Rename vhost_zcopy_mask to vhost_net_zcopy_mask
>> - Make funcs static
>>
>> Signed-off-by: Asias He <asias@redhat.com>
>> ---
>>  drivers/vhost/net.c | 58 +++++++++++++++++++++++++++--------------------------
>>  1 file changed, 30 insertions(+), 28 deletions(-)
>>
>> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
>> index eb73217..4548c0b 100644
>> --- a/drivers/vhost/net.c
>> +++ b/drivers/vhost/net.c
>> @@ -70,7 +70,7 @@ enum {
>>       VHOST_NET_VQ_MAX = 2,
>>  };
>>
>> -struct vhost_ubuf_ref {
>> +struct vhost_net_ubuf_ref {
>>       struct kref kref;
>>       wait_queue_head_t wait;
>>       struct vhost_virtqueue *vq;
>> @@ -93,7 +93,7 @@ struct vhost_net_virtqueue {
>>       struct ubuf_info *ubuf_info;
>>       /* Reference counting for outstanding ubufs.
>>        * Protected by vq mutex. Writers must also take device mutex. */
>> -     struct vhost_ubuf_ref *ubufs;
>> +     struct vhost_net_ubuf_ref *ubufs;
>>  };
>>
>>  struct vhost_net {
>> @@ -110,24 +110,25 @@ struct vhost_net {
>>       bool tx_flush;
>>  };
>>
>> -static unsigned vhost_zcopy_mask __read_mostly;
>> +static unsigned vhost_net_zcopy_mask __read_mostly;
>>
>> -void vhost_enable_zcopy(int vq)
>> +static void vhost_net_enable_zcopy(int vq)
>>  {
>> -     vhost_zcopy_mask |= 0x1 << vq;
>> +     vhost_net_zcopy_mask |= 0x1 << vq;
>>  }
>>
>> -static void vhost_zerocopy_done_signal(struct kref *kref)
>> +static void vhost_net_zerocopy_done_signal(struct kref *kref)
>>  {
>> -     struct vhost_ubuf_ref *ubufs = container_of(kref, struct vhost_ubuf_ref,
>> -                                                 kref);
>> +     struct vhost_net_ubuf_ref *ubufs;
>> +
>> +     ubufs = container_of(kref, struct vhost_net_ubuf_ref, kref);
>>       wake_up(&ubufs->wait);
>>  }
>>
>> -struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
>> -                                     bool zcopy)
>> +static struct vhost_net_ubuf_ref *
>> +vhost_net_ubuf_alloc(struct vhost_virtqueue *vq, bool zcopy)
>>  {
>> -     struct vhost_ubuf_ref *ubufs;
>> +     struct vhost_net_ubuf_ref *ubufs;
>>       /* No zero copy backend? Nothing to count. */
>>       if (!zcopy)
>>               return NULL;
>> @@ -140,14 +141,14 @@ struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
>>       return ubufs;
>>  }
>>
>> -void vhost_ubuf_put(struct vhost_ubuf_ref *ubufs)
>> +static void vhost_net_ubuf_put(struct vhost_net_ubuf_ref *ubufs)
>>  {
>> -     kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
>> +     kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
>>  }
>>
>> -void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs)
>> +static void vhost_net_ubuf_put_and_wait(struct vhost_net_ubuf_ref *ubufs)
>>  {
>> -     kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
>> +     kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
>>       wait_event(ubufs->wait, !atomic_read(&ubufs->kref.refcount));
>>       kfree(ubufs);
>>  }
>> @@ -159,7 +160,7 @@ static void vhost_net_clear_ubuf_info(struct vhost_net *n)
>>       int i;
>>
>>       for (i = 0; i < n->dev.nvqs; ++i) {
>> -             zcopy = vhost_zcopy_mask & (0x1 << i);
>> +             zcopy = vhost_net_zcopy_mask & (0x1 << i);
>>               if (zcopy)
>>                       kfree(n->vqs[i].ubuf_info);
>>       }
>> @@ -171,7 +172,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
>>       int i;
>>
>>       for (i = 0; i < n->dev.nvqs; ++i) {
>> -             zcopy = vhost_zcopy_mask & (0x1 << i);
>> +             zcopy = vhost_net_zcopy_mask & (0x1 << i);
>>               if (!zcopy)
>>                       continue;
>>               n->vqs[i].ubuf_info = kmalloc(sizeof(*n->vqs[i].ubuf_info) *
>> @@ -183,7 +184,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
>>
>>  err:
>>       while (i--) {
>> -             zcopy = vhost_zcopy_mask & (0x1 << i);
>> +             zcopy = vhost_net_zcopy_mask & (0x1 << i);
>>               if (!zcopy)
>>                       continue;
>>               kfree(n->vqs[i].ubuf_info);
>> @@ -305,7 +306,7 @@ static int vhost_zerocopy_signal_used(struct vhost_net *net,
>>
>>  static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
>>  {
>> -     struct vhost_ubuf_ref *ubufs = ubuf->ctx;
>> +     struct vhost_net_ubuf_ref *ubufs = ubuf->ctx;
>>       struct vhost_virtqueue *vq = ubufs->vq;
>>       int cnt = atomic_read(&ubufs->kref.refcount);
>>
>> @@ -322,7 +323,7 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
>>       /* set len to mark this desc buffers done DMA */
>>       vq->heads[ubuf->desc].len = success ?
>>               VHOST_DMA_DONE_LEN : VHOST_DMA_FAILED_LEN;
>> -     vhost_ubuf_put(ubufs);
>> +     vhost_net_ubuf_put(ubufs);
>>  }
>>
>>  /* Expects to be always run from workqueue - which acts as
>> @@ -345,7 +346,7 @@ static void handle_tx(struct vhost_net *net)
>>       int err;
>>       size_t hdr_size;
>>       struct socket *sock;
>> -     struct vhost_ubuf_ref *uninitialized_var(ubufs);
>> +     struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
>>       bool zcopy, zcopy_used;
>>
>>       /* TODO: check that we are running from vhost_worker? */
>> @@ -441,7 +442,7 @@ static void handle_tx(struct vhost_net *net)
>>               if (unlikely(err < 0)) {
>>                       if (zcopy_used) {
>>                               if (ubufs)
>> -                                     vhost_ubuf_put(ubufs);
>> +                                     vhost_net_ubuf_put(ubufs);
>>                               nvq->upend_idx = ((unsigned)nvq->upend_idx - 1)
>>                                       % UIO_MAXIOV;
>>                       }
>> @@ -795,7 +796,7 @@ static void vhost_net_flush(struct vhost_net *n)
>>               n->tx_flush = true;
>>               mutex_unlock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
>>               /* Wait for all lower device DMAs done. */
>> -             vhost_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
>> +             vhost_net_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
>>               mutex_lock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
>>               n->tx_flush = false;
>>               kref_init(&n->vqs[VHOST_NET_VQ_TX].ubufs->kref);
>> @@ -896,7 +897,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>>       struct socket *sock, *oldsock;
>>       struct vhost_virtqueue *vq;
>>       struct vhost_net_virtqueue *nvq;
>> -     struct vhost_ubuf_ref *ubufs, *oldubufs = NULL;
>> +     struct vhost_net_ubuf_ref *ubufs, *oldubufs = NULL;
>>       int r;
>>
>>       mutex_lock(&n->dev.mutex);
>> @@ -927,7 +928,8 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>>       oldsock = rcu_dereference_protected(vq->private_data,
>>                                           lockdep_is_held(&vq->mutex));
>>       if (sock != oldsock) {
>> -             ubufs = vhost_ubuf_alloc(vq, sock && vhost_sock_zcopy(sock));
>> +             ubufs = vhost_net_ubuf_alloc(vq,
>> +                                          sock && vhost_sock_zcopy(sock));
>>               if (IS_ERR(ubufs)) {
>>                       r = PTR_ERR(ubufs);
>>                       goto err_ubufs;
>> @@ -953,7 +955,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>>       mutex_unlock(&vq->mutex);
>>
>>       if (oldubufs) {
>> -             vhost_ubuf_put_and_wait(oldubufs);
>> +             vhost_net_ubuf_put_and_wait(oldubufs);
>>               mutex_lock(&vq->mutex);
>>               vhost_zerocopy_signal_used(n, vq);
>>               mutex_unlock(&vq->mutex);
>> @@ -971,7 +973,7 @@ err_used:
>>       rcu_assign_pointer(vq->private_data, oldsock);
>>       vhost_net_enable_vq(n, vq);
>>       if (ubufs)
>> -             vhost_ubuf_put_and_wait(ubufs);
>> +             vhost_net_ubuf_put_and_wait(ubufs);
>>  err_ubufs:
>>       fput(sock->file);
>>  err_vq:
>> @@ -1123,7 +1125,7 @@ static struct miscdevice vhost_net_misc = {
>>  static int vhost_net_init(void)
>>  {
>>       if (experimental_zcopytx)
>> -             vhost_enable_zcopy(VHOST_NET_VQ_TX);
>> +             vhost_net_enable_zcopy(VHOST_NET_VQ_TX);
>>       return misc_register(&vhost_net_misc);
>>  }
>>  module_init(vhost_net_init);
>> --
>> 1.8.1.4
> _______________________________________________
> Virtualization mailing list
> Virtualization@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/virtualization



--
Asias

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy
  2013-05-06  8:17   ` Michael S. Tsirkin
@ 2013-05-06  8:25     ` Asias He
  2013-05-06  8:25     ` Asias He
  1 sibling, 0 replies; 11+ messages in thread
From: Asias He @ 2013-05-06  8:25 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: target-devel, KVM, VIRTUAL

On Mon, May 6, 2013 at 4:17 PM, Michael S. Tsirkin <mst@redhat.com> wrote:
> Typo a/adn/and/

Yes.  Catched  this up and and fixed already.

>
> On Fri, May 03, 2013 at 02:25:18PM +0800, Asias He wrote:
>> - Rename vhost_ubuf to vhost_net_ubuf
>> - Rename vhost_zcopy_mask to vhost_net_zcopy_mask
>> - Make funcs static
>>
>> Signed-off-by: Asias He <asias@redhat.com>
>> ---
>>  drivers/vhost/net.c | 58 +++++++++++++++++++++++++++--------------------------
>>  1 file changed, 30 insertions(+), 28 deletions(-)
>>
>> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
>> index eb73217..4548c0b 100644
>> --- a/drivers/vhost/net.c
>> +++ b/drivers/vhost/net.c
>> @@ -70,7 +70,7 @@ enum {
>>       VHOST_NET_VQ_MAX = 2,
>>  };
>>
>> -struct vhost_ubuf_ref {
>> +struct vhost_net_ubuf_ref {
>>       struct kref kref;
>>       wait_queue_head_t wait;
>>       struct vhost_virtqueue *vq;
>> @@ -93,7 +93,7 @@ struct vhost_net_virtqueue {
>>       struct ubuf_info *ubuf_info;
>>       /* Reference counting for outstanding ubufs.
>>        * Protected by vq mutex. Writers must also take device mutex. */
>> -     struct vhost_ubuf_ref *ubufs;
>> +     struct vhost_net_ubuf_ref *ubufs;
>>  };
>>
>>  struct vhost_net {
>> @@ -110,24 +110,25 @@ struct vhost_net {
>>       bool tx_flush;
>>  };
>>
>> -static unsigned vhost_zcopy_mask __read_mostly;
>> +static unsigned vhost_net_zcopy_mask __read_mostly;
>>
>> -void vhost_enable_zcopy(int vq)
>> +static void vhost_net_enable_zcopy(int vq)
>>  {
>> -     vhost_zcopy_mask |= 0x1 << vq;
>> +     vhost_net_zcopy_mask |= 0x1 << vq;
>>  }
>>
>> -static void vhost_zerocopy_done_signal(struct kref *kref)
>> +static void vhost_net_zerocopy_done_signal(struct kref *kref)
>>  {
>> -     struct vhost_ubuf_ref *ubufs = container_of(kref, struct vhost_ubuf_ref,
>> -                                                 kref);
>> +     struct vhost_net_ubuf_ref *ubufs;
>> +
>> +     ubufs = container_of(kref, struct vhost_net_ubuf_ref, kref);
>>       wake_up(&ubufs->wait);
>>  }
>>
>> -struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
>> -                                     bool zcopy)
>> +static struct vhost_net_ubuf_ref *
>> +vhost_net_ubuf_alloc(struct vhost_virtqueue *vq, bool zcopy)
>>  {
>> -     struct vhost_ubuf_ref *ubufs;
>> +     struct vhost_net_ubuf_ref *ubufs;
>>       /* No zero copy backend? Nothing to count. */
>>       if (!zcopy)
>>               return NULL;
>> @@ -140,14 +141,14 @@ struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
>>       return ubufs;
>>  }
>>
>> -void vhost_ubuf_put(struct vhost_ubuf_ref *ubufs)
>> +static void vhost_net_ubuf_put(struct vhost_net_ubuf_ref *ubufs)
>>  {
>> -     kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
>> +     kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
>>  }
>>
>> -void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs)
>> +static void vhost_net_ubuf_put_and_wait(struct vhost_net_ubuf_ref *ubufs)
>>  {
>> -     kref_put(&ubufs->kref, vhost_zerocopy_done_signal);
>> +     kref_put(&ubufs->kref, vhost_net_zerocopy_done_signal);
>>       wait_event(ubufs->wait, !atomic_read(&ubufs->kref.refcount));
>>       kfree(ubufs);
>>  }
>> @@ -159,7 +160,7 @@ static void vhost_net_clear_ubuf_info(struct vhost_net *n)
>>       int i;
>>
>>       for (i = 0; i < n->dev.nvqs; ++i) {
>> -             zcopy = vhost_zcopy_mask & (0x1 << i);
>> +             zcopy = vhost_net_zcopy_mask & (0x1 << i);
>>               if (zcopy)
>>                       kfree(n->vqs[i].ubuf_info);
>>       }
>> @@ -171,7 +172,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
>>       int i;
>>
>>       for (i = 0; i < n->dev.nvqs; ++i) {
>> -             zcopy = vhost_zcopy_mask & (0x1 << i);
>> +             zcopy = vhost_net_zcopy_mask & (0x1 << i);
>>               if (!zcopy)
>>                       continue;
>>               n->vqs[i].ubuf_info = kmalloc(sizeof(*n->vqs[i].ubuf_info) *
>> @@ -183,7 +184,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
>>
>>  err:
>>       while (i--) {
>> -             zcopy = vhost_zcopy_mask & (0x1 << i);
>> +             zcopy = vhost_net_zcopy_mask & (0x1 << i);
>>               if (!zcopy)
>>                       continue;
>>               kfree(n->vqs[i].ubuf_info);
>> @@ -305,7 +306,7 @@ static int vhost_zerocopy_signal_used(struct vhost_net *net,
>>
>>  static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
>>  {
>> -     struct vhost_ubuf_ref *ubufs = ubuf->ctx;
>> +     struct vhost_net_ubuf_ref *ubufs = ubuf->ctx;
>>       struct vhost_virtqueue *vq = ubufs->vq;
>>       int cnt = atomic_read(&ubufs->kref.refcount);
>>
>> @@ -322,7 +323,7 @@ static void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool success)
>>       /* set len to mark this desc buffers done DMA */
>>       vq->heads[ubuf->desc].len = success ?
>>               VHOST_DMA_DONE_LEN : VHOST_DMA_FAILED_LEN;
>> -     vhost_ubuf_put(ubufs);
>> +     vhost_net_ubuf_put(ubufs);
>>  }
>>
>>  /* Expects to be always run from workqueue - which acts as
>> @@ -345,7 +346,7 @@ static void handle_tx(struct vhost_net *net)
>>       int err;
>>       size_t hdr_size;
>>       struct socket *sock;
>> -     struct vhost_ubuf_ref *uninitialized_var(ubufs);
>> +     struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
>>       bool zcopy, zcopy_used;
>>
>>       /* TODO: check that we are running from vhost_worker? */
>> @@ -441,7 +442,7 @@ static void handle_tx(struct vhost_net *net)
>>               if (unlikely(err < 0)) {
>>                       if (zcopy_used) {
>>                               if (ubufs)
>> -                                     vhost_ubuf_put(ubufs);
>> +                                     vhost_net_ubuf_put(ubufs);
>>                               nvq->upend_idx = ((unsigned)nvq->upend_idx - 1)
>>                                       % UIO_MAXIOV;
>>                       }
>> @@ -795,7 +796,7 @@ static void vhost_net_flush(struct vhost_net *n)
>>               n->tx_flush = true;
>>               mutex_unlock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
>>               /* Wait for all lower device DMAs done. */
>> -             vhost_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
>> +             vhost_net_ubuf_put_and_wait(n->vqs[VHOST_NET_VQ_TX].ubufs);
>>               mutex_lock(&n->vqs[VHOST_NET_VQ_TX].vq.mutex);
>>               n->tx_flush = false;
>>               kref_init(&n->vqs[VHOST_NET_VQ_TX].ubufs->kref);
>> @@ -896,7 +897,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>>       struct socket *sock, *oldsock;
>>       struct vhost_virtqueue *vq;
>>       struct vhost_net_virtqueue *nvq;
>> -     struct vhost_ubuf_ref *ubufs, *oldubufs = NULL;
>> +     struct vhost_net_ubuf_ref *ubufs, *oldubufs = NULL;
>>       int r;
>>
>>       mutex_lock(&n->dev.mutex);
>> @@ -927,7 +928,8 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>>       oldsock = rcu_dereference_protected(vq->private_data,
>>                                           lockdep_is_held(&vq->mutex));
>>       if (sock != oldsock) {
>> -             ubufs = vhost_ubuf_alloc(vq, sock && vhost_sock_zcopy(sock));
>> +             ubufs = vhost_net_ubuf_alloc(vq,
>> +                                          sock && vhost_sock_zcopy(sock));
>>               if (IS_ERR(ubufs)) {
>>                       r = PTR_ERR(ubufs);
>>                       goto err_ubufs;
>> @@ -953,7 +955,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
>>       mutex_unlock(&vq->mutex);
>>
>>       if (oldubufs) {
>> -             vhost_ubuf_put_and_wait(oldubufs);
>> +             vhost_net_ubuf_put_and_wait(oldubufs);
>>               mutex_lock(&vq->mutex);
>>               vhost_zerocopy_signal_used(n, vq);
>>               mutex_unlock(&vq->mutex);
>> @@ -971,7 +973,7 @@ err_used:
>>       rcu_assign_pointer(vq->private_data, oldsock);
>>       vhost_net_enable_vq(n, vq);
>>       if (ubufs)
>> -             vhost_ubuf_put_and_wait(ubufs);
>> +             vhost_net_ubuf_put_and_wait(ubufs);
>>  err_ubufs:
>>       fput(sock->file);
>>  err_vq:
>> @@ -1123,7 +1125,7 @@ static struct miscdevice vhost_net_misc = {
>>  static int vhost_net_init(void)
>>  {
>>       if (experimental_zcopytx)
>> -             vhost_enable_zcopy(VHOST_NET_VQ_TX);
>> +             vhost_net_enable_zcopy(VHOST_NET_VQ_TX);
>>       return misc_register(&vhost_net_misc);
>>  }
>>  module_init(vhost_net_init);
>> --
>> 1.8.1.4
> _______________________________________________
> Virtualization mailing list
> Virtualization@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/virtualization



--
Asias

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2013-05-06  8:25 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-03  6:25 [PATCH 0/4] vhost and vhost-net cleanups Asias He
2013-05-03  6:25 ` [PATCH 1/4] vhost: Remove comments for hdr in vhost.h Asias He
2013-05-03  6:25 ` [PATCH 2/4] vhost: Simplify dev->vqs[i] access Asias He
2013-05-03  6:25 ` [PATCH 3/4] vhost-net: Free ubuf when vhost_dev_ioctl fails Asias He
2013-05-05 13:50   ` Michael S. Tsirkin
2013-05-06  3:17     ` Asias He
2013-05-03  6:25 ` [PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy Asias He
2013-05-06  8:17   ` Michael S. Tsirkin
2013-05-06  8:25     ` Asias He
2013-05-06  8:25     ` Asias He
2013-05-03  6:25 ` Asias He

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.