mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@osdl.org>
To: Andy Fleming <afleming@freescale.com>
Cc: "Maciej W. Rozycki" <macro@linux-mips.org>,
	Ben Collins <ben.collins@ubuntu.com>,
	linux-kernel@vger.kernel.org, Linus Torvalds <torvalds@osdl.org>,
	Jeff Garzik <jeff@garzik.org>
Subject: Re: [PATCH] Export current_is_keventd() for libphy
Date: Tue, 5 Dec 2006 13:26:43 -0800	[thread overview]
Message-ID: <20061205132643.d16db23b.akpm@osdl.org> (raw)
In-Reply-To: <6FD5FD7A-4CC2-481A-BC87-B869F045B347@freescale.com>

On Tue, 5 Dec 2006 14:59:31 -0600
Andy Fleming <afleming@freescale.com> wrote:

> Ok, I think this is the summary:
> 
> - phy_change() is the work queue callback function (scheduled when a  
> PHY interrupt occurs)
> 
> - dev_close() invokes the controller's stop/close/whatever function,  
> and it calls phy_disconnect()
> 
> - phy_disconnect() calls phy_stop_interrupts().  To prevent any  
> pending phy_change() calls from getting confused, phy_stop_interrupts 
> () needs to flush the queue.  Otherwise, subsequent memory freeings  
> will leave phy_change() hanging.
> 
> - If phy_stop_interrupts() calls flush_scheduled_work(), keventd will  
> execute its queues while rtnl_lock is held, providing opportunity for  
> other callbacks to deadlock.
> 
> - innocent puppies are slaughtered, and the world mourns.
> 

ah, OK.  So it's some other queued-up callback which takes rtnl_lock.

But I still don't see what's special about keventd.  If, say, /sbin/ip is
running flush_scheduled_work() under rtnl_lock then it too should deadlock
in this scenario.

> 
> Maciej's solution is to schedule phy_disconnect() to be called from a  
> work queue.  That solution should work, but it sounds like it doesn't  
> require the check for if keventd is running.
> 
> Of course, my objection to it is that it now requires the ethernet  
> controller to be excessively aware of the details of how the PHY Lib  
> is handling the PHY interrupts (by scheduling them on a work queue).

So what's a good fix?

a) Ban the calling of flush_scheduled_work() from under rtnl_lock(). 
   Sounds hard.

b) Ban the queueing of callback functions which take rtnl_lock().  This
   sounds like a plain bad idea - callbacks are low-level things which
   ought to be able to take locks.

c) Cancel the phy_change() callback within phy_stop_interrupts() so we
   don't need to run flush_scheduled_work() at all.

   This will almost work, as long as it's done in workqueue.c with
   appropriate locking.  The bug occurs when some other CPU is running
   phy_change() right now - we'll end up freeing data which that CPU is
   presently playing with.

   But perhaps we can take care of this within workqueue.c.  We need a
   cancel function which will cancel the work and, if its callback is
   presently executing it will block until that execution has completed.

   If we require of the calling subsystem a) that the work will not get
   rescheduled (that means phy_interrupt()) and b) that the callback does
   not rearm the work then things get simpler.

   But still not very simple.  It gets ugly with per-CPU qorkqueues.

  reply	other threads:[~2006-12-05 21:27 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-03  5:50 Ben Collins
2006-12-03  9:16 ` Andrew Morton
2006-12-04 19:17   ` Steve Fox
2006-12-05 18:05     ` Maciej W. Rozycki
2006-12-05 17:48   ` Maciej W. Rozycki
2006-12-05 18:07     ` Linus Torvalds
2006-12-05 19:31       ` Andrew Morton
2006-12-05 18:57     ` Andy Fleming
2006-12-06 12:31       ` Maciej W. Rozycki
2006-12-05 20:39     ` Andrew Morton
2006-12-05 20:59       ` Andy Fleming
2006-12-05 21:26         ` Andrew Morton [this message]
2006-12-05 21:37           ` Roland Dreier
2006-12-05 21:57             ` Andrew Morton
2006-12-05 23:49               ` Roland Dreier
2006-12-05 23:52               ` Roland Dreier
2006-12-06 15:25               ` Maciej W. Rozycki
2006-12-06 15:57                 ` Andrew Morton
2006-12-06 17:17                   ` Linus Torvalds
2006-12-07  1:21                     ` Linus Torvalds
2006-12-07  6:42                       ` Andrew Morton
2006-12-07  7:49                         ` Andrew Morton
2006-12-07 10:29                         ` David Howells
2006-12-07 10:42                           ` Andrew Morton
2006-12-07 17:05                             ` Jeff Garzik
2006-12-07 17:57                               ` Andrew Morton
2006-12-07 18:17                                 ` Andrew Morton
2006-12-08 16:52                                 ` [PATCH] group xtime, xtime_lock, wall_to_monotonic, avenrun, calc_load_count fields together in ktimed Eric Dumazet
2006-12-09  5:46                                   ` Andrew Morton
2006-12-09  6:07                                     ` Randy Dunlap
2006-12-11 20:44                                     ` Eric Dumazet
2006-12-11 22:00                                       ` Andrew Morton
2006-12-13 21:26                                   ` [PATCH] Introduce time_data, a new structure to hold jiffies, xtime, xtime_lock, wall_to_monotonic, calc_load_count and avenrun Eric Dumazet
2006-12-15  5:24                                     ` Andrew Morton
2006-12-15 11:21                                       ` Eric Dumazet
2006-12-15 16:21                                     ` Eric Dumazet
2006-12-07 18:08                               ` [PATCH] Export current_is_keventd() for libphy Maciej W. Rozycki
2006-12-07 18:59                               ` Andy Fleming
2006-12-07 16:49                         ` Linus Torvalds
2006-12-07 17:52                           ` Andrew Morton
2006-12-07 18:01                             ` Linus Torvalds
2006-12-07 18:16                               ` Andrew Morton
2006-12-07 18:27                                 ` Linus Torvalds
2006-12-07 15:28                       ` Maciej W. Rozycki
2006-12-06 17:43                   ` David Howells
2006-12-06 17:50                     ` Jeff Garzik
2006-12-06 18:07                       ` Linus Torvalds
2006-12-06 17:53                     ` Linus Torvalds
2006-12-06 17:58                       ` Linus Torvalds
2006-12-06 18:33                         ` Linus Torvalds
2006-12-06 18:37                           ` Linus Torvalds
2006-12-06 18:43                         ` David Howells
2006-12-06 19:02                           ` Linus Torvalds
2006-12-06 18:02                     ` David Howells

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=20061205132643.d16db23b.akpm@osdl.org \
    --to=akpm@osdl.org \
    --cc=afleming@freescale.com \
    --cc=ben.collins@ubuntu.com \
    --cc=jeff@garzik.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=macro@linux-mips.org \
    --cc=torvalds@osdl.org \
    /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

Powered by JetHome