]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Fixed livelock in getnewbuf().
authorbde <bde@FreeBSD.org>
Fri, 13 Jun 1997 08:30:40 +0000 (08:30 +0000)
committerbde <bde@FreeBSD.org>
Fri, 13 Jun 1997 08:30:40 +0000 (08:30 +0000)
commit09d13c3c83d8174984dd75523feecab9ac536942
tree150e23a4181ef5553d91fa503e812282e0f3426d
parent73c96a1380ede1b7dc15e8114e47cc49317c5846
Fixed livelock in getnewbuf().

It is possible for multiple process to sleep concurrently waiting
for a buffer.  When the buffer shortage is a shortage of space but
not a shortage of buffer headers, the processes took turns creating
empty buffers and waking each other to advertise the brelse() of
the empties; progress was never made because tsleep() always found
another high-priority process to run and everything was done at
splbio(), so vfs_update never had a chance to flush delayed writes,
not to mention that i/o never had a chance to complete.

The problem seems to be rare in practice, but it can easily be
reproduced by misusing block devices, at least for sufficently slow
devices on machines with a sufficiently small buffer cache.  E.g.,
`tar cvf /dev/fd0 /kernel' on an 8MB system with no disk in fd0
causes the problem quickly; the same command with a disk in fd0
causes the problem not quite as quickly; and people have reported
problems newfs'ing file systems on block devices.

Block devices only cause this problem indirectly.  They are pessimized
for time and space, and the space pessimization causes the shortage
(it manifests as internal fragmentation in buffer_map).

This should be fixed in 2.2.
sys/kern/vfs_bio.c