From: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
To: Andy Furniss <adf.lists@gmail.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 15:50:47 -0300 [thread overview]
Message-ID: <20150610155047.25b92662@recife.lan> (raw)
In-Reply-To: <55787382.5010607@gmail.com>
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.
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; \
})
next prev parent reply other threads:[~2015-06-10 18:50 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 [this message]
2015-06-10 20:17 ` Mauro Carvalho Chehab
2015-06-10 22:16 ` Andy Furniss
2015-06-10 21:35 ` Andy Furniss
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=20150610155047.25b92662@recife.lan \
--to=mchehab@osg.samsung.com \
--cc=adf.lists@gmail.com \
--cc=linux-media@vger.kernel.org \
/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).