[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |