Re: refcounting drivers' data structures used in sysfs buffers

From: Oliver Neukum
Date: Mon Mar 12 2007 - 04:54:52 EST


Am Samstag, 10. März 2007 20:19 schrieb Alan Stern:
> On Fri, 9 Mar 2007, Oliver Neukum wrote:
>
> > Am Freitag, 9. März 2007 21:08 schrieb Alan Stern:
> > > After some more thought, I basically agree with what Oliver wrote
> > > originally.  sysfs_dirent is indeed the logical place to store the kref
> > > pointer.  However it needs to be used during open and release, not during
> >
> > OK.
> >
> > > read, write, and poll.  Another point, which Oliver didn't think of, is
> > > that the kref pointer needs to be passed to the driver as an argument in
> > > the show() and store() method calls.
> >
> > Why? What's wrong with simply calling kref_get/put?
>
> It's the same old problem: the race between unbind and sysfs I/O. What
> good does holding a reference to the private data structure do if the
> show/store method gets called after the driver has been unbound from the
> device? dev_get_drvdata() will no longer provide a valid pointer to the
> private data, so the method will have no way to access it. Hence the
> method needs another argument.

It does half the job. You can make sure the driver is not asked to access
freed memory.
It is true that a driver will have to mark that device "disconnected"
and return errors if that device's attributes are referenced, but this can
be done internally.

Yes, this is a bit more complicated.
{rant mode}
Who came up with the idea of making life simpler by adding a code path?
All these problems were already solved for device nodes. Ioctl is ugly, but
at least a known code path.
{rant off}

> (BTW, the sysfs core would actually need more than a kref. It would also
> need a pointer to a release routine -- the kref contains only the atomic

Yes, this is implied.

Regards
Oliver
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/