# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID c7f58e86446fc75856e4361f3e9fdd32bbc111a8
# Parent 1a82995a017ce49d48953ded341a46f58917384c
Reindent grant-table kernel code and reserve first few
entries for tools use.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r 1a82995a017c -r c7f58e86446f
linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c Wed Sep 28 16:51:24 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c Wed Sep 28 17:01:40 2005
@@ -1,13 +1,10 @@
/******************************************************************************
* gnttab.c
*
- * Two sets of functionality:
- * 1. Granting foreign access to our memory reservation.
- * 2. Accessing others' memory reservations via grant references.
- * (i.e., mechanisms for both sender and recipient of grant references)
+ * Granting foreign access to our memory reservation.
*
* Copyright (c) 2005, Christopher Clark
- * Copyright (c) 2004, K A Fraser
+ * Copyright (c) 2004-2005, K A Fraser
*/
#include <linux/config.h>
@@ -23,15 +20,15 @@
#include <asm/synch_bitops.h>
#if 1
-#define ASSERT(_p) \
- if ( !(_p) ) { printk(KERN_ALERT"Assertion '%s': line %d, file %s\n", \
- #_p , __LINE__, __FILE__); *(int*)0=0; }
+#define ASSERT(_p) \
+ if ( !(_p) ) { printk(KERN_ALERT"Assertion '%s': line %d, file %s\n", \
+ #_p , __LINE__, __FILE__); *(int*)0=0; }
#else
#define ASSERT(_p) ((void)0)
#endif
-#define WPRINTK(fmt, args...) \
- printk(KERN_WARNING "xen_grant: " fmt, ##args)
+#define WPRINTK(fmt, args...) \
+ printk(KERN_WARNING "xen_grant: " fmt, ##args)
EXPORT_SYMBOL(gnttab_grant_foreign_access);
@@ -49,11 +46,14 @@
EXPORT_SYMBOL(gnttab_grant_foreign_access_ref);
EXPORT_SYMBOL(gnttab_grant_foreign_transfer_ref);
+/* External tools reserve first few grant table entries. */
+#define NR_RESERVED_ENTRIES 8
+
#define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
#define GNTTAB_LIST_END (NR_GRANT_ENTRIES + 1)
static grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
-static int gnttab_free_count = NR_GRANT_ENTRIES;
+static int gnttab_free_count;
static grant_ref_t gnttab_free_head;
static spinlock_t gnttab_list_lock = SPIN_LOCK_UNLOCKED;
@@ -64,22 +64,22 @@
static int
get_free_entries(int count)
{
- unsigned long flags;
- int ref;
- grant_ref_t head;
- spin_lock_irqsave(&gnttab_list_lock, flags);
- if (gnttab_free_count < count) {
+ unsigned long flags;
+ int ref;
+ grant_ref_t head;
+ spin_lock_irqsave(&gnttab_list_lock, flags);
+ if (gnttab_free_count < count) {
+ spin_unlock_irqrestore(&gnttab_list_lock, flags);
+ return -1;
+ }
+ ref = head = gnttab_free_head;
+ gnttab_free_count -= count;
+ while (count-- > 1)
+ head = gnttab_list[head];
+ gnttab_free_head = gnttab_list[head];
+ gnttab_list[head] = GNTTAB_LIST_END;
spin_unlock_irqrestore(&gnttab_list_lock, flags);
- return -1;
- }
- ref = head = gnttab_free_head;
- gnttab_free_count -= count;
- while (count-- > 1)
- head = gnttab_list[head];
- gnttab_free_head = gnttab_list[head];
- gnttab_list[head] = GNTTAB_LIST_END;
- spin_unlock_irqrestore(&gnttab_list_lock, flags);
- return ref;
+ return ref;
}
#define get_free_entry() get_free_entries(1)
@@ -87,38 +87,41 @@
static void
do_free_callbacks(void)
{
- struct gnttab_free_callback *callback = gnttab_free_callback_list, *next;
- gnttab_free_callback_list = NULL;
- while (callback) {
- next = callback->next;
- if (gnttab_free_count >= callback->count) {
- callback->next = NULL;
- callback->fn(callback->arg);
- } else {
- callback->next = gnttab_free_callback_list;
- gnttab_free_callback_list = callback;
- }
- callback = next;
- }
+ struct gnttab_free_callback *callback, *next;
+
+ callback = gnttab_free_callback_list;
+ gnttab_free_callback_list = NULL;
+
+ while (callback != NULL) {
+ next = callback->next;
+ if (gnttab_free_count >= callback->count) {
+ callback->next = NULL;
+ callback->fn(callback->arg);
+ } else {
+ callback->next = gnttab_free_callback_list;
+ gnttab_free_callback_list = callback;
+ }
+ callback = next;
+ }
}
static inline void
check_free_callbacks(void)
{
- if (unlikely(gnttab_free_callback_list))
- do_free_callbacks();
+ if (unlikely(gnttab_free_callback_list))
+ do_free_callbacks();
}
static void
put_free_entry(grant_ref_t ref)
{
- unsigned long flags;
- spin_lock_irqsave(&gnttab_list_lock, flags);
- gnttab_list[ref] = gnttab_free_head;
- gnttab_free_head = ref;
- gnttab_free_count++;
- check_free_callbacks();
- spin_unlock_irqrestore(&gnttab_list_lock, flags);
+ unsigned long flags;
+ spin_lock_irqsave(&gnttab_list_lock, flags);
+ gnttab_list[ref] = gnttab_free_head;
+ gnttab_free_head = ref;
+ gnttab_free_count++;
+ check_free_callbacks();
+ spin_unlock_irqrestore(&gnttab_list_lock, flags);
}
/*
@@ -128,187 +131,189 @@
int
gnttab_grant_foreign_access(domid_t domid, unsigned long frame, int readonly)
{
- int ref;
+ int ref;
- if ( unlikely((ref = get_free_entry()) == -1) )
- return -ENOSPC;
-
- shared[ref].frame = frame;
- shared[ref].domid = domid;
- wmb();
- shared[ref].flags = GTF_permit_access | (readonly ? GTF_readonly : 0);
-
- return ref;
+ if (unlikely((ref = get_free_entry()) == -1))
+ return -ENOSPC;
+
+ shared[ref].frame = frame;
+ shared[ref].domid = domid;
+ wmb();
+ shared[ref].flags = GTF_permit_access | (readonly ? GTF_readonly : 0);
+
+ return ref;
}
void
gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
unsigned long frame, int readonly)
{
- shared[ref].frame = frame;
- shared[ref].domid = domid;
- wmb();
- shared[ref].flags = GTF_permit_access | (readonly ? GTF_readonly : 0);
+ shared[ref].frame = frame;
+ shared[ref].domid = domid;
+ wmb();
+ shared[ref].flags = GTF_permit_access | (readonly ? GTF_readonly : 0);
}
int
gnttab_query_foreign_access(grant_ref_t ref)
{
- u16 nflags;
-
- nflags = shared[ref].flags;
-
- return ( nflags & (GTF_reading|GTF_writing) );
+ u16 nflags;
+
+ nflags = shared[ref].flags;
+
+ return (nflags & (GTF_reading|GTF_writing));
}
void
gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
{
- u16 flags, nflags;
-
- nflags = shared[ref].flags;
- do {
- if ( (flags = nflags) & (GTF_reading|GTF_writing) )
- printk(KERN_ALERT "WARNING: g.e. still in use!\n");
- }
- while ( (nflags = synch_cmpxchg(&shared[ref].flags, flags, 0)) != flags );
+ u16 flags, nflags;
+
+ nflags = shared[ref].flags;
+ do {
+ if ( (flags = nflags) & (GTF_reading|GTF_writing) )
+ printk(KERN_ALERT "WARNING: g.e. still in use!\n");
+ }
+ while ((nflags = synch_cmpxchg(&shared[ref].flags, flags, 0)) !=
+ flags);
}
void
gnttab_end_foreign_access(grant_ref_t ref, int readonly)
{
- gnttab_end_foreign_access_ref(ref, readonly);
- put_free_entry(ref);
+ gnttab_end_foreign_access_ref(ref, readonly);
+ put_free_entry(ref);
}
int
gnttab_grant_foreign_transfer(domid_t domid)
{
- int ref;
-
- if ( unlikely((ref = get_free_entry()) == -1) )
- return -ENOSPC;
-
- shared[ref].frame = 0;
- shared[ref].domid = domid;
- wmb();
- shared[ref].flags = GTF_accept_transfer;
-
- return ref;
+ int ref;
+
+ if (unlikely((ref = get_free_entry()) == -1))
+ return -ENOSPC;
+
+ shared[ref].frame = 0;
+ shared[ref].domid = domid;
+ wmb();
+ shared[ref].flags = GTF_accept_transfer;
+
+ return ref;
}
void
gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid)
{
- shared[ref].frame = 0;
- shared[ref].domid = domid;
- wmb();
- shared[ref].flags = GTF_accept_transfer;
+ shared[ref].frame = 0;
+ shared[ref].domid = domid;
+ wmb();
+ shared[ref].flags = GTF_accept_transfer;
}
unsigned long
gnttab_end_foreign_transfer_ref(grant_ref_t ref)
{
- unsigned long frame = 0;
- u16 flags;
-
- flags = shared[ref].flags;
-
- /*
- * If a transfer is committed then wait for the frame address to appear.
- * Otherwise invalidate the grant entry against future use.
- */
- if ( likely(flags != GTF_accept_transfer) ||
- (synch_cmpxchg(&shared[ref].flags, flags, 0) != GTF_accept_transfer) )
- while ( unlikely((frame = shared[ref].frame) == 0) )
- cpu_relax();
-
- return frame;
+ unsigned long frame = 0;
+ u16 flags;
+
+ flags = shared[ref].flags;
+
+ /*
+ * If a transfer is committed then wait for the frame address to
+ * appear. Otherwise invalidate the grant entry against future use.
+ */
+ if (likely(flags != GTF_accept_transfer) ||
+ (synch_cmpxchg(&shared[ref].flags, flags, 0) !=
+ GTF_accept_transfer))
+ while (unlikely((frame = shared[ref].frame) == 0))
+ cpu_relax();
+
+ return frame;
}
unsigned long
gnttab_end_foreign_transfer(grant_ref_t ref)
{
- unsigned long frame = gnttab_end_foreign_transfer_ref(ref);
- put_free_entry(ref);
- return frame;
+ unsigned long frame = gnttab_end_foreign_transfer_ref(ref);
+ put_free_entry(ref);
+ return frame;
}
void
gnttab_free_grant_reference(grant_ref_t ref)
{
- put_free_entry(ref);
+ put_free_entry(ref);
}
void
gnttab_free_grant_references(grant_ref_t head)
{
- grant_ref_t ref;
- unsigned long flags;
- int count = 1;
- if (head == GNTTAB_LIST_END)
- return;
- spin_lock_irqsave(&gnttab_list_lock, flags);
- ref = head;
- while (gnttab_list[ref] != GNTTAB_LIST_END) {
- ref = gnttab_list[ref];
- count++;
- }
- gnttab_list[ref] = gnttab_free_head;
- gnttab_free_head = head;
- gnttab_free_count += count;
- check_free_callbacks();
- spin_unlock_irqrestore(&gnttab_list_lock, flags);
+ grant_ref_t ref;
+ unsigned long flags;
+ int count = 1;
+ if (head == GNTTAB_LIST_END)
+ return;
+ spin_lock_irqsave(&gnttab_list_lock, flags);
+ ref = head;
+ while (gnttab_list[ref] != GNTTAB_LIST_END) {
+ ref = gnttab_list[ref];
+ count++;
+ }
+ gnttab_list[ref] = gnttab_free_head;
+ gnttab_free_head = head;
+ gnttab_free_count += count;
+ check_free_callbacks();
+ spin_unlock_irqrestore(&gnttab_list_lock, flags);
}
int
gnttab_alloc_grant_references(u16 count, grant_ref_t *head)
{
- int h = get_free_entries(count);
-
- if (h == -1)
- return -ENOSPC;
-
- *head = h;
-
- return 0;
+ int h = get_free_entries(count);
+
+ if (h == -1)
+ return -ENOSPC;
+
+ *head = h;
+
+ return 0;
}
int
gnttab_claim_grant_reference(grant_ref_t *private_head)
{
- grant_ref_t g = *private_head;
- if (unlikely(g == GNTTAB_LIST_END))
- return -ENOSPC;
- *private_head = gnttab_list[g];
- return g;
+ grant_ref_t g = *private_head;
+ if (unlikely(g == GNTTAB_LIST_END))
+ return -ENOSPC;
+ *private_head = gnttab_list[g];
+ return g;
}
void
gnttab_release_grant_reference(grant_ref_t *private_head, grant_ref_t release)
{
- gnttab_list[release] = *private_head;
- *private_head = release;
+ gnttab_list[release] = *private_head;
+ *private_head = release;
}
void
gnttab_request_free_callback(struct gnttab_free_callback *callback,
void (*fn)(void *), void *arg, u16 count)
{
- unsigned long flags;
- spin_lock_irqsave(&gnttab_list_lock, flags);
- if (callback->next)
- goto out;
- callback->fn = fn;
- callback->arg = arg;
- callback->count = count;
- callback->next = gnttab_free_callback_list;
- gnttab_free_callback_list = callback;
- check_free_callbacks();
+ unsigned long flags;
+ spin_lock_irqsave(&gnttab_list_lock, flags);
+ if (callback->next)
+ goto out;
+ callback->fn = fn;
+ callback->arg = arg;
+ callback->count = count;
+ callback->next = gnttab_free_callback_list;
+ gnttab_free_callback_list = callback;
+ check_free_callbacks();
out:
- spin_unlock_irqrestore(&gnttab_list_lock, flags);
+ spin_unlock_irqrestore(&gnttab_list_lock, flags);
}
/*
@@ -323,79 +328,83 @@
grant_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long data)
{
- int ret;
- privcmd_hypercall_t hypercall;
-
- /* XXX Need safety checks here if using for anything other
- * than debugging */
- return -ENOSYS;
-
- if ( cmd != IOCTL_PRIVCMD_HYPERCALL )
- return -ENOSYS;
-
- if ( copy_from_user(&hypercall, (void *)data, sizeof(hypercall)) )
- return -EFAULT;
-
- if ( hypercall.op != __HYPERVISOR_grant_table_op )
- return -ENOSYS;
-
- /* hypercall-invoking asm taken from privcmd.c */
- __asm__ __volatile__ (
- "pushl %%ebx; pushl %%ecx; pushl %%edx; pushl %%esi; pushl %%edi; "
- "movl 4(%%eax),%%ebx ;"
- "movl 8(%%eax),%%ecx ;"
- "movl 12(%%eax),%%edx ;"
- "movl 16(%%eax),%%esi ;"
- "movl 20(%%eax),%%edi ;"
- "movl (%%eax),%%eax ;"
- TRAP_INSTR "; "
- "popl %%edi; popl %%esi; popl %%edx; popl %%ecx; popl %%ebx"
- : "=a" (ret) : "0" (&hypercall) : "memory" );
-
- return ret;
+ int ret;
+ privcmd_hypercall_t hypercall;
+
+ /*
+ * XXX Need safety checks here if using for anything other
+ * than debugging.
+ */
+ return -ENOSYS;
+
+ if ( cmd != IOCTL_PRIVCMD_HYPERCALL )
+ return -ENOSYS;
+
+ if ( copy_from_user(&hypercall, (void *)data, sizeof(hypercall)) )
+ return -EFAULT;
+
+ if ( hypercall.op != __HYPERVISOR_grant_table_op )
+ return -ENOSYS;
+
+ /* hypercall-invoking asm taken from privcmd.c */
+ __asm__ __volatile__ (
+ "pushl %%ebx; pushl %%ecx; pushl %%edx; "
+ "pushl %%esi; pushl %%edi; "
+ "movl 4(%%eax),%%ebx ;"
+ "movl 8(%%eax),%%ecx ;"
+ "movl 12(%%eax),%%edx ;"
+ "movl 16(%%eax),%%esi ;"
+ "movl 20(%%eax),%%edi ;"
+ "movl (%%eax),%%eax ;"
+ TRAP_INSTR "; "
+ "popl %%edi; popl %%esi; popl %%edx; popl %%ecx; popl %%ebx"
+ : "=a" (ret) : "0" (&hypercall) : "memory" );
+
+ return ret;
}
static struct file_operations grant_file_ops = {
- ioctl: grant_ioctl,
+ ioctl: grant_ioctl,
};
static int
grant_read(char *page, char **start, off_t off, int count, int *eof,
void *data)
{
- int len;
- unsigned int i;
- grant_entry_t *gt;
-
- gt = (grant_entry_t *)shared;
- len = 0;
-
- for ( i = 0; i < NR_GRANT_ENTRIES; i++ )
- /* TODO: safety catch here until this can handle >PAGE_SIZE output */
- if (len > (PAGE_SIZE - 200))
- {
- len += sprintf( page + len, "Truncated.\n");
- break;
- }
-
- if ( gt[i].flags )
- len += sprintf( page + len,
- "Grant: ref (0x%x) flags (0x%hx) dom (0x%hx) frame
(0x%x)\n",
- i,
- gt[i].flags,
- gt[i].domid,
- gt[i].frame );
-
- *eof = 1;
- return len;
+ int len;
+ unsigned int i;
+ grant_entry_t *gt;
+
+ gt = (grant_entry_t *)shared;
+ len = 0;
+
+ for (i = 0; i < NR_GRANT_ENTRIES; i++) {
+ if (len > (PAGE_SIZE - 200)) {
+ len += sprintf( page + len, "Truncated.\n");
+ break;
+ }
+ }
+
+ if (gt[i].flags) {
+ len += sprintf(page + len,
+ "Grant: ref (0x%x) flags (0x%hx) "
+ "dom (0x%hx) frame (0x%x)\n",
+ i,
+ gt[i].flags,
+ gt[i].domid,
+ gt[i].frame );
+ }
+
+ *eof = 1;
+ return len;
}
static int
grant_write(struct file *file, const char __user *buffer, unsigned long count,
void *data)
{
- /* TODO: implement this */
- return -ENOSYS;
+ /* TODO: implement this */
+ return -ENOSYS;
}
#endif /* CONFIG_PROC_FS */
@@ -403,70 +412,80 @@
int
gnttab_resume(void)
{
- gnttab_setup_table_t setup;
- unsigned long frames[NR_GRANT_FRAMES];
- int i;
-
- setup.dom = DOMID_SELF;
- setup.nr_frames = NR_GRANT_FRAMES;
- setup.frame_list = frames;
-
- BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1) != 0);
- BUG_ON(setup.status != 0);
-
- for ( i = 0; i < NR_GRANT_FRAMES; i++ )
- set_fixmap(FIX_GNTTAB_END - i, frames[i] << PAGE_SHIFT);
-
- return 0;
+ gnttab_setup_table_t setup;
+ unsigned long frames[NR_GRANT_FRAMES];
+ int i;
+
+ setup.dom = DOMID_SELF;
+ setup.nr_frames = NR_GRANT_FRAMES;
+ setup.frame_list = frames;
+
+ BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1));
+ BUG_ON(setup.status != 0);
+
+ for (i = 0; i < NR_GRANT_FRAMES; i++)
+ set_fixmap(FIX_GNTTAB_END - i, frames[i] << PAGE_SHIFT);
+
+ return 0;
}
int
gnttab_suspend(void)
{
- int i;
-
- for ( i = 0; i < NR_GRANT_FRAMES; i++ )
- clear_fixmap(FIX_GNTTAB_END - i);
-
- return 0;
+ int i;
+
+ for (i = 0; i < NR_GRANT_FRAMES; i++)
+ clear_fixmap(FIX_GNTTAB_END - i);
+
+ return 0;
}
static int __init
gnttab_init(void)
{
- int i;
-
- if (xen_init() < 0)
- return -ENODEV;
-
- BUG_ON(gnttab_resume());
-
- shared = (grant_entry_t *)fix_to_virt(FIX_GNTTAB_END);
-
- for ( i = 0; i < NR_GRANT_ENTRIES; i++ )
- gnttab_list[i] = i + 1;
-
+ int i;
+
+ if (xen_init() < 0)
+ return -ENODEV;
+
+ BUG_ON(gnttab_resume());
+
+ shared = (grant_entry_t *)fix_to_virt(FIX_GNTTAB_END);
+
+ for (i = NR_RESERVED_ENTRIES; i < NR_GRANT_ENTRIES; i++)
+ gnttab_list[i] = i + 1;
+ gnttab_free_count = NR_GRANT_ENTRIES;
+
#ifdef CONFIG_PROC_FS
- /*
- * /proc/xen/grant : used by libxc to access grant tables
- */
- if ( (grant_pde = create_xen_proc_entry("grant", 0600)) == NULL )
- {
- WPRINTK("Unable to create grant xen proc entry\n");
- return -1;
- }
-
- grant_file_ops.read = grant_pde->proc_fops->read;
- grant_file_ops.write = grant_pde->proc_fops->write;
-
- grant_pde->proc_fops = &grant_file_ops;
-
- grant_pde->read_proc = &grant_read;
- grant_pde->write_proc = &grant_write;
+ /*
+ * /proc/xen/grant : used by libxc to access grant tables
+ */
+ if ((grant_pde = create_xen_proc_entry("grant", 0600)) == NULL) {
+ WPRINTK("Unable to create grant xen proc entry\n");
+ return -1;
+ }
+
+ grant_file_ops.read = grant_pde->proc_fops->read;
+ grant_file_ops.write = grant_pde->proc_fops->write;
+
+ grant_pde->proc_fops = &grant_file_ops;
+
+ grant_pde->read_proc = &grant_read;
+ grant_pde->write_proc = &grant_write;
#endif
- printk("Grant table initialized\n");
- return 0;
+ printk("Grant table initialized\n");
+ return 0;
}
__initcall(gnttab_init);
+
+/*
+ * Local variables:
+ * c-file-style: "linux"
+ * indent-tabs-mode: t
+ * c-indent-level: 8
+ * c-basic-offset: 8
+ * tab-width: 8
+ * End:
+ */
diff -r 1a82995a017c -r c7f58e86446f
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Wed Sep 28
16:51:24 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Wed Sep 28
17:01:40 2005
@@ -57,7 +57,7 @@
#define MAXIMUM_OUTSTANDING_BLOCK_REQS \
(BLKIF_MAX_SEGMENTS_PER_REQUEST * BLKIF_RING_SIZE)
-#define GRANT_INVALID_REF (0xFFFF)
+#define GRANT_INVALID_REF 0
static void kick_pending_request_queues(struct blkfront_info *info);
diff -r 1a82995a017c -r c7f58e86446f
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Sep 28
16:51:24 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Sep 28
17:01:40 2005
@@ -1,7 +1,7 @@
/******************************************************************************
* Virtual network driver for conversing with remote driver backends.
*
- * Copyright (c) 2002-2004, K A Fraser
+ * Copyright (c) 2002-2005, K A Fraser
*
* This file may be distributed separately from the Linux kernel, or
* incorporated into other software packages, subject to the following license:
@@ -57,7 +57,7 @@
#include <asm-xen/xen-public/grant_table.h>
#include <asm-xen/gnttab.h>
-#define GRANT_INVALID_REF (0xFFFF)
+#define GRANT_INVALID_REF 0
#ifndef __GFP_NOWARN
#define __GFP_NOWARN 0
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|