From: Andy Furniss <adf.lists@gmail.com>
To: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Cc: linux-media@vger.kernel.org
Subject: Re: dvbv5-tzap with pctv 290e/292e needs EAGAIN for pat/pmt to work when recording.
Date: Wed, 10 Jun 2015 22:35:24 +0100 [thread overview]
Message-ID: <5578AD9C.7090208@gmail.com> (raw)
In-Reply-To: <20150610155047.25b92662@recife.lan>
Mauro Carvalho Chehab wrote:
> Em Wed, 10 Jun 2015 18:27:30 +0100
> Andy Furniss <adf.lists@gmail.com> escreveu:
>
>> Mauro Carvalho Chehab wrote:
>>
>>> Just applied a fix for it:
>>> http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=c7c9af17163f282a147ea76f1a3c0e9a0a86e7fa
>>>
>>> It will retry up to 10 times. This should very likely be enough if the
>>> driver doesn't have any bug.
>>>
>>> Please let me know if this fixes the issue.
>>
>> No, it doesn't, so I reverted the above and added back my hack + a
>> counter as below and it seems to be retrying > a million times.
>
> Hmm.... that's likely a bug at the demod driver. It doesn't make much
> sense to keep a mutex hold for that long.
>
> Anyway, I modified the patch to use a timeout of 1 second, instead of
> trying 10 times. It is still a hack, as IMHO this is a driver bug,
> but it should produce a better result.
>
> Please check if the patch below works for you.
>
> You may change the MAX_TIME there if 1 second is not enough.
>
> It could be interesting if you add a printf with the difference
> between start and end time, for us to have an idea about how
> much time the driver is kept on such unreliable state.
>
> Thanks!
> Mauro
>
>
> [PATCH] libdvbv5: use a timeout for ioctl
>
> Some frontends don't play nice: they return -EAGAIN if the
> device doesn't lock. That actually means that it may take
> some time for some ioctl's to succeed. On experimental tests,
> the loop may happen ~2 million times!
>
> Well, better to waste power on a loop than to fail. So, let's
> change the code that detects EAGAIN by a loop that waits up
> to 1 second.
>
> This is not the right thing to do, but the Kernel drivers
> require fixes. We can do it only for newer versions of the
> Kernel.
I can't get this to work - it instantly bails -
read_sections: read error: Resource temporarily unavailable
couldn't find pmt-pid for sid 10bf
will try more later/tomorrow.
I notice there are a couple of suspect bitwise | but changing to ||
didn't help.
>
> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
>
> diff --git a/lib/libdvbv5/dvb-demux.c b/lib/libdvbv5/dvb-demux.c
> index 867d7b9dddde..af124ae3a7cc 100644
> --- a/lib/libdvbv5/dvb-demux.c
> +++ b/lib/libdvbv5/dvb-demux.c
> @@ -30,6 +30,7 @@
> #include <string.h>
> #include <unistd.h>
> #include <stdio.h>
> +#include <time.h>
> #include <errno.h>
>
> #include <sys/ioctl.h>
> @@ -40,12 +41,25 @@
>
> #include <libdvbv5/dvb-demux.h>
>
> +#define MAX_TIME 10 /* 1.0 seconds */
> +
> #define xioctl(fh, request, arg...) ({ \
> - int __rc, __retry; \
> + int __rc; \
> + struct timespec __start, __end; \
> \
> - for (__retry = 0; __retry < 10; __retry++) { \
> + clock_gettime(CLOCK_MONOTONIC, &__start); \
> + do { \
> __rc = ioctl(fh, request, ##arg); \
> - } while (__rc == -1 && ((errno == EINTR) || (errno == EAGAIN)));\
> + if (__rc != -1) \
> + break; \
> + if (!((errno == EINTR) | (errno == EAGAIN))) \
> + break; \
> + clock_gettime(CLOCK_MONOTONIC, &__end); \
> + if (__end.tv_sec * 10 + __end.tv_nsec / 100000000 > \
> + __start.tv_sec * 10 + __start.tv_nsec / 100000000 + \
> + MAX_TIME) \
> + break; \
> + } while (1); \
> \
> __rc; \
> })
> diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c
> index 48b09cd9ceaa..8607401841f2 100644
> --- a/lib/libdvbv5/dvb-fe.c
> +++ b/lib/libdvbv5/dvb-fe.c
> @@ -26,6 +26,7 @@
> #include <inttypes.h>
> #include <math.h>
> #include <stddef.h>
> +#include <time.h>
> #include <unistd.h>
>
> #include <config.h>
> @@ -43,12 +44,25 @@ static int libdvbv5_initialized = 0;
>
> # define N_(string) string
>
> +#define MAX_TIME 10 /* 1.0 seconds */
> +
> #define xioctl(fh, request, arg...) ({ \
> - int __rc, __retry; \
> + int __rc; \
> + struct timespec __start, __end; \
> \
> - for (__retry = 0; __retry < 10; __retry++) { \
> + clock_gettime(CLOCK_MONOTONIC, &__start); \
> + do { \
> __rc = ioctl(fh, request, ##arg); \
> - } while (__rc == -1 && ((errno == EINTR) || (errno == EAGAIN)));\
> + if (__rc != -1) \
> + break; \
> + if (!((errno == EINTR) | (errno == EAGAIN))) \
> + break; \
> + clock_gettime(CLOCK_MONOTONIC, &__end); \
> + if (__end.tv_sec * 10 + __end.tv_nsec / 100000000 > \
> + __start.tv_sec * 10 + __start.tv_nsec / 100000000 + \
> + MAX_TIME) \
> + break; \
> + } while (1); \
> \
> __rc; \
> })
>
>
prev parent reply other threads:[~2015-06-10 21:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-02 22:25 dvbv5-tzap with pctv 290e/292e needs EAGAIN for pat/pmt to work when recording Andy Furniss
2015-06-10 12:52 ` Mauro Carvalho Chehab
2015-06-10 17:27 ` Andy Furniss
2015-06-10 18:50 ` Mauro Carvalho Chehab
2015-06-10 20:17 ` Mauro Carvalho Chehab
2015-06-10 22:16 ` Andy Furniss
2015-06-10 21:35 ` Andy Furniss [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5578AD9C.7090208@gmail.com \
--to=adf.lists@gmail.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@osg.samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).