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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.