Thread (1 message) 1 message, 1 author, 2007-09-12

Re: SYSFS: need a noncaching read

From: Neil Brown <hidden>
Date: 2007-09-12 17:58:45
Also in: lkml

On Wednesday September 12, nickpiggin@yahoo.com.au wrote:
On Wednesday 12 September 2007 20:01, Greg KH wrote:
quoted
On Wed, Sep 12, 2007 at 07:32:07AM +0200, Robert Schwebel wrote:
quoted
On Tue, Sep 11, 2007 at 11:43:17AM +0200, Heiko Schocher wrote:
quoted
I have developed a device driver and use the sysFS to export some
registers to userspace.
Uuuh, uggly. Don't do that. Device drivers are there to abstract things,
not to play around with registers from userspace.
quoted
I opened the sysFS File for one register and did some reads from this
File, but I alwas becoming the same value from the register, whats not
OK, because they are changing. So I found out that the sysFS caches
the reads ... :-(
Yes, it does. What you can do is close()ing the file handle between
accesses, which makes it work but is slow.
Do an lseek back to 0 and then re-read, you will get called in your
driver again.
Can you do a pread with offset 0 to avoid the two syscalls? (which some
people seem to be concerned about)
No.
Looking in fs/sysfs/file.c, we notice the field "needs_read_fill" in
struct sysfs_buffer.

sysfs_read_file will only call fill_read_buffer  (which calls the
->show routine) if this is 1;

It is cleared by fill_read_buffer and set to 1:
 - at open
 - by fill_write_buffer (i.e. if you write to the file descriptor)
 - by sysfs_poll when an event was detected.

So currently you cannot simply open a sysfs file an read multiple
times.

One option would be to call fill_read_buffer if *ppos == 0.
I cannot see that being a problem in practice, but maybe there is a
reason why it wasn't done that way.
Another option might be to call fill_read_buffer also if 
	buffer->event != atomic_read(&attr_sd->s_event)
and require drivers to call sysfs_notify when they make a change that
should be noticed.  But I doubt that is really important.

NeilBrown
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help