[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Grant table updates for block device changes.



# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 1d86fcb11b599ea950472a6428ec71ff62888c65
# Parent  317db130cbbfc1d2ff20b5a7943bbdd22cf08d9c
Grant table updates for block device changes.
- add gnttab_free_grant_reference
- make gnttab_free_grant_references interface consistent with other gnttab
  functions
- add support for callback when references are freed
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>

diff -r 317db130cbbf -r 1d86fcb11b59 
linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c     Mon Aug 22 14:22:59 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c     Mon Aug 22 20:52:38 2005
@@ -50,6 +50,8 @@
 
 static grant_entry_t *shared;
 
+static struct gnttab_free_callback *gnttab_free_callback_list = NULL;
+
 /*
  * Lock-free grant-entry allocator
  */
@@ -65,6 +67,16 @@
     return fh;
 }
 
+static void do_free_callbacks(void)
+{
+    struct gnttab_free_callback *callback = gnttab_free_callback_list;
+    gnttab_free_callback_list = NULL;
+    while (callback) {
+       schedule_work(callback->work);
+       callback = callback->next;
+    }
+}
+
 static inline void
 put_free_entry(
     grant_ref_t ref)
@@ -72,6 +84,8 @@
     grant_ref_t fh, nfh = gnttab_free_head;
     do { gnttab_free_list[ref] = fh = nfh; wmb(); }
     while ( unlikely((nfh = cmpxchg(&gnttab_free_head, fh, ref)) != fh) );
+    if ( unlikely(gnttab_free_callback_list) )
+       do_free_callbacks();
 }
 
 /*
@@ -189,17 +203,23 @@
 }
 
 void
-gnttab_free_grant_references( u16 count, grant_ref_t head )
+gnttab_free_grant_reference( grant_ref_t ref )
+{
+
+    put_free_entry(ref);
+}
+
+void
+gnttab_free_grant_references( grant_ref_t *head,
+                              grant_ref_t terminal )
 {
     /* TODO: O(N)...? */
-    grant_ref_t to_die = 0, next = head;
-    int i;
-
-    for ( i = 0; i < count; i++ )
-    {
-        to_die = next;
-        next = gnttab_free_list[next];
-        put_free_entry( to_die );
+    grant_ref_t ref;
+
+    while (*head != terminal) {
+       ref = *head;
+       *head = gnttab_free_list[*head];
+       put_free_entry(ref);
     }
 }
 
@@ -242,6 +262,15 @@
 {
     gnttab_free_list[release] = *private_head;
     *private_head = release;
+}
+
+void
+gnttab_request_free_callback(struct gnttab_free_callback *callback,
+                            struct work_struct *work)
+{
+    callback->work = work;
+    callback->next = gnttab_free_callback_list;
+    gnttab_free_callback_list = callback;
 }
 
 /*
diff -r 317db130cbbf -r 1d86fcb11b59 
linux-2.6-xen-sparse/include/asm-xen/gnttab.h
--- a/linux-2.6-xen-sparse/include/asm-xen/gnttab.h     Mon Aug 22 14:22:59 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/gnttab.h     Mon Aug 22 20:52:38 2005
@@ -20,6 +20,13 @@
 /* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */
 #define NR_GRANT_FRAMES 4
 #define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
+
+struct work_struct;
+
+struct gnttab_free_callback {
+    struct gnttab_free_callback *next;
+    struct work_struct *work;
+};
 
 int
 gnttab_grant_foreign_access(
@@ -49,8 +56,12 @@
     u16 count, grant_ref_t *pprivate_head, grant_ref_t *private_terminal );
 
 void
+gnttab_free_grant_reference(
+    grant_ref_t ref );
+
+void
 gnttab_free_grant_references(
-    u16 count, grant_ref_t private_head );
+    grant_ref_t *head, grant_ref_t terminal );
 
 int
 gnttab_claim_grant_reference( grant_ref_t *pprivate_head, grant_ref_t terminal
@@ -59,6 +70,10 @@
 void
 gnttab_release_grant_reference(
     grant_ref_t *private_head, grant_ref_t release );
+
+void
+gnttab_request_free_callback(
+    struct gnttab_free_callback *callback, struct work_struct *work );
 
 void
 gnttab_grant_foreign_access_ref(

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.