[PATCH 8/9] virtio: introduce and use virtqueue_add_buf_single
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
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