[PATCH 8/9] virtio: introduce and use virtqueue_add_buf_single

2013-02-12 Thread Paolo Bonzini
Adding a single direct buffer is a very common case.  Introduce
an optimized function for that.

Signed-off-by: Paolo Bonzini 
---
 drivers/char/hw_random/virtio-rng.c |2 +-
 drivers/char/virtio_console.c   |4 +-
 drivers/net/virtio_net.c|2 +-
 drivers/rpmsg/virtio_rpmsg_bus.c|8 +++---
 drivers/scsi/virtio_scsi.c  |4 +-
 drivers/virtio/virtio_balloon.c |6 ++--
 drivers/virtio/virtio_ring.c|   40 +++
 include/linux/virtio.h  |5 
 tools/virtio/virtio_test.c  |6 ++--
 9 files changed, 61 insertions(+), 16 deletions(-)

diff --git a/drivers/char/hw_random/virtio-rng.c 
b/drivers/char/hw_random/virtio-rng.c
index b65c103..8b851ed 100644
--- a/drivers/char/hw_random/virtio-rng.c
+++ b/drivers/char/hw_random/virtio-rng.c
@@ -47,7 +47,7 @@ static void register_buffer(u8 *buf, size_t size)
sg_init_one(, buf, size);
 
/* There should always be room for one buffer. */
-   if (virtqueue_add_buf(vq, , 0, 1, buf, GFP_KERNEL) < 0)
+   if (virtqueue_add_buf_single(vq, , DMA_FROM_DEVICE, buf) < 0)
BUG();
 
virtqueue_kick(vq);
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 684b0d5..62bd945 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -508,7 +508,7 @@ static int add_inbuf(struct virtqueue *vq, struct 
port_buffer *buf)
 
sg_init_one(sg, buf->buf, buf->size);
 
-   ret = virtqueue_add_buf(vq, sg, 0, 1, buf, GFP_ATOMIC);
+   ret = virtqueue_add_buf_single(vq, sg, DMA_FROM_DEVICE, buf);
virtqueue_kick(vq);
if (!ret)
ret = vq->num_free;
@@ -575,7 +575,7 @@ static ssize_t __send_control_msg(struct ports_device 
*portdev, u32 port_id,
vq = portdev->c_ovq;
 
sg_init_one(sg, , sizeof(cpkt));
-   if (virtqueue_add_buf(vq, sg, 1, 0, , GFP_ATOMIC) == 0) {
+   if (virtqueue_add_buf_single(vq, sg, DMA_TO_DEVICE, ) == 0) {
virtqueue_kick(vq);
while (!virtqueue_get_buf(vq, ))
cpu_relax();
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 78b6f51..1a5186d 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -509,7 +509,7 @@ static int add_recvbuf_mergeable(struct receive_queue *rq, 
gfp_t gfp)
return -ENOMEM;
 
sg_set_page(rq->sg, page, PAGE_SIZE, 0);
-   err = virtqueue_add_buf(rq->vq, rq->sg, 0, 1, page, gfp);
+   err = virtqueue_add_buf_single(rq->vq, rq->sg, DMA_FROM_DEVICE, page);
if (err < 0)
give_pages(rq, page);
 
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index f1e3239..3008987 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -763,7 +763,7 @@ int rpmsg_send_offchannel_raw(struct rpmsg_channel *rpdev, 
u32 src, u32 dst,
mutex_lock(>tx_lock);
 
/* add message to the remote processor's virtqueue */
-   err = virtqueue_add_buf(vrp->svq, , 1, 0, msg, GFP_KERNEL);
+   err = virtqueue_add_buf_single(vrp->svq, , DMA_TO_DEVICE, msg);
if (err) {
/*
 * need to reclaim the buffer here, otherwise it's lost
@@ -845,7 +845,7 @@ static void rpmsg_recv_done(struct virtqueue *rvq)
sg_init_one(, msg, RPMSG_BUF_SIZE);
 
/* add the buffer back to the remote processor's virtqueue */
-   err = virtqueue_add_buf(vrp->rvq, , 0, 1, msg, GFP_KERNEL);
+   err = virtqueue_add_buf_single(vrp->rvq, , DMA_FROM_DEVICE, msg);
if (err < 0) {
dev_err(dev, "failed to add a virtqueue buffer: %d\n", err);
return;
@@ -976,8 +976,8 @@ static int rpmsg_probe(struct virtio_device *vdev)
 
sg_init_one(, cpu_addr, RPMSG_BUF_SIZE);
 
-   err = virtqueue_add_buf(vrp->rvq, , 0, 1, cpu_addr,
-   GFP_KERNEL);
+   err = virtqueue_add_buf_single(vrp->rvq, , DMA_FROM_DEVICE,
+  cpu_addr);
WARN_ON(err); /* sanity check; this can't really happen */
}
 
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 6b752f7..887902e 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -220,8 +220,8 @@ static int virtscsi_kick_event(struct virtio_scsi *vscsi,
 
spin_lock_irqsave(>event_vq.vq_lock, flags);
 
-   err = virtqueue_add_buf(vscsi->event_vq.vq, , 0, 1, event_node,
-   GFP_ATOMIC);
+   err = virtqueue_add_buf_single(vscsi->event_vq.vq, ,
+  DMA_FROM_DEVICE, event_node);
if (!err)
virtqueue_kick(vscsi->event_vq.vq);
 
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 

[PATCH 8/9] virtio: introduce and use virtqueue_add_buf_single

2013-02-12 Thread Paolo Bonzini
Adding a single direct buffer is a very common case.  Introduce
an optimized function for that.

Signed-off-by: Paolo Bonzini pbonz...@redhat.com
---
 drivers/char/hw_random/virtio-rng.c |2 +-
 drivers/char/virtio_console.c   |4 +-
 drivers/net/virtio_net.c|2 +-
 drivers/rpmsg/virtio_rpmsg_bus.c|8 +++---
 drivers/scsi/virtio_scsi.c  |4 +-
 drivers/virtio/virtio_balloon.c |6 ++--
 drivers/virtio/virtio_ring.c|   40 +++
 include/linux/virtio.h  |5 
 tools/virtio/virtio_test.c  |6 ++--
 9 files changed, 61 insertions(+), 16 deletions(-)

diff --git a/drivers/char/hw_random/virtio-rng.c 
b/drivers/char/hw_random/virtio-rng.c
index b65c103..8b851ed 100644
--- a/drivers/char/hw_random/virtio-rng.c
+++ b/drivers/char/hw_random/virtio-rng.c
@@ -47,7 +47,7 @@ static void register_buffer(u8 *buf, size_t size)
sg_init_one(sg, buf, size);
 
/* There should always be room for one buffer. */
-   if (virtqueue_add_buf(vq, sg, 0, 1, buf, GFP_KERNEL)  0)
+   if (virtqueue_add_buf_single(vq, sg, DMA_FROM_DEVICE, buf)  0)
BUG();
 
virtqueue_kick(vq);
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 684b0d5..62bd945 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -508,7 +508,7 @@ static int add_inbuf(struct virtqueue *vq, struct 
port_buffer *buf)
 
sg_init_one(sg, buf-buf, buf-size);
 
-   ret = virtqueue_add_buf(vq, sg, 0, 1, buf, GFP_ATOMIC);
+   ret = virtqueue_add_buf_single(vq, sg, DMA_FROM_DEVICE, buf);
virtqueue_kick(vq);
if (!ret)
ret = vq-num_free;
@@ -575,7 +575,7 @@ static ssize_t __send_control_msg(struct ports_device 
*portdev, u32 port_id,
vq = portdev-c_ovq;
 
sg_init_one(sg, cpkt, sizeof(cpkt));
-   if (virtqueue_add_buf(vq, sg, 1, 0, cpkt, GFP_ATOMIC) == 0) {
+   if (virtqueue_add_buf_single(vq, sg, DMA_TO_DEVICE, cpkt) == 0) {
virtqueue_kick(vq);
while (!virtqueue_get_buf(vq, len))
cpu_relax();
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 78b6f51..1a5186d 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -509,7 +509,7 @@ static int add_recvbuf_mergeable(struct receive_queue *rq, 
gfp_t gfp)
return -ENOMEM;
 
sg_set_page(rq-sg, page, PAGE_SIZE, 0);
-   err = virtqueue_add_buf(rq-vq, rq-sg, 0, 1, page, gfp);
+   err = virtqueue_add_buf_single(rq-vq, rq-sg, DMA_FROM_DEVICE, page);
if (err  0)
give_pages(rq, page);
 
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index f1e3239..3008987 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -763,7 +763,7 @@ int rpmsg_send_offchannel_raw(struct rpmsg_channel *rpdev, 
u32 src, u32 dst,
mutex_lock(vrp-tx_lock);
 
/* add message to the remote processor's virtqueue */
-   err = virtqueue_add_buf(vrp-svq, sg, 1, 0, msg, GFP_KERNEL);
+   err = virtqueue_add_buf_single(vrp-svq, sg, DMA_TO_DEVICE, msg);
if (err) {
/*
 * need to reclaim the buffer here, otherwise it's lost
@@ -845,7 +845,7 @@ static void rpmsg_recv_done(struct virtqueue *rvq)
sg_init_one(sg, msg, RPMSG_BUF_SIZE);
 
/* add the buffer back to the remote processor's virtqueue */
-   err = virtqueue_add_buf(vrp-rvq, sg, 0, 1, msg, GFP_KERNEL);
+   err = virtqueue_add_buf_single(vrp-rvq, sg, DMA_FROM_DEVICE, msg);
if (err  0) {
dev_err(dev, failed to add a virtqueue buffer: %d\n, err);
return;
@@ -976,8 +976,8 @@ static int rpmsg_probe(struct virtio_device *vdev)
 
sg_init_one(sg, cpu_addr, RPMSG_BUF_SIZE);
 
-   err = virtqueue_add_buf(vrp-rvq, sg, 0, 1, cpu_addr,
-   GFP_KERNEL);
+   err = virtqueue_add_buf_single(vrp-rvq, sg, DMA_FROM_DEVICE,
+  cpu_addr);
WARN_ON(err); /* sanity check; this can't really happen */
}
 
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 6b752f7..887902e 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -220,8 +220,8 @@ static int virtscsi_kick_event(struct virtio_scsi *vscsi,
 
spin_lock_irqsave(vscsi-event_vq.vq_lock, flags);
 
-   err = virtqueue_add_buf(vscsi-event_vq.vq, sg, 0, 1, event_node,
-   GFP_ATOMIC);
+   err = virtqueue_add_buf_single(vscsi-event_vq.vq, sg,
+  DMA_FROM_DEVICE, event_node);
if (!err)
virtqueue_kick(vscsi-event_vq.vq);
 
diff --git a/drivers/virtio/virtio_balloon.c