Fix locking so we don't release the lock between the time we check the
tailq (for being non-empty) and the time we remove an entry.
This commit is contained in:
parent
7f0851cee1
commit
6a7e4606d5
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: vfs_bio.c,v 1.264 2016/12/26 23:12:33 pgoyette Exp $ */
|
/* $NetBSD: vfs_bio.c,v 1.265 2016/12/26 23:15:15 pgoyette Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
|
* Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
|
||||||
@ -123,7 +123,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.264 2016/12/26 23:12:33 pgoyette Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.265 2016/12/26 23:15:15 pgoyette Exp $");
|
||||||
|
|
||||||
#ifdef _KERNEL_OPT
|
#ifdef _KERNEL_OPT
|
||||||
#include "opt_bufcache.h"
|
#include "opt_bufcache.h"
|
||||||
@ -1647,17 +1647,20 @@ biointr(void *cookie)
|
|||||||
|
|
||||||
ci = curcpu();
|
ci = curcpu();
|
||||||
|
|
||||||
|
s = splvm();
|
||||||
while (!TAILQ_EMPTY(&ci->ci_data.cpu_biodone)) {
|
while (!TAILQ_EMPTY(&ci->ci_data.cpu_biodone)) {
|
||||||
KASSERT(curcpu() == ci);
|
KASSERT(curcpu() == ci);
|
||||||
|
|
||||||
s = splvm();
|
|
||||||
bp = TAILQ_FIRST(&ci->ci_data.cpu_biodone);
|
bp = TAILQ_FIRST(&ci->ci_data.cpu_biodone);
|
||||||
TAILQ_REMOVE(&ci->ci_data.cpu_biodone, bp, b_actq);
|
TAILQ_REMOVE(&ci->ci_data.cpu_biodone, bp, b_actq);
|
||||||
splx(s);
|
splx(s);
|
||||||
|
|
||||||
KERNHIST_LOG(biohist, "bp=%p", bp, 0, 0, 0);
|
KERNHIST_LOG(biohist, "bp=%p", bp, 0, 0, 0);
|
||||||
biodone2(bp);
|
biodone2(bp);
|
||||||
|
|
||||||
|
s = splvm();
|
||||||
}
|
}
|
||||||
|
splx(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user