[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 04/11] exec: introduce MemoryRegionCache
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 04/11] exec: introduce MemoryRegionCache |
Date: |
Tue, 13 Dec 2016 14:14:09 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 |
On 12/12/2016 15:06, Stefan Hajnoczi wrote:
> On Mon, Dec 12, 2016 at 12:18:50PM +0100, Paolo Bonzini wrote:
>> diff --git a/exec.c b/exec.c
>> index d4b3656..8d4bb0e 100644
>> --- a/exec.c
>> +++ b/exec.c
>> @@ -3077,6 +3077,82 @@ void cpu_physical_memory_unmap(void *buffer, hwaddr
>> len,
>> #define RCU_READ_UNLOCK(...) rcu_read_unlock()
>> #include "memory_ldst.inc.c"
>>
>> +int64_t address_space_cache_init(MemoryRegionCache *cache,
>> + AddressSpace *as,
>> + hwaddr addr,
>> + hwaddr len,
>> + bool is_write)
>> +{
>> + hwaddr l, xlat;
>> + MemoryRegion *mr;
>> + void *ptr;
>> +
>> + assert(len > 0);
>> +
>> + l = len;
>> + mr = address_space_translate(as, addr, &xlat, &l, is_write);
>> + if (!memory_access_is_direct(mr, is_write)) {
>> + return -EINVAL;
>> + }
>> +
>> + l = address_space_extend_translation(as, addr, len, mr, xlat, l,
>> is_write);
>> + ptr = qemu_ram_ptr_length(mr->ram_block, xlat, &l);
>> +
>> + cache->xlat = xlat;
>> + cache->is_write = is_write;
>> + cache->mr = mr;
>> + cache->ptr = ptr;
>> + cache->len = l;
>> + memory_region_ref(cache->mr);
>> +
>> + return l;
>> +}
>
> What happens when [addr, addr + len) overlaps a MemoryRegion boundary?
> It looks like this function silently truncates the MemoryRegionCache,
Yes, this is what address_space_map does. It's up to the caller to
decide what to do.
Patch 8 ("virtio: use MemoryRegionCache to access descriptors") does it
right. As you noted, patch 9 doesn't check for errors at all---that's
part of why this is RFC.
Paolo
> leading to an assertion failure in address_space_translate_cached().
>
> Perhaps it would be better to fail address_space_cache_init() if the
> length is truncated.
>
- [Qemu-devel] [RFC PATCH 00/11] speedup vring processing with MemoryRegionCaches, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 06/11] virtio: add virtio_*_phys_cached, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 03/11] exec: introduce address_space_extend_translation, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 05/11] virtio: make virtio_should_notify static, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 04/11] exec: introduce MemoryRegionCache, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 07/11] virtio: use address_space_map/unmap to access descriptors, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 01/11] exec: optimize remaining address_space_* cases, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 08/11] virtio: use MemoryRegionCache to access descriptors, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 02/11] exec: introduce memory_ldst.inc.c, Paolo Bonzini, 2016/12/12
- [Qemu-devel] [PATCH 09/11] virtio: add MemoryListener to cache ring translations, Paolo Bonzini, 2016/12/12