|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv10 3/4] gnttab: make the grant table lock a read-write lock
>>> On 26.05.15 at 20:00, <david.vrabel@xxxxxxxxxx> wrote:
> @@ -254,23 +254,23 @@ double_gt_lock(struct grant_table *lgt, struct
> grant_table *rgt)
> {
> if ( lgt < rgt )
> {
> - spin_lock(&lgt->lock);
> - spin_lock(&rgt->lock);
> + write_lock(&lgt->lock);
> + write_lock(&rgt->lock);
> }
> else
> {
> if ( lgt != rgt )
> - spin_lock(&rgt->lock);
> - spin_lock(&lgt->lock);
> + write_lock(&rgt->lock);
> + write_lock(&lgt->lock);
> }
> }
So I looked at the two uses of double_gt_lock() again: in both cases
only a read lock is needed on rgt (which is also the natural thing to
expect: we aren't supposed to modify the remote domain's grant
table in any way here). Albeit that's contradicting ...
> @@ -568,10 +568,10 @@ static void mapcount(
> *wrc = *rdc = 0;
>
> /*
> - * Must have the remote domain's grant table lock while counting
> - * its active entries.
> + * Must have the remote domain's grant table write lock while
> + * counting its active entries.
> */
> - ASSERT(spin_is_locked(&rd->grant_table->lock));
> + ASSERT(rw_is_write_locked(&rd->grant_table->lock));
... this: Why would we need to hold the write lock here? We're
not changing anything in rd->grant_table.
> @@ -837,12 +838,22 @@ __gnttab_map_grant_ref(
>
> TRACE_1D(TRC_MEM_PAGE_GRANT_MAP, op->dom);
>
> + /*
> + * All maptrack entry users check mt->flags first before using the
> + * other fields so just ensure the flags field is stored last.
> + *
> + * However, if gnttab_need_iommu_mapping() then this would race
> + * with a concurrent mapcount() call (on an unmap, for example)
> + * and a lock is required.
> + */
> mt = &maptrack_entry(lgt, handle);
> mt->domid = op->dom;
> mt->ref = op->ref;
> - mt->flags = op->flags;
> + wmb();
> + write_atomic(&mt->flags, op->flags);
Doesn't that then also require the use of read_atomic() and rmb()
on the reading side? Further, why are only races against mapcount()
a problem, but not such against __gnttab_unmap_common() as a
whole? I.e. what's the locking around the op->map->flags and
op->map->domid accesses below good for? Or, alternatively, isn't
this an indication of a problem with the previous patch splitting off
the maptrack lock (effectively leaving some map track entry
accesses without any guard)?
> - double_gt_unlock(lgt, rgt);
> + if ( gnttab_need_iommu_mapping(ld) )
> + double_gt_unlock(lgt, rgt);
I think you shouldn't rely on gnttab_need_iommu_mapping() to
produce the same result upon this and the earlier invocation, i.e.
you ought to latch the first call's result into a local variable.
> @@ -1787,7 +1805,7 @@ gnttab_transfer(
> TRACE_1D(TRC_MEM_PAGE_GRANT_TRANSFER, e->domain_id);
>
> /* Tell the guest about its new page frame. */
> - spin_lock(&e->grant_table->lock);
> + read_lock(&e->grant_table->lock);
>
> if ( e->grant_table->gt_version == 1 )
> {
> @@ -1805,7 +1823,7 @@ gnttab_transfer(
> shared_entry_header(e->grant_table, gop.ref)->flags |=
> GTF_transfer_completed;
>
> - spin_unlock(&e->grant_table->lock);
> + read_unlock(&e->grant_table->lock);
I'm not sure a read lock suffices here: Consider the effect of two
parallel invocations of this code with identical gop.ref, but different
gop.mfn. Or wait, gnttab_prepare_for_transfer() makes sure only
one gets here, unless the granting domain fiddles with the shared
entry. But it feels wrong nevertheless, considering that we alter
state of e here. Or should this perhaps lock the matching active
entry, even if it doesn't touch it?
> @@ -2645,7 +2663,7 @@ __gnttab_swap_grant_ref(grant_ref_t ref_a, grant_ref_t
> ref_b)
> struct active_grant_entry *act_b = NULL;
> s16 rc = GNTST_okay;
>
> - spin_lock(>->lock);
> + write_lock(>->lock);
>
> /* Bounds check on the grant refs */
> if ( unlikely(ref_a >= nr_grant_entries(d->grant_table)))
> @@ -2689,7 +2707,7 @@ out:
> active_entry_release(act_b);
> if ( act_a != NULL )
> active_entry_release(act_a);
> - spin_unlock(>->lock);
> + write_unlock(>->lock);
It would seem to me that these could be dropped when the per-active-
entry locks get introduced.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |