All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] watchdog ->release() races
@ 2013-05-07 20:10 Al Viro
  2013-05-07 21:00 ` Linus Torvalds
  2013-05-08  0:30 ` Guenter Roeck
  0 siblings, 2 replies; 4+ messages in thread
From: Al Viro @ 2013-05-07 20:10 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: linux-watchdog, Linus Torvalds

	Watchdog drivers tend to do something like that:

foo_open()
{
	if (test_and_set_bit(0, &foo_is_open))
		return -EBUSY;
	...
}

foo_write()
{
	...
	assign foo_expect_close
	...
}

foo_release()
{
	look at foo_expect_close, act accordingly
	clear_bit(0, &foo_is_open);
	foo_expect_close = 0;
}

OK, so it tries to make sure that there's only one opened struct file for
the device; fair enough, but what happens if we have
task A: open()/write()/close()
task B: open()/write()/close()
with task A losing CPU just between clear_bit() and clearing foo_expect_close?
If it regains CPU just after write() done by task B, we'll get foo_expect_close
unexpectedly cleared.

It's obviously racy; I'm not sure if we care about that race, but if we
do, there's about 80 drivers that need to be fixed...

Comments?

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-05-08  0:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-07 20:10 [RFC] watchdog ->release() races Al Viro
2013-05-07 21:00 ` Linus Torvalds
2013-05-07 21:17   ` Al Viro
2013-05-08  0:30 ` Guenter Roeck

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.