Jean-Baptiste Theou <jtheou <at> adeneo-embedded.us> writes: > > Hi Mauro, > > Thanks for your feedback. > > On Mon, Feb 1, 2016 at 7:33 AM, Mauro Carvalho Chehab > <mchehab <at> osg.samsung.com> wrote: > > Em Fri, 29 Jan 2016 11:05:04 -0800 > > Jean-Baptiste Theou <jtheou <at> adeneo-embedded.us> escreveu: > > > >> For tuners with no_alt_vanc=0, and VBI and analog video device > >> open. > >> There is two ways to close the devices: > >> > >> *First way (start with user=2) > >> > >> VBI first (user=1): URBs for the VBI are killed properly > >> with cx231xx_uninit_vbi_isoc > >> > >> Analog second (user=0): URBs for the Analog are killed > >> properly with cx231xx_uninit_isoc > >> > >> *Second way (start with user=2) > >> > >> Analog first (user=1): URBs for the Analog are NOT killed > >> properly with cx231xx_uninit_isoc, because the exit path > >> is not called this time. > >> > >> VBI first (user=0): URBs for the VBI are killed properly with > >> cx231xx_uninit_vbi_isoc, but we are exiting the function > >> without killing the URBs for the Analog > >> > >> This situation lead to various kernel panics, since > >> the URBs are still processed, without the device been > >> open. > >> > >> The patch fix the issue by calling the exit path no matter > >> what, when user=0, plus remove a duplicate trace. > >> > >> Signed-off-by: Jean-Baptiste Theou <jtheou <at> adeneo-embedded.us> > >> > >> --- > >> > >> - v2: Avoid duplicate code and ensure that the queue are freed > >> properly. > >> --- .... > > > > But the above code should be kept, as we should only stop/free > > resources when neither VBI or Video is running. Other drivers do > > similar things and work properly. See em28xx for example (I'm sure > > em28xx video/vbi is working as expected, as I did such tests last > > week). > > My understanding of this code is that the VBI and the VIDEO device have > they own vb_vidq, > so if videobuf_stop and video_mmap_free are called only when user=0, > one device > (the first one to be close) will not be freed properly. > > This is why I am stopping the use of the buffers and release the memory > first for every call > of close(). > > Am I missing the way this code works? > > > > > Regards, > > Mauro > > Best regards, > > Jean-Baptiste
Not to hijack, but I've just worked through this same issue. For my implementation, i could see that the video endpoint was not properly shutdown by enabling 'isoc_debug' since get_next_buf() would print the "No active queue" messages after the video file handle was closed and not torn down correctly, and while VBI was still open.. I also saw the panics when trying to rmmod. Since the VBI and video are different endpoints and different buffers when (!dev->board.no_alt_vanc) is true, they must be cx231xx_uninit_* independently. When the video fh is closed first and VBI still open, dev->users is > 0 and video is never uninit_. dev->users decrements, VBI fh gets closed, users == 0 and VBI is torn down, but the video endpoint is still running. My solution was to track fh opens of type V4L2_BUF_TYPE_VBI_CAPTURE independently with a new dev->vbi_users and run the cx231xx_uninit_vbi_isoc() block on close when that is 0, and run the other cx231xx_uninit_isoc() block when dev->users == 0. Even if dev->users == 0 while VBI is open, video can still shutdown beforehand. Also, I think the V2 proposed patch might be ok, as long as there's never 2 VBI users (or 1 user and it's just VBI) and thus when dev->users == 0 it's always ok to run the video cx231xx_uninit_* code / set_alt_setting(dev, INDEX_VIDEO,0). I would be happy to share my patch w/ RFC if you're interested, but now I think there's more to this than what all of us have fully considered. --Luke Suchocki -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html