* [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.