Date: Thu, 13 Dec 2007 14:38:17 +0100 From: Maxime Henrion <mux@FreeBSD.org> To: glebius@FreeBSD.org Cc: net@FreeBSD.org Subject: Deadlock in the routing code Message-ID: <20071213133817.GC71713@elvis.mu.org>
next in thread | raw e-mail | index | archive | help
Replying to myself on this one, sorry about that. I said in my previous mail that I didn't know yet what process was holding the lock of the rtentry that the routed process is dealing with in rt_setgate(), and I just could verify that it is held by the swi1: net thread. So, in a nutshell: - The routed process does its business on the routing socket, that ends up calling rt_setgate(). While in rt_setgate() it drops the lock on its rtentry in order to call rtalloc1(). At this point, the routed process hold the gateway route (rtalloc1() returns it locked), and it now tries to re-lock the original rtentry. - At the same time, the swi net thread calls arpresolve() which ends up calling rt_check(). Then rt_check() locks the rtentry, and tries to lock the gateway route. A classical case of deadlock with mutexes because of different locking order. Now, it's not obvious to me how to fix it :-). Maxime
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20071213133817.GC71713>