public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jean Delvare <khali@linux-fr.org>
To: "Shem Multinymous" <multinymous@gmail.com>
Cc: "Vojtech Pavlik" <vojtech@suse.cz>,
	"Brown, Len" <len.brown@intel.com>,
	"Pavel Machek" <pavel@suse.cz>,
	"Matthew Garrett" <mjg59@srcf.ucam.org>,
	"kernel list" <linux-kernel@vger.kernel.org>,
	linux-thinkpad@linux-thinkpad.org, linux-acpi@vger.kernel.org,
	"Henrique de Moraes Holschuh" <hmh@debian.org>,
	"Mark Underwood" <basicmark@yahoo.com>,
	"Greg KH" <greg@kroah.com>
Subject: Re: Generic battery interface
Date: Mon, 31 Jul 2006 23:35:36 +0200	[thread overview]
Message-ID: <20060731233536.92b39035.khali@linux-fr.org> (raw)
In-Reply-To: <41840b750607301137t1e10fe88o3a1c73e7a4b4bf44@mail.gmail.com>

Hi Shem,

Disclaimer: I have no idea how the input interface works currently. And
I don't know what problem you are trying to solve. I just thought my
hwmon-oriented comments might help.

> Here's an updated rough proto-spec for the userspace side of the
> continuous-parameter polling interface, intended for hwmon, batteries
> and their ilk, and maybe even the input infrastructure.
> 
> Compared to the parent post, this version adds a second parameter to
> the ioctl (see discussion elsewhere in this thread), and corrects a
> few inaccuracies.
> 
> With an event-based data source, this interface allows polling with no
> time interrupts on tickless kernels. With a polling-based data source
> and a bit of luck, the frequency of polling = frequency of induced
> timer interrupts will be the minimum that satisfies the greediest
> client (even if there are many). In general, complicated data sources
> can be handled optimally by custom driver+infrastructure code. All of
> this is completely transparent  to userspace, which just states its
> needs and has its every desire fulfilled.
> 
> Hardware readouts are obtained from a dedicated file - a sysfs
> attribute (as in hwmon and tp_smapi) or a device file (as in the input
> infrastructure). The file has the following properties:
> 
> 1. A new ioctl DELAYED_UPDATE, with parameters min_wait and
>    min_fresh, meaning: "I want an a fresh readout. If I poll() this FD
>    with POLLIN then send an input-ready event at time is T+min_wait, or
>    when you have a readout that was received from the hardware at  time
>    T+min_fresh, whichever is *later*. Likewise if I select()".
>    Here T is the time of the ioctl call and min_wait>=min_fresh.

"A or B, whichever is later", effectively means "A and B". Or am I
missing something? I fail to see the difference between min_wait and
min_fresh.

> 2. When the file is opened in O_NONBLOCKing mode, read() always return
>    the latest cached readout rather than querying the hardware
>    (unless the latter has negligible cost).
> 3. When the file is opened in normal (blocking) mode, read() blocks
>    until a fresh readout is available and returns this readout; see
>    below.

The hwmon interface (sysfs now, procfs before) has been returning
cached values by defaut for years. Changing this at this point might be
confusing. I don't see much benefit in waiting for updated values
compared to reading them from the cache. The driver knows better how
frequently it can read from the chip. And no hardware monitoring chip I
know of can tell when the monitored value has changed - you have to read
the chip registers to know.

> To illustrate, here's an example of a proper polling loop (sans error
> checking). This app wants to refresh its display when the data has
> changed, but not more often than once per second. It wants the
> readouts to be reasonly spaced: they should be obtained at least 700ms
> apart. And it needs to update its GUI every 3 seconds regardless of
> readouts.

I don't see the point in the 700ms rule. If you don't want new data
more often than once per second, the readouts will be spaced by one
second, which implies > 700ms already.

> Application code:
> --------------------------
> /* Open attribute file with O_NONBLOCK so that all reads will
> * return cached values instead of blocking:
> */
> int fd = open("/whatever/voltage", O_NONBLOCK|O_RDONLY);
> 
> /* Read and process latest cached attribute value: */
> read(fd, ...);
> ...
> 
> while (1) {
> 	const struct delayed_update_req dureq =
> 		{ .min_wait=1000, min_fresh=700 };
> 	struct pollfd ufds = { .fd=fd, events=POLLIN };
> 
> 	/* Tell the driver we want a fresh readout, but no sooner than
> 	 * 1sec from now, and we want the readout to reflect reality no
> 	 * sooner than 700ms now:
> 	 */
> 	ioctl(fd, DELAYED_UPDATE, &dureq);
> 
> 	/* Wait for an update for at most 3 seconds. Nominally this will
> 	* block for at least 1 second, because of the above ioct. If we
> 	* were reading multiple attributes, we could poll them all
> 	* simultaneously.
> 	*/
> 	poll(&ufds, 1, 3000);
> 
> 	/* Read latest cached attribute value: */

No seek(fd, ..., 0) here? sysfs files are supposed to be simple text
files, aren't they?

> 	read(fd, ...);
> 
> 	... handle readout, update GUI ...
> }

-- 
Jean Delvare

  parent reply	other threads:[~2006-07-31 21:35 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-27 20:06 Generic battery interface Brown, Len
2006-07-27 20:32 ` Shem Multinymous
2006-07-27 23:24   ` Vojtech Pavlik
2006-07-28  0:27     ` Shem Multinymous
2006-07-28  0:36       ` Matthew Garrett
2006-07-28  7:42       ` Vojtech Pavlik
2006-07-28 12:25         ` Pavel Machek
2006-07-28 13:43           ` Vojtech Pavlik
2006-07-28 15:38             ` Shem Multinymous
2006-07-28 15:57               ` Valdis.Kletnieks
2006-07-28 22:10                 ` Shem Multinymous
2006-07-28 23:14                   ` Valdis.Kletnieks
2006-07-29  9:48                     ` Shem Multinymous
2006-07-29 10:17                       ` Vojtech Pavlik
2006-07-29 10:30                         ` Shem Multinymous
2006-07-29 10:37                       ` Mark Underwood
2006-07-29 11:35                         ` Shem Multinymous
2006-07-30  8:35                       ` Valdis.Kletnieks
2006-07-30 11:44                         ` Vojtech Pavlik
2006-07-30 11:48                         ` Shem Multinymous
2006-07-31  0:58                           ` Valdis.Kletnieks
2006-07-31  1:34                             ` Shem Multinymous
2006-07-30  9:18             ` Pavel Machek
2006-07-30 10:14               ` Shem Multinymous
2006-07-30 11:33                 ` Shem Multinymous
2006-07-28 12:25         ` Dmitry Torokhov
2006-07-28 13:44           ` Vojtech Pavlik
2006-07-28 15:19           ` Shem Multinymous
2006-07-28 16:10             ` Dmitry Torokhov
2006-07-30  8:55               ` Greg KH
2006-07-30  9:52                 ` Shem Multinymous
2006-07-30 11:47                   ` Vojtech Pavlik
2006-07-30 12:50                     ` Shem Multinymous
2006-07-30 14:29                   ` Tomasz Torcz
2006-07-30 14:48                     ` Shem Multinymous
2006-07-30 11:46                 ` Vojtech Pavlik
2006-07-28 15:14         ` Shem Multinymous
2006-07-28 20:23           ` Vojtech Pavlik
2006-07-28 22:48             ` Shem Multinymous
2006-07-28 23:17               ` Pavel Machek
2006-07-29 10:36               ` Vojtech Pavlik
2006-07-29 11:32                 ` Shem Multinymous
2006-07-29 12:04                   ` Vojtech Pavlik
2006-07-29 12:51                     ` Shem Multinymous
2006-07-29 13:42                       ` Vojtech Pavlik
2006-07-30  9:00                         ` Greg KH
2006-07-29 21:06               ` Shem Multinymous
2006-07-30 10:05                 ` Pavel Machek
2006-07-30 10:34                   ` Shem Multinymous
2006-07-30 10:37                     ` Pavel Machek
2006-07-30 18:37                 ` Shem Multinymous
     [not found]                   ` <20060731113735.GA22081@creature.apm.etc.tu-bs.de>
2006-07-31 15:18                     ` [ltp] " Shem Multinymous
     [not found]                       ` <20060731183719.GB22081@creature.apm.etc.tu-bs.de>
2006-07-31 22:45                         ` Shem Multinymous
     [not found]                           ` <20060801114303.GA13000@creature.apm.etc.tu-bs.de>
2006-08-02 21:59                             ` Shem Multinymous
2006-07-31 21:35                   ` Jean Delvare [this message]
2006-07-31 22:34                     ` Shem Multinymous
2006-07-31 23:01                     ` Pavel Machek
2006-08-02  7:18                       ` Jean Delvare
2006-08-02  7:46                         ` Marek Wawrzyczny
2006-08-03 11:29                         ` Thomas Renninger
2006-08-03 16:33                           ` Pavel Machek
2006-07-27 22:16 ` Pavel Machek
2006-07-27 22:56   ` Shem Multinymous
2006-07-27 23:08     ` Greg KH
2006-07-27 23:24       ` Pavel Machek
2006-07-30 12:29         ` Jean Delvare
2006-08-02 19:51           ` Pavel Machek
2006-08-03  9:20             ` Jean Delvare
2006-07-27 22:56   ` Greg KH
2006-07-27 23:31   ` Vojtech Pavlik
2006-07-28  0:35     ` Shem Multinymous
2006-07-28 10:11       ` Vojtech Pavlik
  -- strict thread matches above, loose matches on Subject: below --
2006-07-28  4:05 Brown, Len
2006-07-28  8:22 ` Johan Vromans
2006-07-28  9:58 ` Matthew Garrett
2006-07-28 10:10   ` Vojtech Pavlik
2006-07-28 12:21 ` Pavel Machek
2006-07-28 14:13 ` Shem Multinymous
2006-07-27 23:20 Brown, Len
2006-07-28  0:10 ` Shem Multinymous
2006-07-27 15:40 Brown, Len
2006-07-27 16:23 ` Shem Multinymous
2006-07-27 16:50   ` Daniel Barkalow
2006-07-27 20:07     ` Shem Multinymous
2006-07-27  0:20 Pavel Machek
2006-07-27 14:05 ` Matthew Garrett
2006-07-27 14:39   ` Shem Multinymous
2006-07-27 14:44     ` Matthew Garrett
2006-07-27 22:42       ` Greg KH
2006-07-27 14:59     ` Pavel Machek
2006-07-27 15:10       ` Shem Multinymous

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=20060731233536.92b39035.khali@linux-fr.org \
    --to=khali@linux-fr.org \
    --cc=basicmark@yahoo.com \
    --cc=greg@kroah.com \
    --cc=hmh@debian.org \
    --cc=len.brown@intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-thinkpad@linux-thinkpad.org \
    --cc=mjg59@srcf.ucam.org \
    --cc=multinymous@gmail.com \
    --cc=pavel@suse.cz \
    --cc=vojtech@suse.cz \
    /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