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
It is supposed to be removed when hdr is moved into vhost_net_virtqueue.
Signed-off-by: Asias He <asias at 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
Signed-off-by: Asias He <asias at 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
Asias He
2013-May-03 06:25 UTC
[PATCH 3/4] vhost-net: Free ubuf when vhost_dev_ioctl fails
Free ubuf when vhost_dev_ioctl for VHOST_SET_OWNER fails.
Signed-off-by: Asias He <asias at 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
- 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 at 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
Michael S. Tsirkin
2013-May-06 08:17 UTC
[PATCH 4/4] vhost-net: Cleanup vhost_ubuf adn vhost_zcopy
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 at 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
On Mon, May 6, 2013 at 4:17 PM, Michael S. Tsirkin <mst at 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 at 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 at lists.linux-foundation.org > https://lists.linuxfoundation.org/mailman/listinfo/virtualization-- Asias