malloc(M_WAITOK) of "g_bio", forcing M_NOWAIT with non-sleepable locks held:

Robert Watson rwatson at FreeBSD.org
Fri Sep 1 09:46:05 UTC 2006


On Thu, 31 Aug 2006, Václav Haisman wrote:

> I found this in logs of 6.1 box that I admin this morning. The machine keeps 
> running after that.

Indeed, there does appear to be a problem in the TCP socket option code with 
respect to performing copyin/copyout while holding the inpcb lock.  This 
problem is not present in the IP layer socket option code.  However, the code 
between HEAD and 6-STABLE here differs significantly, so fixing this will 
require different changes in the two branches.  Could you file a problem 
report on this, and forward me the PR receipt?  I'm on travel in India 
currently, with mixed connectivity, so it may be a little bit before I can get 
to fixing the problem.

In principle, the risk here is a deadlock, but the fix is a little complicated 
as if we release the lock there, the state of the TCP socket can change, so 
when the code picks up from the copyin/copyout, it needs to validate that the 
operation is still valid on the socket (i.e., the connection hasn't been reset 
during the system call -- perhaps while the application is blocked waiting on 
disk i/o for a paged out page that contains the socket option).  This is very 
unlikely to trigger in practice, the warning there is quite conservative, but 
needs to be addressed properly.

Thanks for the report,

Robert N M Watson
Computer Laboratory
University of Cambridge


More information about the freebsd-stable mailing list