Commit f96fde41 authored by Rusty Russell's avatar Rusty Russell

virtio: rename virtqueue_add_buf_gfp to virtqueue_add_buf

Remove wrapper functions. This makes the allocation type explicit in
all callers; I used GPF_KERNEL where it seemed obvious, left it at
GFP_ATOMIC otherwise.
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 5dfc1762
...@@ -172,7 +172,7 @@ static bool do_req(struct request_queue *q, struct virtio_blk *vblk, ...@@ -172,7 +172,7 @@ static bool do_req(struct request_queue *q, struct virtio_blk *vblk,
} }
} }
if (virtqueue_add_buf(vblk->vq, vblk->sg, out, in, vbr) < 0) { if (virtqueue_add_buf(vblk->vq, vblk->sg, out, in, vbr, GFP_ATOMIC)<0) {
mempool_free(vbr, vblk->pool); mempool_free(vbr, vblk->pool);
return false; return false;
} }
......
...@@ -47,7 +47,7 @@ static void register_buffer(u8 *buf, size_t size) ...@@ -47,7 +47,7 @@ static void register_buffer(u8 *buf, size_t size)
sg_init_one(&sg, buf, size); sg_init_one(&sg, buf, size);
/* There should always be room for one buffer. */ /* There should always be room for one buffer. */
if (virtqueue_add_buf(vq, &sg, 0, 1, buf) < 0) if (virtqueue_add_buf(vq, &sg, 0, 1, buf, GFP_KERNEL) < 0)
BUG(); BUG();
virtqueue_kick(vq); virtqueue_kick(vq);
......
...@@ -392,7 +392,7 @@ static int add_inbuf(struct virtqueue *vq, struct port_buffer *buf) ...@@ -392,7 +392,7 @@ static int add_inbuf(struct virtqueue *vq, struct port_buffer *buf)
sg_init_one(sg, buf->buf, buf->size); sg_init_one(sg, buf->buf, buf->size);
ret = virtqueue_add_buf(vq, sg, 0, 1, buf); ret = virtqueue_add_buf(vq, sg, 0, 1, buf, GFP_ATOMIC);
virtqueue_kick(vq); virtqueue_kick(vq);
return ret; return ret;
} }
...@@ -457,7 +457,7 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id, ...@@ -457,7 +457,7 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
vq = portdev->c_ovq; vq = portdev->c_ovq;
sg_init_one(sg, &cpkt, sizeof(cpkt)); sg_init_one(sg, &cpkt, sizeof(cpkt));
if (virtqueue_add_buf(vq, sg, 1, 0, &cpkt) >= 0) { if (virtqueue_add_buf(vq, sg, 1, 0, &cpkt, GFP_ATOMIC) >= 0) {
virtqueue_kick(vq); virtqueue_kick(vq);
while (!virtqueue_get_buf(vq, &len)) while (!virtqueue_get_buf(vq, &len))
cpu_relax(); cpu_relax();
...@@ -506,7 +506,7 @@ static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count, ...@@ -506,7 +506,7 @@ static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count,
reclaim_consumed_buffers(port); reclaim_consumed_buffers(port);
sg_init_one(sg, in_buf, in_count); sg_init_one(sg, in_buf, in_count);
ret = virtqueue_add_buf(out_vq, sg, 1, 0, in_buf); ret = virtqueue_add_buf(out_vq, sg, 1, 0, in_buf, GFP_ATOMIC);
/* Tell Host to go! */ /* Tell Host to go! */
virtqueue_kick(out_vq); virtqueue_kick(out_vq);
......
...@@ -370,7 +370,7 @@ static int add_recvbuf_small(struct virtnet_info *vi, gfp_t gfp) ...@@ -370,7 +370,7 @@ static int add_recvbuf_small(struct virtnet_info *vi, gfp_t gfp)
skb_to_sgvec(skb, vi->rx_sg + 1, 0, skb->len); skb_to_sgvec(skb, vi->rx_sg + 1, 0, skb->len);
err = virtqueue_add_buf_gfp(vi->rvq, vi->rx_sg, 0, 2, skb, gfp); err = virtqueue_add_buf(vi->rvq, vi->rx_sg, 0, 2, skb, gfp);
if (err < 0) if (err < 0)
dev_kfree_skb(skb); dev_kfree_skb(skb);
...@@ -415,8 +415,8 @@ static int add_recvbuf_big(struct virtnet_info *vi, gfp_t gfp) ...@@ -415,8 +415,8 @@ static int add_recvbuf_big(struct virtnet_info *vi, gfp_t gfp)
/* chain first in list head */ /* chain first in list head */
first->private = (unsigned long)list; first->private = (unsigned long)list;
err = virtqueue_add_buf_gfp(vi->rvq, vi->rx_sg, 0, MAX_SKB_FRAGS + 2, err = virtqueue_add_buf(vi->rvq, vi->rx_sg, 0, MAX_SKB_FRAGS + 2,
first, gfp); first, gfp);
if (err < 0) if (err < 0)
give_pages(vi, first); give_pages(vi, first);
...@@ -434,7 +434,7 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi, gfp_t gfp) ...@@ -434,7 +434,7 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi, gfp_t gfp)
sg_init_one(vi->rx_sg, page_address(page), PAGE_SIZE); sg_init_one(vi->rx_sg, page_address(page), PAGE_SIZE);
err = virtqueue_add_buf_gfp(vi->rvq, vi->rx_sg, 0, 1, page, gfp); err = virtqueue_add_buf(vi->rvq, vi->rx_sg, 0, 1, page, gfp);
if (err < 0) if (err < 0)
give_pages(vi, page); give_pages(vi, page);
...@@ -609,7 +609,7 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) ...@@ -609,7 +609,7 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb)
hdr->num_sg = skb_to_sgvec(skb, vi->tx_sg + 1, 0, skb->len) + 1; hdr->num_sg = skb_to_sgvec(skb, vi->tx_sg + 1, 0, skb->len) + 1;
return virtqueue_add_buf(vi->svq, vi->tx_sg, hdr->num_sg, return virtqueue_add_buf(vi->svq, vi->tx_sg, hdr->num_sg,
0, skb); 0, skb, GFP_ATOMIC);
} }
static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
...@@ -767,7 +767,7 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, ...@@ -767,7 +767,7 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
sg_set_buf(&sg[i + 1], sg_virt(s), s->length); sg_set_buf(&sg[i + 1], sg_virt(s), s->length);
sg_set_buf(&sg[out + in - 1], &status, sizeof(status)); sg_set_buf(&sg[out + in - 1], &status, sizeof(status));
BUG_ON(virtqueue_add_buf(vi->cvq, sg, out, in, vi) < 0); BUG_ON(virtqueue_add_buf(vi->cvq, sg, out, in, vi, GFP_ATOMIC) < 0);
virtqueue_kick(vi->cvq); virtqueue_kick(vi->cvq);
......
...@@ -88,7 +88,7 @@ static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq) ...@@ -88,7 +88,7 @@ static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq)
init_completion(&vb->acked); init_completion(&vb->acked);
/* We should always be able to add one buffer to an empty queue. */ /* We should always be able to add one buffer to an empty queue. */
if (virtqueue_add_buf(vq, &sg, 1, 0, vb) < 0) if (virtqueue_add_buf(vq, &sg, 1, 0, vb, GFP_KERNEL) < 0)
BUG(); BUG();
virtqueue_kick(vq); virtqueue_kick(vq);
...@@ -220,7 +220,7 @@ static void stats_handle_request(struct virtio_balloon *vb) ...@@ -220,7 +220,7 @@ static void stats_handle_request(struct virtio_balloon *vb)
vq = vb->stats_vq; vq = vb->stats_vq;
sg_init_one(&sg, vb->stats, sizeof(vb->stats)); sg_init_one(&sg, vb->stats, sizeof(vb->stats));
if (virtqueue_add_buf(vq, &sg, 1, 0, vb) < 0) if (virtqueue_add_buf(vq, &sg, 1, 0, vb, GFP_KERNEL) < 0)
BUG(); BUG();
virtqueue_kick(vq); virtqueue_kick(vq);
} }
...@@ -313,7 +313,8 @@ static int virtballoon_probe(struct virtio_device *vdev) ...@@ -313,7 +313,8 @@ static int virtballoon_probe(struct virtio_device *vdev)
* use it to signal us later. * use it to signal us later.
*/ */
sg_init_one(&sg, vb->stats, sizeof vb->stats); sg_init_one(&sg, vb->stats, sizeof vb->stats);
if (virtqueue_add_buf(vb->stats_vq, &sg, 1, 0, vb) < 0) if (virtqueue_add_buf(vb->stats_vq, &sg, 1, 0, vb, GFP_KERNEL)
< 0)
BUG(); BUG();
virtqueue_kick(vb->stats_vq); virtqueue_kick(vb->stats_vq);
} }
......
...@@ -167,7 +167,7 @@ static int vring_add_indirect(struct vring_virtqueue *vq, ...@@ -167,7 +167,7 @@ static int vring_add_indirect(struct vring_virtqueue *vq,
} }
/** /**
* virtqueue_add_buf_gfp - expose buffer to other end * virtqueue_add_buf - expose buffer to other end
* @vq: the struct virtqueue we're talking about. * @vq: the struct virtqueue we're talking about.
* @sg: the description of the buffer(s). * @sg: the description of the buffer(s).
* @out_num: the number of sg readable by other side * @out_num: the number of sg readable by other side
...@@ -183,12 +183,12 @@ static int vring_add_indirect(struct vring_virtqueue *vq, ...@@ -183,12 +183,12 @@ static int vring_add_indirect(struct vring_virtqueue *vq,
* positive return values as "available": indirect buffers mean that * positive return values as "available": indirect buffers mean that
* we can put an entire sg[] array inside a single queue entry. * we can put an entire sg[] array inside a single queue entry.
*/ */
int virtqueue_add_buf_gfp(struct virtqueue *_vq, int virtqueue_add_buf(struct virtqueue *_vq,
struct scatterlist sg[], struct scatterlist sg[],
unsigned int out, unsigned int out,
unsigned int in, unsigned int in,
void *data, void *data,
gfp_t gfp) gfp_t gfp)
{ {
struct vring_virtqueue *vq = to_vvq(_vq); struct vring_virtqueue *vq = to_vvq(_vq);
unsigned int i, avail, uninitialized_var(prev); unsigned int i, avail, uninitialized_var(prev);
...@@ -259,13 +259,13 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq, ...@@ -259,13 +259,13 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq,
return vq->num_free; return vq->num_free;
} }
EXPORT_SYMBOL_GPL(virtqueue_add_buf_gfp); EXPORT_SYMBOL_GPL(virtqueue_add_buf);
/** /**
* virtqueue_kick - update after add_buf * virtqueue_kick - update after add_buf
* @vq: the struct virtqueue * @vq: the struct virtqueue
* *
* After one or more virtqueue_add_buf_gfp calls, invoke this to kick * After one or more virtqueue_add_buf calls, invoke this to kick
* the other side. * the other side.
* *
* Caller must ensure we don't call this with other virtqueue * Caller must ensure we don't call this with other virtqueue
...@@ -341,7 +341,7 @@ static inline bool more_used(const struct vring_virtqueue *vq) ...@@ -341,7 +341,7 @@ static inline bool more_used(const struct vring_virtqueue *vq)
* operations at the same time (except where noted). * operations at the same time (except where noted).
* *
* Returns NULL if there are no used buffers, or the "data" token * Returns NULL if there are no used buffers, or the "data" token
* handed to virtqueue_add_buf_gfp(). * handed to virtqueue_add_buf().
*/ */
void *virtqueue_get_buf(struct virtqueue *_vq, unsigned int *len) void *virtqueue_get_buf(struct virtqueue *_vq, unsigned int *len)
{ {
...@@ -490,7 +490,7 @@ EXPORT_SYMBOL_GPL(virtqueue_enable_cb_delayed); ...@@ -490,7 +490,7 @@ EXPORT_SYMBOL_GPL(virtqueue_enable_cb_delayed);
* virtqueue_detach_unused_buf - detach first unused buffer * virtqueue_detach_unused_buf - detach first unused buffer
* @vq: the struct virtqueue we're talking about. * @vq: the struct virtqueue we're talking about.
* *
* Returns NULL or the "data" token handed to virtqueue_add_buf_gfp(). * Returns NULL or the "data" token handed to virtqueue_add_buf().
* This is not valid on an active queue; it is useful only for device * This is not valid on an active queue; it is useful only for device
* shutdown. * shutdown.
*/ */
......
...@@ -25,21 +25,12 @@ struct virtqueue { ...@@ -25,21 +25,12 @@ struct virtqueue {
void *priv; void *priv;
}; };
int virtqueue_add_buf_gfp(struct virtqueue *vq, int virtqueue_add_buf(struct virtqueue *vq,
struct scatterlist sg[], struct scatterlist sg[],
unsigned int out_num, unsigned int out_num,
unsigned int in_num, unsigned int in_num,
void *data, void *data,
gfp_t gfp); gfp_t gfp);
static inline int virtqueue_add_buf(struct virtqueue *vq,
struct scatterlist sg[],
unsigned int out_num,
unsigned int in_num,
void *data)
{
return virtqueue_add_buf_gfp(vq, sg, out_num, in_num, data, GFP_ATOMIC);
}
void virtqueue_kick(struct virtqueue *vq); void virtqueue_kick(struct virtqueue *vq);
......
...@@ -272,7 +272,8 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req) ...@@ -272,7 +272,8 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req)
in = pack_sg_list(chan->sg, out, in = pack_sg_list(chan->sg, out,
VIRTQUEUE_NUM, req->rc->sdata, req->rc->capacity); VIRTQUEUE_NUM, req->rc->sdata, req->rc->capacity);
err = virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc); err = virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc,
GFP_ATOMIC);
if (err < 0) { if (err < 0) {
if (err == -ENOSPC) { if (err == -ENOSPC) {
chan->ring_bufs_avail = 0; chan->ring_bufs_avail = 0;
...@@ -414,7 +415,8 @@ p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req, ...@@ -414,7 +415,8 @@ p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req,
in += pack_sg_list_p(chan->sg, out + in, VIRTQUEUE_NUM, in += pack_sg_list_p(chan->sg, out + in, VIRTQUEUE_NUM,
in_pages, in_nr_pages, uidata, inlen); in_pages, in_nr_pages, uidata, inlen);
err = virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc); err = virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc,
GFP_ATOMIC);
if (err < 0) { if (err < 0) {
if (err == -ENOSPC) { if (err == -ENOSPC) {
chan->ring_bufs_avail = 0; chan->ring_bufs_avail = 0;
......
...@@ -186,21 +186,12 @@ struct virtqueue { ...@@ -186,21 +186,12 @@ struct virtqueue {
#endif #endif
/* Interfaces exported by virtio_ring. */ /* Interfaces exported by virtio_ring. */
int virtqueue_add_buf_gfp(struct virtqueue *vq, int virtqueue_add_buf(struct virtqueue *vq,
struct scatterlist sg[], struct scatterlist sg[],
unsigned int out_num, unsigned int out_num,
unsigned int in_num, unsigned int in_num,
void *data, void *data,
gfp_t gfp); gfp_t gfp);
static inline int virtqueue_add_buf(struct virtqueue *vq,
struct scatterlist sg[],
unsigned int out_num,
unsigned int in_num,
void *data)
{
return virtqueue_add_buf_gfp(vq, sg, out_num, in_num, data, GFP_ATOMIC);
}
void virtqueue_kick(struct virtqueue *vq); void virtqueue_kick(struct virtqueue *vq);
......
...@@ -161,7 +161,8 @@ static void run_test(struct vdev_info *dev, struct vq_info *vq, int bufs) ...@@ -161,7 +161,8 @@ static void run_test(struct vdev_info *dev, struct vq_info *vq, int bufs)
if (started < bufs) { if (started < bufs) {
sg_init_one(&sl, dev->buf, dev->buf_size); sg_init_one(&sl, dev->buf, dev->buf_size);
r = virtqueue_add_buf(vq->vq, &sl, 1, 0, r = virtqueue_add_buf(vq->vq, &sl, 1, 0,
dev->buf + started); dev->buf + started,
GFP_ATOMIC);
if (likely(r >= 0)) { if (likely(r >= 0)) {
++started; ++started;
virtqueue_kick(vq->vq); virtqueue_kick(vq->vq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment