|
From: Vojtech P. <vo...@su...> - 2001-06-22 12:54:53
|
On Tue, Jun 19, 2001 at 05:39:45PM -0700, James Simmons wrote:
>
> > In fact, I realised the driver doesn't really know when a process does an
> > open(). Indeed, input_open_device is called only when the first process
> > opens the device, and input_close_device when all processes closed it.
>
> Are you sure about that? For one thing each time you open /dev/mouse and
> /dev/event both devices call input_open_device. This is a case where the
> same hardware is opened twice. Also in input_close_device we have
But it's a per-driver open, not per-process open.
> handle->open--;
>
> I'm actually using this for power management.
>
> > Frankly, I don't really like the fact that evdev can be kfreed both by
> > evdev_disconnect and evdev_connect. Furthermore, the choice is done after
> > the value of evdev->exist, whose access is not protected (possible bug if
> > the last process releases the device while the device is being
> > disconnected, on a smp machine (weird case, though))
>
> I haven't thought about that problem but I have noticed the handle list
> isn't protected with a lock. On a SMP machine you the list being scanned
> and another thread removing or adding a new handle.
Yep. It ain't SMP safe.
> > Anyway, it seems we have to check evdev->exist before doing anything in
> > evdev_{ioctl,read,write...}, I guess this is what caused the oops I got.
>
> Please post the result of oops processed by ksymoops. This will help us
> find the problem.
--
Vojtech Pavlik
SuSE Labs
|