[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv7 2/3] gnttab: refactor locking for scalability
>>> On 30.04.15 at 15:28, <david.vrabel@xxxxxxxxxx> wrote: >>> On 30.04.15 at 15:28, <david.vrabel@xxxxxxxxxx> wrote: > This patch refactors grant table locking. It splits the previous > single spinlock per grant table into multiple locks. The heavily > modified components of the grant table (the maptrack state and the > active entries) are now protected by their own spinlocks. The > remaining elements of the grant table are read-mostly, so the main > grant table lock is modified to be a rwlock to improve concurrency. This looks to be (partly) stale. > @@ -812,7 +829,7 @@ __gnttab_map_grant_ref( > mt->ref = op->ref; > mt->flags = op->flags; > > - double_maptrack_unlock(lgt, rgt); > + active_entry_release(act); > read_unlock(&rgt->lock); > > op->dev_bus_addr = (u64)frame << PAGE_SHIFT; > @@ -836,10 +853,6 @@ __gnttab_map_grant_ref( > put_page(pg); > } > > - read_lock(&rgt->lock); > - > - act = &active_entry(rgt, op->ref); > - > if ( op->flags & GNTMAP_device_map ) > act->pin -= (op->flags & GNTMAP_readonly) ? > GNTPIN_devr_inc : GNTPIN_devw_inc; > @@ -855,6 +868,9 @@ __gnttab_map_grant_ref( > if ( !act->pin ) > gnttab_clear_flag(_GTF_reading, status); > > + act_release_out: > + active_entry_release(act); > + > unlock_out: > read_unlock(&rgt->lock); This again looks like broken locking: You drop the lock twice, but the intermediate re-acquire gets deleted. Additionally it looks like you let go of "act" before being done with modifying it (act->pin adjustment visible in context above) and reading it (act->pin check further down), and then you release it another time here. Am I overlooking something? > @@ -2414,16 +2446,18 @@ > gnttab_set_version(XEN_GUEST_HANDLE_PARAM(gnttab_set_version_t) uop) > { > for ( i = GNTTAB_NR_RESERVED_ENTRIES; i < nr_grant_entries(gt); i++ ) > { > - act = &active_entry(gt, i); > + act = active_entry_acquire(gt, i); > if ( act->pin != 0 ) > { > gdprintk(XENLOG_WARNING, > "tried to change grant table version from %d to %d, > but some grant entries still in use\n", > gt->gt_version, > op.version); > + active_entry_release(act); > res = -EBUSY; > goto out_unlock; > } > + active_entry_release(act); > } Is it really useful to acquire the entry here? I.e. wouldn't read_atomic(act->pin) suffice? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |