diff options
author | Jeff Roberson <jeff@FreeBSD.org> | 2005-03-08 09:34:54 +0000 |
---|---|---|
committer | Jeff Roberson <jeff@FreeBSD.org> | 2005-03-08 09:34:54 +0000 |
commit | ec346d10404a6fee48f719f8995c8c0dd1615fe4 (patch) | |
tree | e863e713f131882762ad5fac26712c6528307da4 /sys/kern/vfs_bio.c | |
parent | 509b9bb9a63979acfd801ff074d012a15a84255f (diff) | |
download | src-ec346d10404a6fee48f719f8995c8c0dd1615fe4.tar.gz src-ec346d10404a6fee48f719f8995c8c0dd1615fe4.zip |
- Lock access to the buffer_map with the vm_map lock. In 4.x this was
done with splbio, in 5.x this was done with Giant.
Discussed with: alc
Reported by: julian, pho
Notes
Notes:
svn path=/head/; revision=143281
Diffstat (limited to 'sys/kern/vfs_bio.c')
-rw-r--r-- | sys/kern/vfs_bio.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 5a50075f3f71..6e0d9130207e 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -624,10 +624,12 @@ bfreekva(struct buf *bp) if (bp->b_kvasize) { atomic_add_int(&buffreekvacnt, 1); atomic_subtract_int(&bufspace, bp->b_kvasize); + vm_map_lock(buffer_map); vm_map_delete(buffer_map, (vm_offset_t) bp->b_kvabase, (vm_offset_t) bp->b_kvabase + bp->b_kvasize ); + vm_map_unlock(buffer_map); bp->b_kvasize = 0; bufspacewakeup(); } @@ -1928,6 +1930,7 @@ restart: bfreekva(bp); + vm_map_lock(buffer_map); if (vm_map_findspace(buffer_map, vm_map_min(buffer_map), maxsize, &addr)) { /* @@ -1935,6 +1938,7 @@ restart: * must defragment the map. */ atomic_add_int(&bufdefragcnt, 1); + vm_map_unlock(buffer_map); defrag = 1; bp->b_flags |= B_INVAL; brelse(bp); @@ -1950,6 +1954,7 @@ restart: atomic_add_int(&bufspace, bp->b_kvasize); atomic_add_int(&bufreusecnt, 1); } + vm_map_unlock(buffer_map); } bp->b_saveaddr = bp->b_kvabase; bp->b_data = bp->b_saveaddr; |