|
@@ -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.
|