aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/gnttab.c
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-01-12 15:16:05 +0000
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-01-12 15:16:05 +0000
commit213d576165735d5c0beae359376b6e3e7d3cb8e5 (patch)
tree7296411f6964997e0eeafbe420972cb1b05e61d9 /extras/mini-os/gnttab.c
parentffe8d02e0dd868fe35d36854fe471d646cc8cc66 (diff)
downloadxen-213d576165735d5c0beae359376b6e3e7d3cb8e5.tar.gz
xen-213d576165735d5c0beae359376b6e3e7d3cb8e5.tar.bz2
xen-213d576165735d5c0beae359376b6e3e7d3cb8e5.zip
[MINIOS] Fix grant-entry freelist maintenance.
Signed-off-by: Jacob Gorm Hansen <jacobg@diku.dk>
Diffstat (limited to 'extras/mini-os/gnttab.c')
-rw-r--r--extras/mini-os/gnttab.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/extras/mini-os/gnttab.c b/extras/mini-os/gnttab.c
index 7f9f0096f1..da92fc33c9 100644
--- a/extras/mini-os/gnttab.c
+++ b/extras/mini-os/gnttab.c
@@ -23,31 +23,24 @@
#define NR_GRANT_FRAMES 4
#define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
-#define GNTTAB_LIST_END (NR_GRANT_ENTRIES + 1)
static grant_entry_t *gnttab_table;
static grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
-static grant_ref_t gnttab_free_head;
-static grant_ref_t
-get_free_entries(int count)
+static void
+put_free_entry(grant_ref_t ref)
{
- grant_ref_t ref;
- grant_ref_t head;
+ gnttab_list[ref] = gnttab_list[0];
+ gnttab_list[0] = ref;
- ref = head = gnttab_free_head;
- while (count-- > 1)
- head = gnttab_list[head];
- gnttab_free_head = gnttab_list[head];
- gnttab_list[head] = GNTTAB_LIST_END;
- return ref;
}
-static void
-put_free_entry(grant_ref_t gref)
+static grant_ref_t
+get_free_entry(void)
{
- gnttab_list[gref] = gnttab_free_head;
- gnttab_free_head = gref;
+ unsigned int ref = gnttab_list[0];
+ gnttab_list[0] = gnttab_list[ref];
+ return ref;
}
grant_ref_t
@@ -55,7 +48,7 @@ gnttab_grant_access(domid_t domid, unsigned long frame, int readonly)
{
grant_ref_t ref;
- ref = get_free_entries(1);
+ ref = get_free_entry();
gnttab_table[ref].frame = frame;
gnttab_table[ref].domid = domid;
wmb();
@@ -70,7 +63,7 @@ gnttab_grant_transfer(domid_t domid, unsigned long pfn)
{
grant_ref_t ref;
- ref = get_free_entries(1);
+ ref = get_free_entry();
gnttab_table[ref].frame = pfn;
gnttab_table[ref].domid = domid;
wmb();
@@ -157,8 +150,7 @@ init_gnttab(void)
int i;
for (i = NR_RESERVED_ENTRIES; i < NR_GRANT_ENTRIES; i++)
- gnttab_list[i] = i + 1;
- gnttab_free_head = NR_RESERVED_ENTRIES;
+ put_free_entry(i);
setup.dom = DOMID_SELF;
setup.nr_frames = NR_GRANT_FRAMES;