From 213d576165735d5c0beae359376b6e3e7d3cb8e5 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Fri, 12 Jan 2007 15:16:05 +0000 Subject: [MINIOS] Fix grant-entry freelist maintenance. Signed-off-by: Jacob Gorm Hansen --- extras/mini-os/gnttab.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) (limited to 'extras/mini-os/gnttab.c') 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; -- cgit v1.2.3