[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC PATCH 4/8] exec: introduce address_space_get_iotlb
From: |
Jason Wang |
Subject: |
Re: [Qemu-devel] [RFC PATCH 4/8] exec: introduce address_space_get_iotlb_entry() |
Date: |
Wed, 30 Mar 2016 09:13:24 +0800 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 |
On 03/28/2016 10:18 AM, Peter Xu wrote:
> On Fri, Mar 25, 2016 at 10:13:25AM +0800, Jason Wang wrote:
>> This patch introduces a helper to query the iotlb entry for a
>> possible iova. This will be used by later device IOTLB API to enable
>> the capability for a dataplane (e.g vhost) to query the IOTLB.
>>
>> Cc: Paolo Bonzini <address@hidden>
>> Cc: Peter Crosthwaite <address@hidden>
>> Cc: Richard Henderson <address@hidden>
>> Signed-off-by: Jason Wang <address@hidden>
>> ---
>> exec.c | 30 ++++++++++++++++++++++++++++++
>> include/exec/memory.h | 7 +++++++
>> 2 files changed, 37 insertions(+)
>>
>> diff --git a/exec.c b/exec.c
>> index f398d21..31fac9f 100644
>> --- a/exec.c
>> +++ b/exec.c
>> @@ -411,6 +411,36 @@ address_space_translate_internal(AddressSpaceDispatch
>> *d, hwaddr addr, hwaddr *x
>> }
>>
>> /* Called from RCU critical section */
>> +IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
>> + bool is_write)
>> +{
>> + IOMMUTLBEntry iotlb = {0};
>> + MemoryRegionSection *section;
>> + MemoryRegion *mr;
>> + hwaddr plen;
>> +
>> + for (;;) {
>> + AddressSpaceDispatch *d = atomic_rcu_read(&as->dispatch);
>> + section = address_space_translate_internal(d, addr, &addr, &plen,
>> true);
>> + mr = section->mr;
>> +
>> + if (!mr->iommu_ops) {
>> + break;
>> + }
>> +
>> + iotlb = mr->iommu_ops->translate(mr, addr, is_write);
>> + if (!(iotlb.perm & (1 << is_write))) {
>> + iotlb.target_as = NULL;
>> + break;
>> + }
> Here, do we still need something like:
>
> addr = ((iotlb.translated_addr & ~iotlb.addr_mask)
> | (addr & iotlb.addr_mask));
>
> Just as address_space_translate() does? Now "addr" should be the
> offset in memory region "mr", while we need it to be the offset in
> address space if there are more loops, right?
Right, will address this in next version.
>
> Also, not sure whether we can abstract a shared function out of this
> function and address_space_translate().
Looks possible.
Thanks
>
> Thanks.
>
> -- peterx
>
- [Qemu-devel] [RFC PATCH 0/8] virtio/vhost DMAR support, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 2/8] intel_iommu: name vtd address space with devfn, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 3/8] intel_iommu: allocate new key when creating new address space, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 1/8] virtio: convert to use DMA api, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 4/8] exec: introduce address_space_get_iotlb_entry(), Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 5/8] virtio-pci: address space translation service (ATS) support, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 6/8] intel_iommu: support device iotlb descriptor, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 7/8] memory: handle alias for iommu notifier, Jason Wang, 2016/03/24
- [Qemu-devel] [RFC PATCH 8/8] vhost_net: device IOTLB support, Jason Wang, 2016/03/24