linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: Andreas Oberritter <obi@linuxtv.org>
Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>, HoP <jpetrous@gmail.com>,
	Florian Fainelli <f.fainelli@gmail.com>,
	linux-media@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [RFC] vtunerc: virtual DVB device - is it ok to NACK driver because of worrying about possible misusage?
Date: Tue, 06 Dec 2011 13:06:09 -0200	[thread overview]
Message-ID: <4EDE2F61.301@redhat.com> (raw)
In-Reply-To: <4EDE28EB.7050407@linuxtv.org>

On 06-12-2011 12:38, Andreas Oberritter wrote:
> On 06.12.2011 15:13, Mauro Carvalho Chehab wrote:
>> O_NONBLOCK
>>      When opening a FIFO with O_RDONLY or O_WRONLY set:
>                       ^^^^ This does not apply.
>
> [...]
>
>>      When opening a block special or character special file that supports
>> non-blocking opens:
>>
>>          If O_NONBLOCK is set, the open() function shall return without
>> blocking for the device to be ready or available. Subsequent behavior of
>> the device is device-specific.
>
> This is the important part:
> - It specifies the behaviour of open(), not ioctl(). I don't see a
> reason why open should block with vtunerc.
> - Read again: "Subsequent behavior of the device is device-specific."
>
>>          If O_NONBLOCK is clear, the open() function shall block the
>> calling thread until the device is ready or available before returning.
>>
>>      Otherwise, the behavior of O_NONBLOCK is unspecified.
>>
>> Basically, syscall should not block waiting for some data to be read (or
>> written).
>
> That's because open() does not read or write.
>
>> The ioctl definition defines [EAGAIN] error code, if, for any reason, an
>> ioctl would block.
>
> Fine.
>
>> Btw, the vtunerc doesn't handle O_NONBLOCK flag. For each DVB ioctl, for
>> example
>> read_snr[1], it calls wait_event_interruptible()[2], even if the
>> application opens
>> it with O_NONBLOCK flag. So, it is likely that non-blocking-mode
>> applications
>> will break.
>
> Of course, read operations must wait until the value read is available
> or an error (e.g. timeout, i/o error) occurs. Whether it's an i2c
> transfer, an usb transfer or a network transfer doesn't make a
> difference. Every transfer takes a nonzero amount of time.

Yes, posix is not 100% clear about what "non block" means for ioctl's, but
waiting for an event is clearly a block condition. This is different than
doing something like mdelay() (or even mleep()) in order to wait for an
specific amount of time for an operation to complete.

A vtunerc => daemon => network transfer =>daemon => vtunerc is a block condition,
as the network may return in a few ms or may not return and a long
timeout at the daemon would give an error. Also, as the daemon may be swapped
to disk (as the daemon runs on userspace), this may even involve other
blocking operations at the block layer.

> As Honza already demonstrated, in a typical LAN setup, this takes only
> few milliseconds, which with fast devices may even be faster than some
> slow local devices using many delays in their driver code.
>
> If an application breaks because of that, then it's a bug in the
> application which may as well be triggered by a local driver and thus
> needs to be fixed anyway.

It is not a bug in the application. It requested a non-block mode. The driver
is working in block mode instead. It is a driver's bug.

>>> Mauro, if the network is broken, any application using the network will
>>> break. No specially designed protocol will fix that.
>>
>> A high delay network (even a congested one) is not broken, if it can
>> still provide the throughput required by the application, and a latency/QoS
>> that would fit.
>
> Then neither vtunerc nor any other application will break. Fine.
>
>>> If you want to enforce strict maximum latencies, you can do that in the
>>> userspace daemon using the vtunerc interface. It has all imaginable
>>> possibilities to control data flow over the network and to return errors
>>> to vtunerc.
>>
>> Yes, you can do anything you want at the userspace daemon, but the
>> non-userspace daemon aware applications will know nothing about it, and
>> this is the flaw on this design: Applications can't negotiate what network
>> parameters are ok or not for its usecase.
>
> How do you negotiate network parameters with your ISP and all involved
> parties on the internet on the way from your DSL line to some other
> peer? Let me answer it: You don't.

TCP flow control mechanisms, RSVP, MPLS, IP QoS flags, ICMP messages, etc.

>>> For a DVB API application it doesn't matter whether a tuning
>>> request fails with EIO because a USB device has been removed, a PCI
>>> device encountered an I2C error or because the vtuner userspace daemon
>>> returned an error.
>>
>> When you go to network, there are several errors that are transitory.
>> For example,
>> a dropped link may cause the routing protocol (RIP, BGP or whatever) to
>> re-direct
>> several routes (or, on a LAN, a spanning-tree re-negotiation), causing a
>> temporary
>> failure to deliver a few packets. All network-based application are written
>> to consider temporary failures.
>
> I seriously doubt that, unless "consider" means "print an error and
> exit" or "all" means "some".
> Anyway, such temporary failures can be handled by the userspace daemon.
>
>> This is fundamentally different than an application designed to talk
>> directly with
>> the hardware, where an error is generally fatal.
>
> Fatal or not, if you return a temporary error code like EAGAIN, for
> example, that's not the case.
>
> Do you recommend applications to just die if an ioctl fails?

Network applications (Youtube, Skype, mplayer, you name it) have
mechanisms to handle high delays, congestion, etc. Cheating with a non-network
application to work via the network is not the same as a network-based application.
You'll never achieve the same result. Only if the network is close to a
"pure wire" (e. g., no congestion, no packet loss, etc), such solution
works.

> Btw.: How do you handle firmware uploads via I2C in non-blocking mode?
> Should applications always fail if a firmware upload that takes longer
> than some ms, e.g. when tuning to a different delivery system or when
> the firmware is yet to be loaded before the first ioctl may run?

The right thing to do is to return -EAGAIN for all syscalls while the firmware
is not loaded. Unfortunately, several driversdon't do the right thing.

Regards,
Mauro.

  reply	other threads:[~2011-12-06 15:06 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-30 21:38 [RFC] vtunerc: virtual DVB device - is it ok to NACK driver because of worrying about possible misusage? HoP
2011-11-30 21:52 ` Michael Krufky
2011-12-01  0:09 ` Andreas Oberritter
2011-12-01 11:04   ` Mauro Carvalho Chehab
2011-12-01 14:58     ` HoP
2011-12-01 17:38       ` Mauro Carvalho Chehab
2011-12-01 19:59         ` HoP
2011-12-01 20:38           ` Mauro Carvalho Chehab
2011-12-01 22:55             ` Andreas Oberritter
2011-12-02 11:14               ` Mauro Carvalho Chehab
2011-12-02 11:40                 ` Rémi Denis-Courmont
2011-12-02 11:48                 ` Andreas Oberritter
2011-12-02 12:05                   ` Rémi Denis-Courmont
2011-12-02 11:57                 ` HoP
2011-12-02 17:33                   ` Mauro Carvalho Chehab
     [not found]                     ` <3D233F78EE854A4BA3D34C11AD4FAC1FDD141F@nasanexd01b.na.qualcomm.com>
2011-12-05 18:16                       ` V4L2 driver node directory structure under /video directory Mauro Carvalho Chehab
2011-12-02 17:49           ` [RFC] vtunerc: virtual DVB device - is it ok to NACK driver because of worrying about possible misusage? Rémi Denis-Courmont
2011-12-02 18:16             ` Andreas Oberritter
2011-12-02 18:28               ` Andreas Oberritter
2011-12-02 23:19       ` Alan Cox
2011-12-03  0:37         ` HoP
2011-12-05 10:21           ` Florian Fainelli
2011-12-05 14:28             ` HoP
2011-12-05 15:16               ` Alan Cox
2011-12-05 15:18               ` Michael Krufky
2011-12-06  0:16                 ` HoP
2011-12-05 17:39               ` Mauro Carvalho Chehab
2011-12-05 20:41                 ` Andreas Oberritter
2011-12-05 20:55                   ` Alan Cox
2011-12-05 21:20                     ` Andreas Oberritter
2011-12-05 21:54                       ` Alan Cox
2011-12-06 11:18                       ` Mark Brown
2011-12-06 12:01                         ` Andreas Oberritter
2011-12-06 13:10                           ` Mauro Carvalho Chehab
2011-12-06 13:35                             ` Andreas Oberritter
2011-12-06 14:13                               ` Mauro Carvalho Chehab
2011-12-06 14:38                                 ` Andreas Oberritter
2011-12-06 15:06                                   ` Mauro Carvalho Chehab [this message]
2011-12-06 15:36                                     ` Manu Abraham
2011-12-06 11:21                   ` Mark Brown
2011-12-06 12:01                     ` Andreas Oberritter
2011-12-06 14:19                       ` Mark Brown
2011-12-06 14:48                         ` Andreas Oberritter
2011-12-07 13:49                           ` Mark Brown
2011-12-07 14:01                             ` Andreas Oberritter
2011-12-07 16:10                               ` Mark Brown
2011-12-07 16:56                                 ` Andreas Oberritter
2011-12-07 16:58                                 ` Andreas Oberritter
2011-12-07 21:48                               ` Patrick Dickey
2011-12-07 22:53                                 ` Honza Petrouš
2011-12-07 23:55                                 ` Andreas Oberritter
2011-12-06 17:19                         ` Manu Abraham
2011-12-06  0:07                 ` HoP
2011-12-06 13:22                   ` Mauro Carvalho Chehab
2011-12-06 13:49                     ` Andreas Oberritter
2011-12-06 14:19                       ` Rémi Denis-Courmont
2011-12-06 15:05                         ` Andreas Oberritter
2011-12-06 14:20                       ` Mauro Carvalho Chehab
2011-12-06 15:00                         ` Andreas Oberritter
2011-12-06 17:35                           ` HoP
2011-12-03 16:13         ` Andreas Oberritter
2011-12-03 16:42           ` Alan Cox
2011-12-03 17:38             ` Andreas Oberritter
2011-12-03 17:21           ` VDR User
2011-12-03 17:42             ` Alan Cox
2011-12-03 17:48               ` Devin Heitmueller
2011-12-04 23:54                 ` HoP
2011-12-03 18:13               ` Hans Petter Selasky
2011-12-05  0:05                 ` HoP
2011-12-03 18:17               ` Andreas Oberritter
2011-12-03 23:30             ` Walter Van Eetvelt
2011-12-04  0:14               ` VDR User
2011-12-04 14:44                 ` Alan Cox
2011-12-04 23:22             ` HoP
2011-12-05  1:45               ` VDR User
2011-12-05  6:20                 ` HoP
2011-12-01 11:50   ` Communication misunderstanding? (was: Re: [RFC] vtunerc: virtual DVB device - is it ok to NACK driver because of worrying about possible misusage?) Patrick Boettcher
2011-12-01 12:33 ` [RFC] vtunerc: virtual DVB device Rémi Denis-Courmont
2011-12-01 14:39   ` HoP
2011-12-02 18:32 ` [RFC] vtunerc: virtual DVB device - is it ok to NACK driver because of worrying about possible misusage? VDR User

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=4EDE2F61.301@redhat.com \
    --to=mchehab@redhat.com \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=f.fainelli@gmail.com \
    --cc=jpetrous@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=obi@linuxtv.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).