Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:GA
xen.7653
557eb5b6-gnttab-introduce-maptrack-lock.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 557eb5b6-gnttab-introduce-maptrack-lock.patch of Package xen.7653
# Commit 5a9899ddc42040e139233a6b1f0f65f3b65eda6d # Date 2015-06-15 13:23:34 +0200 # Author David Vrabel <david.vrabel@citrix.com> # Committer Jan Beulich <jbeulich@suse.com> gnttab: introduce maptrack lock Split grant table lock into two separate locks. One to protect maptrack free list (maptrack_lock) and one for everything else (lock). Based on a patch originally by Matt Wilson <msw@amazon.com>. Signed-off-by: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> --- a/docs/misc/grant-tables.txt +++ b/docs/misc/grant-tables.txt @@ -87,6 +87,7 @@ is complete. inconsistent grant table state such as current version, partially initialized active table pages, etc. + grant_table->maptrack_lock : spinlock used to protect the maptrack free list active_grant_entry->lock : spinlock used to serialize modifications to active entries @@ -94,6 +95,9 @@ is complete. that access members of struct grant_table must acquire the lock around critical sections. + The maptrack free list is protected by its own spinlock. The maptrack + lock may be locked while holding the grant table lock. + Active entries are obtained by calling active_entry_acquire(gt, ref). This function returns a pointer to the active entry after locking its spinlock. The caller must hold the grant table lock for the gt in --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -288,10 +288,10 @@ static inline void put_maptrack_handle( struct grant_table *t, int handle) { - spin_lock(&t->lock); + spin_lock(&t->maptrack_lock); maptrack_entry(t, handle).ref = t->maptrack_head; t->maptrack_head = handle; - spin_unlock(&t->lock); + spin_unlock(&t->maptrack_lock); } static inline int @@ -303,7 +303,7 @@ get_maptrack_handle( struct grant_mapping *new_mt; unsigned int new_mt_limit, nr_frames; - spin_lock(&lgt->lock); + spin_lock(&lgt->maptrack_lock); while ( unlikely((handle = __get_maptrack_handle(lgt)) == -1) ) { @@ -332,7 +332,7 @@ get_maptrack_handle( nr_frames + 1); } - spin_unlock(&lgt->lock); + spin_unlock(&lgt->maptrack_lock); return handle; } @@ -580,6 +580,7 @@ static void mapcount( for ( handle = 0; handle < lgt->maptrack_limit; handle++ ) { + smp_rmb(); map = &maptrack_entry(lgt, handle); if ( !(map->flags & (GNTMAP_device_map|GNTMAP_host_map)) || map->domid != rd->domain_id ) @@ -3152,6 +3153,7 @@ grant_table_create( /* Simple stuff. */ spin_lock_init(&t->lock); + spin_lock_init(&t->maptrack_lock); t->nr_grant_frames = INITIAL_NR_GRANT_FRAMES; /* Active grant table. */ --- a/xen/include/xen/grant_table.h +++ b/xen/include/xen/grant_table.h @@ -82,6 +82,8 @@ struct grant_table { struct grant_mapping **maptrack; unsigned int maptrack_head; unsigned int maptrack_limit; + /* Lock protecting the maptrack page list, head, and limit */ + spinlock_t maptrack_lock; /* Lock protecting updates to active and shared grant tables. */ spinlock_t lock; /* The defined versions are 1 and 2. Set to 0 if we don't know
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor