Re: Re: [PATCH 3/3] media: check status of dmxdev->exit in poll functions of demux&dvr

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

 



> Actually, poll() may return an error as well (from poll() manpage):

> "RETURN VALUE
>        On success, a positive number is returned; this is the number of struc‐
>        tures which have nonzero revents fields (in other words, those descrip‐
>        tors  with events or errors reported).  A value of 0 indicates that the
>        call timed out and no file descriptors were ready.   On  error,  -1  is
>        returned, and errno is set appropriately."

> So, if the Kernel returns -ENODEV, the glibc poll() wrapper would return -1
> and errno will be ENODEV. Never actually tested if this works on poll()
> though.

> Actually, poll() may return an error as well (from poll() manpage):

> "RETURN VALUE
>        On success, a positive number is returned; this is the number of struc‐
>        tures which have nonzero revents fields (in other words, those descrip‐
>        tors  with events or errors reported).  A value of 0 indicates that the
>        call timed out and no file descriptors were ready.   On  error,  -1  is
>        returned, and errno is set appropriately."

> So, if the Kernel returns -ENODEV, the glibc poll() wrapper would return -1
> and errno will be ENODEV. Never actually tested if this works on poll()
> though.

maybe the poll() manpage is wrong.
The standard system call poll() can not get -ENODEV from errno. 
My experiment has proved that I was right(return -ENODEV directly in dvb_dvr_poll).  
and you can also check code of do_poll() and do_sys_poll() in select.c file, it also shows that -ENODEV is invalid.

please also check that.

thanks!
Xiong changbing

------- Original Message -------
Sender : Mauro Carvalho Chehab<m.chehab@xxxxxxxxxxx> Director/SRBR-Open Source/삼성전자
Date : 九月 02, 2014 15:00 (GMT+09:00)
Title : Re: [PATCH 3/3] media: check status of dmxdev->exit in poll functions of demux&dvr

Em Tue, 02 Sep 2014 03:16:00 +0000 (GMT)
Changbing Xiong escreveu:

> 
> > Well, we may start returning -ENODEV when such event happens. 
> 
> > At the frontend, we could use fe->exit = DVB_FE_DEVICE_REMOVED to
> > signalize it. I don't think that the demod frontend has something
> > similar.
> 
> > Yet, it should be up to the userspace application to properly handle 
> > the error codes and close the devices on fatal non-recovery errors like
> > ENODEV. 
> 
> > So, what we can do, at Kernel level, is to always return -ENODEV when
> > the device is known to be removed, and double check libdvbv5 if it
> > handles such error properly.
> 
>  well, we do not use libdvbv5,

The upstream stuff I maintain, related to it, are the media subsystems
and libdvbv5. Of course, other apps will need to be patched as well.

> and  -ENODEV can be returned by read syscall,  
> but for poll syscall,

Actually, poll() may return an error as well (from poll() manpage):

"RETURN VALUE
       On success, a positive number is returned; this is the number of struc‐
       tures which have nonzero revents fields (in other words, those descrip‐
       tors  with events or errors reported).  A value of 0 indicates that the
       call timed out and no file descriptors were ready.   On  error,  -1  is
       returned, and errno is set appropriately."

So, if the Kernel returns -ENODEV, the glibc poll() wrapper would return -1
and errno will be ENODEV. Never actually tested if this works on poll()
though.

>  -ENODEV can never be returned to user, as negative number
>  is invalid  type for poll returned value. please refer to my second patch.
> 
> and in our usage, whether to read the device is up to the poll result. if tuner is plugged out, 
> and there is no data in dvr ringbuffer. then user code will still go on polling the dvr device and never stop.
> if POLLERR is returned, then user will perform read dvr, and then -ENODEV can be got, and 
> user will stop polling dvr device.

Your app should be also be handling poll() errors, as there are already
other errors that poll() can return.

> the first patch is enough to fix the deadlock issue.
> the second patch is used to correct the wrong type of returned value.
> the third patch is used to provide user a better controlling logic.

I'll take a deeper look and do some tests on your patches likely
tomorrow. 

Regards,
Mauro
--
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��.n��������+%����;��w��{.n�����{��g����^n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�


[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