[linux-dvb] [PATCH] make dvb_ringbuffer compatible to
dmxdev_buffer
Oliver Endriss
o.endriss at gmx.de
Tue Mar 14 13:46:25 CET 2006
Ralph Metzler wrote:
> Andreas Oberritter writes:
> > On Tue, 2006-03-14 at 01:03 +0100, Oliver Endriss wrote:
> > > Andreas Oberritter wrote:
> > > > From: Andreas Oberritter <obi at linuxtv.org>
> > > >
> > > > Added variable 'error' to struct dvb_ringbuffer, which is set to zero on
> > > > init() and flush(). Also reset read an write pointers to zero on flush()
> > > > to get less fragmented data.
> > > >
> > > > Signed-off-by: Andreas Oberritter <obi at linuxtv.org>
> > > > ---
> > > >
> > > > A patch to make dmxdev use dvb_ringbuffer will follow.
> > > >
> > > > diff -r 427667c87c7b linux/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
> > > > --- a/linux/drivers/media/dvb/dvb-core/dvb_ringbuffer.c Sun Mar 12 00:03:47 2006 -0300
> > > > +++ b/linux/drivers/media/dvb/dvb-core/dvb_ringbuffer.c Mon Mar 13 16:02:46 2006 +0100
> > > > ...
> > > > @@ -86,7 +87,8 @@ ssize_t dvb_ringbuffer_avail(struct dvb_
> > > >
> > > > void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)
> > > > {
> > > > - rbuf->pread = rbuf->pwrite;
> > > > + rbuf->pread = rbuf->pwrite = 0;
> > > +++
> > >
> > > Attention, this will convert dvb_ringbuffer_flush() into a writer!
> > >
> > > from dvb_ringbuffer.h:
> > > | ** (2) If there is exactly one reader and one writer, there is no need
> > > | ** to lock read or write operations.
> > > | ** Two or more readers must be locked against each other.
> > > | ** Flushing the buffer counts as a read operation.
> > > +++++++++++++++++++++++++++++++++++++++++++++++
> > > | ** Two or more writers must be locked against each other.
> > >
> > > With this patch flushing the ring buffer is a read _and_ a write
> > > operation. It might break existing code. Are you aware of that?
> >
> > Oliver, can you please take a look at the existing code? It's a
> > performance gain if it doesn't break.
>
> It will definitely break the code. Just look at the writing calls.
> If pwrite changes to 0 right in the middle of one, you will have problems.
> For this case (pwrite=0) you should not get segmentation faults
> but pwrite can end up in a wrong position (!=0) and there will be
> some bogus data at the beginning of the buffer.
>
> > Generally I'd expect a flush to return a buffer into its initial state.
>
> Then you will have to add mutexes and/or locks, at least in the
> write and flush calls. This will of course complicate the code and
> also harm performance. But maybe in your case less than the
> fragmentation you were talking about?
Ack. It will break the av7110 driver. I did not check other drivers.
We would have to add spin_lock/spin_unlock calls around each
ringbuffer_write which would reduce write performance.
How could setting the buffer ptr to 0 increase performance?
Usually it will save a single wrap of the buffer.
Anyway, if you really need this, you should add a new function which
implements this behaviour (dvb_ringbuffer_reset?).
Whenever it is used write locking will be required.
CU
Oliver
--
--------------------------------------------------------
VDR Remote Plugin available at
http://www.escape-edv.de/endriss/vdr/
--------------------------------------------------------
More information about the linux-dvb
mailing list