Commit a6461ad2 authored by Philippe Gerum's avatar Philippe Gerum
Browse files

evl/xbuf: convert inbound buffer lock to hard lock



The data protected by the inbound (oob -> in-band traffic) buffer lock
is frequently accessed from the in-band stage by design, where hard
irqs should be disabled. Conversely, the out-of-band sections are
short enough to bear with interrupt-free execution. Therefore we would
not generally benefit from the preemption disabling feature we are
going to add to the EVL-specific spinlock. Make it a hard lock to
clarify the intent.
Signed-off-by: default avatarPhilippe Gerum <rpm@xenomai.org>
parent 6bec969a
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <evl/clock.h> #include <evl/clock.h>
#include <evl/xbuf.h> #include <evl/xbuf.h>
#include <evl/memory.h> #include <evl/memory.h>
#include <evl/lock.h>
#include <evl/factory.h> #include <evl/factory.h>
#include <evl/sched.h> #include <evl/sched.h>
#include <evl/poll.h> #include <evl/poll.h>
...@@ -47,7 +46,7 @@ struct xbuf_inbound { /* oob_write->read */ ...@@ -47,7 +46,7 @@ struct xbuf_inbound { /* oob_write->read */
struct evl_flag o_event; struct evl_flag o_event;
struct irq_work irq_work; struct irq_work irq_work;
struct xbuf_ring ring; struct xbuf_ring ring;
evl_spinlock_t lock; hard_spinlock_t lock;
}; };
struct xbuf_outbound { /* write->oob_read */ struct xbuf_outbound { /* write->oob_read */
...@@ -300,7 +299,7 @@ static unsigned long inbound_lock(struct xbuf_ring *ring) ...@@ -300,7 +299,7 @@ static unsigned long inbound_lock(struct xbuf_ring *ring)
struct evl_xbuf *xbuf = container_of(ring, struct evl_xbuf, ibnd.ring); struct evl_xbuf *xbuf = container_of(ring, struct evl_xbuf, ibnd.ring);
unsigned long flags; unsigned long flags;
evl_spin_lock_irqsave(&xbuf->ibnd.lock, flags); raw_spin_lock_irqsave(&xbuf->ibnd.lock, flags);
return flags; return flags;
} }
...@@ -309,7 +308,7 @@ static void inbound_unlock(struct xbuf_ring *ring, unsigned long flags) ...@@ -309,7 +308,7 @@ static void inbound_unlock(struct xbuf_ring *ring, unsigned long flags)
{ {
struct evl_xbuf *xbuf = container_of(ring, struct evl_xbuf, ibnd.ring); struct evl_xbuf *xbuf = container_of(ring, struct evl_xbuf, ibnd.ring);
evl_spin_unlock_irqrestore(&xbuf->ibnd.lock, flags); raw_spin_unlock_irqrestore(&xbuf->ibnd.lock, flags);
} }
static int inbound_wait_input(struct xbuf_ring *ring, size_t len, size_t avail) static int inbound_wait_input(struct xbuf_ring *ring, size_t len, size_t avail)
...@@ -678,7 +677,7 @@ xbuf_factory_build(struct evl_factory *fac, const char __user *u_name, ...@@ -678,7 +677,7 @@ xbuf_factory_build(struct evl_factory *fac, const char __user *u_name,
/* Inbound traffic: oob_write() -> read(). */ /* Inbound traffic: oob_write() -> read(). */
init_waitqueue_head(&xbuf->ibnd.i_event); init_waitqueue_head(&xbuf->ibnd.i_event);
evl_init_flag(&xbuf->ibnd.o_event); evl_init_flag(&xbuf->ibnd.o_event);
evl_spin_lock_init(&xbuf->ibnd.lock); raw_spin_lock_init(&xbuf->ibnd.lock);
init_irq_work(&xbuf->ibnd.irq_work, resume_inband_reader); init_irq_work(&xbuf->ibnd.irq_work, resume_inband_reader);
xbuf->ibnd.ring.bufmem = i_bufmem; xbuf->ibnd.ring.bufmem = i_bufmem;
xbuf->ibnd.ring.bufsz = attrs.i_bufsz; xbuf->ibnd.ring.bufsz = attrs.i_bufsz;
......
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