qemu-devel
[Top][All Lists]
Advanced

[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
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]