Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1638531
| From | Jason Wang <jasowang@redhat.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH net-next V4 04/10] ptr_ring: introduce batch dequeuing |
| Date | 2017-05-10 05:40 +0200 |
| Message-ID | <tFqDL-3bV-9@gated-at.bofh.it> (permalink) |
| References | <tFqDL-3bV-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
This patch introduce a batched version of consuming, consumer can
dequeue more than one pointers from the ring at a time. We don't care
about the reorder of reading here so no need for compiler barrier.
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
include/linux/ptr_ring.h | 65 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 65 insertions(+)
diff --git a/include/linux/ptr_ring.h b/include/linux/ptr_ring.h
index 796b90f..d8c97ec 100644
--- a/include/linux/ptr_ring.h
+++ b/include/linux/ptr_ring.h
@@ -278,6 +278,22 @@ static inline void *__ptr_ring_consume(struct ptr_ring *r)
return ptr;
}
+static inline int __ptr_ring_consume_batched(struct ptr_ring *r,
+ void **array, int n)
+{
+ void *ptr;
+ int i;
+
+ for (i = 0; i < n; i++) {
+ ptr = __ptr_ring_consume(r);
+ if (!ptr)
+ break;
+ array[i] = ptr;
+ }
+
+ return i;
+}
+
/*
* Note: resize (below) nests producer lock within consumer lock, so if you
* call this in interrupt or BH context, you must disable interrupts/BH when
@@ -328,6 +344,55 @@ static inline void *ptr_ring_consume_bh(struct ptr_ring *r)
return ptr;
}
+static inline int ptr_ring_consume_batched(struct ptr_ring *r,
+ void **array, int n)
+{
+ int ret;
+
+ spin_lock(&r->consumer_lock);
+ ret = __ptr_ring_consume_batched(r, array, n);
+ spin_unlock(&r->consumer_lock);
+
+ return ret;
+}
+
+static inline int ptr_ring_consume_batched_irq(struct ptr_ring *r,
+ void **array, int n)
+{
+ int ret;
+
+ spin_lock_irq(&r->consumer_lock);
+ ret = __ptr_ring_consume_batched(r, array, n);
+ spin_unlock_irq(&r->consumer_lock);
+
+ return ret;
+}
+
+static inline int ptr_ring_consume_batched_any(struct ptr_ring *r,
+ void **array, int n)
+{
+ unsigned long flags;
+ int ret;
+
+ spin_lock_irqsave(&r->consumer_lock, flags);
+ ret = __ptr_ring_consume_batched(r, array, n);
+ spin_unlock_irqrestore(&r->consumer_lock, flags);
+
+ return ret;
+}
+
+static inline int ptr_ring_consume_batched_bh(struct ptr_ring *r,
+ void **array, int n)
+{
+ int ret;
+
+ spin_lock_bh(&r->consumer_lock);
+ ret = __ptr_ring_consume_batched(r, array, n);
+ spin_unlock_bh(&r->consumer_lock);
+
+ return ret;
+}
+
/* Cast to structure type and call a function without discarding from FIFO.
* Function must return a value.
* Callers must take consumer_lock.
--
2.7.4
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH net-next V4 00/10] vhost_net batch dequeuing Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 [PATCH net-next V4 04/10] ptr_ring: introduce batch dequeuing Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 [PATCH net-next V4 08/10] tun: support receiving skb through msg_control Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 [PATCH net-next V4 09/10] tap: support receiving skb from msg_control Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 [PATCH net-next V4 05/10] skb_array: introduce batch dequeuing Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 [PATCH net-next V4 01/10] ptr_ring: batch ring zeroing Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 [PATCH net-next V4 07/10] tap: export skb_array Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 [PATCH net-next V4 03/10] skb_array: introduce skb_array_unconsume Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 [PATCH net-next V4 02/10] ptr_ring: add ptr_ring_unconsume Jason Wang <jasowang@redhat.com> - 2017-05-10 05:40 +0200 Re: [PATCH net-next V4 00/10] vhost_net batch dequeuing "Michael S. Tsirkin" <mst@redhat.com> - 2017-05-10 14:40 +0200
csiph-web