Re: [PATCH] media: dmxdev: remove dvb_ringbuffer_flush() on writer side

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Soeren,

Thanks for the patch!

On Sun, Apr 14, 2013 at 11:03:42AM +0200, Soeren Moch wrote:
> In dvb_ringbuffer lock-less synchronizationof reader and writer threads is done
> with separateread and write pointers. Sincedvb_ringbuffer_flush() modifies the
> read pointer, this function must not be called from the writer thread.
> 
> This patch removes the dvb_ringbuffer_flush() calls in the dmxdev ringbuffer
> write functions, this fixes Oopses "Unable to handle kernel paging request"
> I could observe for the call chaindvb_demux_read ->dvb_dmxdev_buffer_read ->
> dvb_ringbuffer_read_user -> __copy_to_user (the reader side of the ringbuffer).
> 
> The flush calls at the write side are not necessary anyway since ringbuffer_flush
> is also called in dvb_dmxdev_buffer_read() when an error condition is set in the
> ringbuffer.
> 
> This patch should also be applied to stable kernels.
> 
> Signed-off-by: Soeren Moch <smoch@xxxxxx>
> CC: <stable@xxxxxxxxxxxxxxx>

While the change the patch does itself appears sound to me, I need to ask
you to resend the patch using git send-email (it won't apply as-is). I can
do that this time, too; let me know what works for you.

Reviewed-by: Sakari Ailus <sakari.ailus@xxxxxx>

> --- a/drivers/media/dvb-core/dmxdev.c	2013-04-05 21:21:15.000000000 +0200
> +++ b/drivers/media/dvb-core/dmxdev.c	2013-04-14 09:01:58.000000000 +0200
> @@ -377,10 +377,8 @@ static int dvb_dmxdev_section_callback(c
>  		ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer2,
>  					      buffer2_len);
>  	}
> -	if (ret < 0) {
> -		dvb_ringbuffer_flush(&dmxdevfilter->buffer);
> +	if (ret < 0)
>  		dmxdevfilter->buffer.error = ret;
> -	}
>  	if (dmxdevfilter->params.sec.flags & DMX_ONESHOT)
>  		dmxdevfilter->state = DMXDEV_STATE_DONE;
>  	spin_unlock(&dmxdevfilter->dev->lock);
> @@ -416,10 +414,8 @@ static int dvb_dmxdev_ts_callback(const
>  	ret = dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len);
>  	if (ret == buffer1_len)
>  		ret = dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len);
> -	if (ret < 0) {
> -		dvb_ringbuffer_flush(buffer);
> +	if (ret < 0)
>  		buffer->error = ret;
> -	}
>  	spin_unlock(&dmxdevfilter->dev->lock);
>  	wake_up(&buffer->queue);
>  	return 0;
> 

-- 
Kind regards,

Sakari Ailus
e-mail: sakari.ailus@xxxxxx	XMPP: sailus@xxxxxxxxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux