|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv6 3/5] gnttab: split grant table lock into table and maptrack locks
>>> On 22.04.15 at 18:00, <david.vrabel@xxxxxxxxxx> wrote:
> Subsequent changes make both these locks uncontented. Is this patch
> really necessary? -- dvrabel
Yeah, particularly if this ...
> @@ -540,6 +550,16 @@ static void mapcount(
>
> *wrc = *rdc = 0;
>
> + /*
> + * While taking the local maptrack spinlock prevents any mapping
> + * changes, the remote active entries could be changing while we
> + * are counting. The caller has to hold the grant table lock, or
> + * some other mechanism should be used to prevent concurrent
> + * changes during this operation.
> + */
> + ASSERT(spin_is_locked(&rd->grant_table->lock));
> + spin_lock(&lgt->maptrack_lock);
> +
> for ( handle = 0; handle < lgt->maptrack_limit; handle++ )
> {
> struct active_grant_entry *act;
> @@ -552,6 +572,8 @@ static void mapcount(
> if ( act->frame == mfn )
> (map->flags & GNTMAP_readonly) ? (*rdc)++ : (*wrc)++;
> }
> +
> + spin_unlock(&lgt->maptrack_lock);
> }
... is not resulting in contention anymore, I'd prefer avoiding a
change like this without measurable benefit. And when still an
issue, I'd wonder whether an rwlock wouldn't be the better
choice here.
> --- a/xen/include/xen/grant_table.h
> +++ b/xen/include/xen/grant_table.h
> @@ -82,7 +82,12 @@ struct grant_table {
> struct grant_mapping **maptrack;
> unsigned int maptrack_head;
> unsigned int maptrack_limit;
> - /* Lock protecting updates to active and shared grant tables. */
> + /* Lock protecting the maptrack page list, head, and limit */
> + spinlock_t maptrack_lock;
> + /*
> + * Lock protecting updates to grant table state (version, active
> + * entry list, etc.)
> + */
> spinlock_t lock;
If the patch still was to be applied, these two locks should be put
on separate cache lines, to avoid unnecessary bouncing.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |