|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Possible Xen grant table locking improvements
On 23/10/14 10:46, Tim Deegan wrote:
> Hi,
>
> At 18:35 +0100 on 20 Oct (1413826547), David Vrabel wrote:
>> Most guests do not map a grant reference more than twice (Linux, for
>> example, will typically map a gref once in the kernel address space, or
>> twice if a userspace mapping is required). The maptrack entries for
>> these two mappings can be stored in the active entry (the "fast"
>> entries). If more than two mappings are required, the existing maptrack
>> table can be used (the "slow" entries).
>
> Sounds good, as long as the hit rate is indeed high. Do you know if
> the BSD/windows client code behaves this way too?
I don't know about BSD but XenServer's Windows PV drivers don't support
mapping grants (only granting access).
>> A maptrack handle for a "fast" entry is encoded as:
>>
>> 31 30 16 15 0
>> +---+---------------+---------------+
>> | F | domid | gref |
>> +---+---------------+---------------+
>>
>> F is set for a "fast" entry, and clear for a "slow" one. Grant
>> references above 2^16 will have to be tracked with "slow" entries.
>
> How restricting is that limit? Would 2^15½ and also encoding
> which of the two entries to look at be good?
Oh, I forgot about the bit for the entry index.
2^15 entries allows for (e.g.,) 8 multiqueue VIFs in a 8 VCPU guest.
Which is not a huge number and not a limit I would like to introduce.
One possibility would be guests wanting to use the fast path have to use
a new grant unmap hypercall that also passes the original grant ref and
domain.
>> We can omit taking the grant table lock to check the validity of a grant
>> ref or maptrack handle since these tables only grow and do not shrink.
>
> Can you also avoid the lock for accessing the entry itself, with a bit
> of RCU magic? Maybe that's overengineering things.
I don't think this will be necessary -- the active entry lock won't be
contended.
>> If strict IOMMU mode is used, IOMMU mappings are updated on every grant
>> map/unmap. These are currently setup such that BFN == MFN which
>> requires reference counting the IOMMU mappings so they are only torn
>> down when all grefs for that MFN are unmapped. This requires an
>> expensive mapcount() operation that iterates over the whole maptrack table.
>>
>> There is no requirement for BFN == MFN so each grant map can create its
>> own IOMMU mapping. This will require a region of bus address space that
>> does not overlap with RAM.
>
> Hrmn. That could be tricky to arrange. And the reference counting
> might end up being cheaper than the extra IOMMU flush operations.
> (Also, how much would you bet that clients actually use the returned
> BFN correctly?)
Hmm. Yes, if a guest has assumed that BFN == MFN, it could read the PTE
and get the BFN that way.
> Would it be enough to optimise mapcount() a bit? We could organise the
> in-use maptrack entries as a hash table instead of (or as well as) a
> single linked list.
>
> On similar lines, would it be worth fragmenting the maptrack itself
> (e.g. with per-page locks) to reduce locking contention instead of
> moving maptrack entries into the active entry? If might be Good
> Enough[tm], and simpler to build/maintain than this proposal.
A per maptrack page lock you would still need a per-domain maptrack lock
protecting the maptrack free list.
A better idea may be to hash the domain and grant ref and have a
maptrack table per-hash bucket. Each maptrack table would have its own
maptrack lock.
The maptrack handle could be:
31 16 15 0
+-------------------+---------------+
| bucket | index |
+-------------------+---------------+
We should probably try something simpler like this before getting
carried away...
David
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |