Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

media: dvb-core: dmxdevfilter must always flush bufs

Currently the buffers are being filled until full, which works fine
for the transport stream, but not when reading sections, those have
to be returned to userspace immediately, otherwise dvbv5-scan will
just wait forever.

Add a 'flush' argument to dvb_vb2_fill_buffer to indicate whether
the buffer must be flushed or wait until it is full.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
c4e620ec 8f0b4cce

+11 -8
+4 -4
drivers/media/dvb-core/dmxdev.c
··· 397 397 if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx)) { 398 398 ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx, 399 399 buffer1, buffer1_len, 400 - buffer_flags); 400 + buffer_flags, true); 401 401 if (ret == buffer1_len) 402 402 ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx, 403 403 buffer2, buffer2_len, 404 - buffer_flags); 404 + buffer_flags, true); 405 405 } else { 406 406 ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, 407 407 buffer1, buffer1_len); ··· 452 452 453 453 if (dvb_vb2_is_streaming(ctx)) { 454 454 ret = dvb_vb2_fill_buffer(ctx, buffer1, buffer1_len, 455 - buffer_flags); 455 + buffer_flags, false); 456 456 if (ret == buffer1_len) 457 457 ret = dvb_vb2_fill_buffer(ctx, buffer2, buffer2_len, 458 - buffer_flags); 458 + buffer_flags, false); 459 459 } else { 460 460 if (buffer->error) { 461 461 spin_unlock(&dmxdevfilter->dev->lock);
+3 -2
drivers/media/dvb-core/dvb_vb2.c
··· 249 249 250 250 int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, 251 251 const unsigned char *src, int len, 252 - enum dmx_buffer_flags *buffer_flags) 252 + enum dmx_buffer_flags *buffer_flags, 253 + bool flush) 253 254 { 254 255 unsigned long flags = 0; 255 256 void *vbuf = NULL; ··· 307 306 } 308 307 } 309 308 310 - if (ctx->nonblocking && ctx->buf) { 309 + if (flush && ctx->buf) { 311 310 vb2_set_plane_payload(&ctx->buf->vb, 0, ll); 312 311 vb2_buffer_done(&ctx->buf->vb, VB2_BUF_STATE_DONE); 313 312 list_del(&ctx->buf->list);
+4 -2
include/media/dvb_vb2.h
··· 124 124 return 0; 125 125 }; 126 126 #define dvb_vb2_is_streaming(ctx) (0) 127 - #define dvb_vb2_fill_buffer(ctx, file, wait, flags) (0) 127 + #define dvb_vb2_fill_buffer(ctx, file, wait, flags, flush) (0) 128 128 129 129 static inline __poll_t dvb_vb2_poll(struct dvb_vb2_ctx *ctx, 130 130 struct file *file, ··· 166 166 * @buffer_flags: 167 167 * pointer to buffer flags as defined by &enum dmx_buffer_flags. 168 168 * can be NULL. 169 + * @flush: flush the buffer, even if it isn't full. 169 170 */ 170 171 int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, 171 172 const unsigned char *src, int len, 172 - enum dmx_buffer_flags *buffer_flags); 173 + enum dmx_buffer_flags *buffer_flags, 174 + bool flush); 173 175 174 176 /** 175 177 * dvb_vb2_poll - Wrapper to vb2_core_streamon() for Digital TV