Skip to content

Commit bfbc0b5

Browse files
axboetorvalds
authored andcommitted
media: dvb-core: fix wrong reinitialization of ringbuffer on reopen
dvb_dvr_open() calls dvb_ringbuffer_init() when a new reader opens the DVR device. dvb_ringbuffer_init() calls init_waitqueue_head(), which reinitializes the waitqueue list head to empty. Since dmxdev->dvr_buffer.queue is a shared waitqueue (all opens of the same DVR device share it), this orphans any existing waitqueue entries from io_uring poll or epoll, leaving them with stale prev/next pointers while the list head is reset to {self, self}. The waitqueue and spinlock in dvr_buffer are already properly initialized once in dvb_dmxdev_init(). The open path only needs to reset the buffer data pointer, size, and read/write positions. Replace the dvb_ringbuffer_init() call in dvb_dvr_open() with direct assignment of data/size and a call to dvb_ringbuffer_reset(), which properly resets pread, pwrite, and error with correct memory ordering without touching the waitqueue or spinlock. Cc: [email protected] Fixes: 34731df ("V4L/DVB (3501): Dmxdev: use dvb_ringbuffer") Reported-by: [email protected] Tested-by: [email protected] Link: https://lore.kernel.org/all/[email protected]/ Signed-off-by: Jens Axboe <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 7dff99b commit bfbc0b5

1 file changed

Lines changed: 3 additions & 1 deletion

File tree

drivers/media/dvb-core/dmxdev.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,9 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
168168
mutex_unlock(&dmxdev->mutex);
169169
return -ENOMEM;
170170
}
171-
dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE);
171+
dmxdev->dvr_buffer.data = mem;
172+
dmxdev->dvr_buffer.size = DVR_BUFFER_SIZE;
173+
dvb_ringbuffer_reset(&dmxdev->dvr_buffer);
172174
if (dmxdev->may_do_mmap)
173175
dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr",
174176
&dmxdev->mutex,

0 commit comments

Comments
 (0)