[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 1/2] gnttab: Introduce rwlock to protect updates to grant table state
On 2015/01/12 16:09, Jan Beulich wrote: >>>> On 09.01.15 at 16:12, <chegger@xxxxxxxxx> wrote: >> @@ -899,26 +899,27 @@ __gnttab_unmap_common( >> >> op->frame = (unsigned long)(op->dev_bus_addr >> PAGE_SHIFT); >> >> + read_lock(&lgt->lock); >> if ( unlikely(op->handle >= lgt->maptrack_limit) ) >> { >> + read_unlock(&lgt->lock); >> gdprintk(XENLOG_INFO, "Bad handle (%d).\n", op->handle); >> op->status = GNTST_bad_handle; >> return; >> } >> >> op->map = &maptrack_entry(lgt, op->handle); >> - spin_lock(&lgt->lock); > > The extension of the locked region is still not being mentioned in the > description - as said for v3, if this is really needed, it should then be > fixed by a separate, much smaller change. (The main reason why > the first if() doesn't need to happen under lock is - afair - that > lgt->maptrack_limit can only ever increase.) It is mentioned in the doc change to docs/misc/grant-tables.txt: + The maptrack state is protected by its own spinlock. Any access (read + or write) of struct grant_table members that have a "maptrack_" + prefix must be made while holding the maptrack lock. The maptrack + state can be rapidly modified under some workloads, and the critical + sections are very small, thus we use a spinlock to protect them. >> @@ -939,7 +940,8 @@ __gnttab_unmap_common( >> TRACE_1D(TRC_MEM_PAGE_GRANT_UNMAP, dom); >> >> rgt = rd->grant_table; >> - double_gt_lock(lgt, rgt); >> + read_lock(&rgt->lock); >> + double_maptrack_lock(lgt, rgt); > > Repeating what I said for v3: "The nesting of the two locks should > be mentioned in the doc change" (at the very least). ... to be removed again in the second patch? double_maptrack_lock() goes away in the second patch. >> @@ -1290,10 +1293,12 @@ gnttab_unpopulate_status_frames(struct domain *d, >> struct grant_table *gt) >> gt->nr_status_frames = 0; >> } >> >> +/* Grow the grant table. The caller must hold the grant table's >> + write lock before calling this function. */ > > Above you said you fixed the coding style issues, but at least here > you didn't. The comments match with the style as done everywhere in that file. >> @@ -2447,7 +2456,7 @@ __gnttab_swap_grant_ref(grant_ref_t ref_a, grant_ref_t >> ref_b) >> struct active_grant_entry *act; >> s16 rc = GNTST_okay; >> >> - spin_lock(>->lock); >> + read_lock(>->lock); > > Considering the purpose of this function, wouldn't this need to be a > write lock? Yes, right. >> @@ -2909,7 +2919,7 @@ gnttab_release_mappings( >> } >> >> rgt = rd->grant_table; >> - spin_lock(&rgt->lock); >> + read_lock(&rgt->lock); >> >> act = &active_entry(rgt, ref); >> sha = shared_entry_header(rgt, ref); >> @@ -2969,7 +2979,7 @@ gnttab_release_mappings( >> if ( act->pin == 0 ) >> gnttab_clear_flag(_GTF_reading, status); >> >> - spin_unlock(&rgt->lock); >> + read_unlock(&rgt->lock); > > Repeating the question on v3: "The maptrack entries are being > accessed between these two - don't you need both locks here?" yes, and be removed in the second patch again. > Overall I find it quite unfriendly (wasting reviewing bandwidth) to > submit a new version with a meaningful number of comments on the > previous version un-addressed. Sorry, I lost track of what I did and what I did not. Christoph _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |