Module Name: src
Committed By: cherry
Date: Fri Dec 9 03:58:12 UTC 2011
Modified Files:
src/sys/arch/xen/xen: xengnt.c
Log Message:
Use mutex(9) instead of spl(9). Add further locks around grant table access.
To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/xen/xen/xengnt.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/xen/xen/xengnt.c
diff -u src/sys/arch/xen/xen/xengnt.c:1.20 src/sys/arch/xen/xen/xengnt.c:1.21
--- src/sys/arch/xen/xen/xengnt.c:1.20 Tue Sep 20 00:12:24 2011
+++ src/sys/arch/xen/xen/xengnt.c Fri Dec 9 03:58:12 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: xengnt.c,v 1.20 2011/09/20 00:12:24 jym Exp $ */
+/* $NetBSD: xengnt.c,v 1.21 2011/12/09 03:58:12 cherry Exp $ */
/*
* Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xengnt.c,v 1.20 2011/09/20 00:12:24 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xengnt.c,v 1.21 2011/12/09 03:58:12 cherry Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -35,6 +35,7 @@ __KERNEL_RCSID(0, "$NetBSD: xengnt.c,v 1
#include <sys/queue.h>
#include <sys/extent.h>
#include <sys/kernel.h>
+#include <sys/mutex.h>
#include <uvm/uvm.h>
#include <xen/hypervisor.h>
@@ -64,6 +65,7 @@ int last_gnt_entry;
/* VM address of the grant table */
grant_entry_t *grant_table;
+kmutex_t grant_lock;
static grant_ref_t xengnt_get_entry(void);
static void xengnt_free_entry(grant_ref_t);
@@ -99,6 +101,8 @@ xengnt_init(void)
for (i = 0; i <= nr_grant_entries; i++)
gnt_entries[i] = XENGNT_NO_ENTRY;
+ mutex_init(&grant_lock, MUTEX_DEFAULT, IPL_VM);
+
xengnt_resume();
}
@@ -217,13 +221,13 @@ static grant_ref_t
xengnt_get_entry(void)
{
grant_ref_t entry;
- int s = splvm();
+ mutex_enter(&grant_lock);
static struct timeval xengnt_nonmemtime;
static const struct timeval xengnt_nonmemintvl = {5,0};
if (last_gnt_entry == 0) {
if (xengnt_more_entries()) {
- splx(s);
+ mutex_exit(&grant_lock);
if (ratecheck(&xengnt_nonmemtime, &xengnt_nonmemintvl))
printf("xengnt_get_entry: out of grant "
"table entries\n");
@@ -234,7 +238,7 @@ xengnt_get_entry(void)
last_gnt_entry--;
entry = gnt_entries[last_gnt_entry];
gnt_entries[last_gnt_entry] = XENGNT_NO_ENTRY;
- splx(s);
+ mutex_exit(&grant_lock);
KASSERT(entry != XENGNT_NO_ENTRY);
KASSERT(last_gnt_entry >= 0);
KASSERT(last_gnt_entry <= gnt_max_grant_frames * NR_GRANT_ENTRIES_PER_PAGE);
@@ -247,13 +251,13 @@ xengnt_get_entry(void)
static void
xengnt_free_entry(grant_ref_t entry)
{
- int s = splvm();
+ mutex_enter(&grant_lock);
KASSERT(gnt_entries[last_gnt_entry] == XENGNT_NO_ENTRY);
KASSERT(last_gnt_entry >= 0);
KASSERT(last_gnt_entry <= gnt_max_grant_frames * NR_GRANT_ENTRIES_PER_PAGE);
gnt_entries[last_gnt_entry] = entry;
last_gnt_entry++;
- splx(s);
+ mutex_exit(&grant_lock);
}
int
@@ -263,6 +267,7 @@ xengnt_grant_access(domid_t dom, paddr_t
if (__predict_false(*entryp == XENGNT_NO_ENTRY))
return ENOMEM;
+ mutex_enter(&grant_lock);
grant_table[*entryp].frame = ma >> PAGE_SHIFT;
grant_table[*entryp].domid = dom;
/*
@@ -272,6 +277,7 @@ xengnt_grant_access(domid_t dom, paddr_t
xen_rmb();
grant_table[*entryp].flags =
GTF_permit_access | (ro ? GTF_readonly : 0);
+ mutex_exit(&grant_lock);
return 0;
}
@@ -298,6 +304,7 @@ xengnt_grant_transfer(domid_t dom, grant
if (__predict_false(*entryp == XENGNT_NO_ENTRY))
return ENOMEM;
+ mutex_enter(&grant_lock);
grant_table[*entryp].frame = 0;
grant_table[*entryp].domid = dom;
/*
@@ -306,6 +313,7 @@ xengnt_grant_transfer(domid_t dom, grant
*/
xen_rmb();
grant_table[*entryp].flags = GTF_accept_transfer;
+ mutex_exit(&grant_lock);
return 0;
}