[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [QEMU][PATCHv2 2/8] softmmu: physmem: Split ram_block_add()
|
From: |
Stefano Stabellini |
|
Subject: |
Re: [QEMU][PATCHv2 2/8] softmmu: physmem: Split ram_block_add() |
|
Date: |
Wed, 25 Oct 2023 18:25:19 -0700 (PDT) |
|
User-agent: |
Alpine 2.22 (DEB 394 2020-01-19) |
On Wed, 25 Oct 2023, Vikram Garhwal wrote:
> Extract ram block list update to a new function ram_block_add_list(). This is
> done to support grant mappings which adds a memory region for granted memory
> and
> updates the ram_block list.
>
> Signed-off-by: Juergen Gross <jgross@suse.com>
> Signed-off-by: Vikram Garhwal <vikram.garhwal@amd.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> ---
> include/exec/ram_addr.h | 1 +
> system/physmem.c | 62 ++++++++++++++++++++++++++---------------
> 2 files changed, 40 insertions(+), 23 deletions(-)
>
> diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
> index 90676093f5..c0b5f9a7d0 100644
> --- a/include/exec/ram_addr.h
> +++ b/include/exec/ram_addr.h
> @@ -139,6 +139,7 @@ void qemu_ram_free(RAMBlock *block);
> int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize, Error **errp);
>
> void qemu_ram_msync(RAMBlock *block, ram_addr_t start, ram_addr_t length);
> +void ram_block_add_list(RAMBlock *new_block);
>
> /* Clear whole block of mem */
> static inline void qemu_ram_block_writeback(RAMBlock *block)
> diff --git a/system/physmem.c b/system/physmem.c
> index fc2b0fee01..7a7f95b8b9 100644
> --- a/system/physmem.c
> +++ b/system/physmem.c
> @@ -1803,12 +1803,47 @@ static void dirty_memory_extend(ram_addr_t
> old_ram_size,
> }
> }
>
> +static void ram_block_add_list_locked(RAMBlock *new_block)
> + {
> + RAMBlock *block;
> + RAMBlock *last_block = NULL;
> +
> + /*
> + * Keep the list sorted from biggest to smallest block. Unlike QTAILQ,
> + * QLIST (which has an RCU-friendly variant) does not have insertion at
> + * tail, so save the last element in last_block.
> + */
> + RAMBLOCK_FOREACH(block) {
> + last_block = block;
> + if (block->max_length < new_block->max_length) {
> + break;
> + }
> + }
> + if (block) {
> + QLIST_INSERT_BEFORE_RCU(block, new_block, next);
> + } else if (last_block) {
> + QLIST_INSERT_AFTER_RCU(last_block, new_block, next);
> + } else { /* list is empty */
> + QLIST_INSERT_HEAD_RCU(&ram_list.blocks, new_block, next);
> + }
> + ram_list.mru_block = NULL;
> +
> + /* Write list before version */
> + smp_wmb();
> + ram_list.version++;
> +}
> +
> +void ram_block_add_list(RAMBlock *new_block)
> +{
> + qemu_mutex_lock_ramlist();
> + ram_block_add_list_locked(new_block);
> + qemu_mutex_unlock_ramlist();
> +}
> +
> static void ram_block_add(RAMBlock *new_block, Error **errp)
> {
> const bool noreserve = qemu_ram_is_noreserve(new_block);
> const bool shared = qemu_ram_is_shared(new_block);
> - RAMBlock *block;
> - RAMBlock *last_block = NULL;
> ram_addr_t old_ram_size, new_ram_size;
> Error *err = NULL;
>
> @@ -1846,28 +1881,9 @@ static void ram_block_add(RAMBlock *new_block, Error
> **errp)
> if (new_ram_size > old_ram_size) {
> dirty_memory_extend(old_ram_size, new_ram_size);
> }
> - /* Keep the list sorted from biggest to smallest block. Unlike QTAILQ,
> - * QLIST (which has an RCU-friendly variant) does not have insertion at
> - * tail, so save the last element in last_block.
> - */
> - RAMBLOCK_FOREACH(block) {
> - last_block = block;
> - if (block->max_length < new_block->max_length) {
> - break;
> - }
> - }
> - if (block) {
> - QLIST_INSERT_BEFORE_RCU(block, new_block, next);
> - } else if (last_block) {
> - QLIST_INSERT_AFTER_RCU(last_block, new_block, next);
> - } else { /* list is empty */
> - QLIST_INSERT_HEAD_RCU(&ram_list.blocks, new_block, next);
> - }
> - ram_list.mru_block = NULL;
>
> - /* Write list before version */
> - smp_wmb();
> - ram_list.version++;
> + ram_block_add_list_locked(new_block);
> +
> qemu_mutex_unlock_ramlist();
>
> cpu_physical_memory_set_dirty_range(new_block->offset,
> --
> 2.17.1
>
- [QEMU][PATCHv2 6/8] memory: add MemoryRegion map and unmap callbacks, (continued)
- [QEMU][PATCHv2 6/8] memory: add MemoryRegion map and unmap callbacks, Vikram Garhwal, 2023/10/25
- [QEMU][PATCHv2 3/8] xen: add pseudo RAM region for grant mappings, Vikram Garhwal, 2023/10/25
- [QEMU][PATCHv2 4/8] softmmu: let qemu_map_ram_ptr() use qemu_ram_ptr_length(), Vikram Garhwal, 2023/10/25
- [QEMU][PATCHv2 8/8] hw: arm: Add grant mapping., Vikram Garhwal, 2023/10/25
- [QEMU][PATCHv2 7/8] xen: add map and unmap callbacks for grant region, Vikram Garhwal, 2023/10/25
- [QEMU][PATCHv2 2/8] softmmu: physmem: Split ram_block_add(), Vikram Garhwal, 2023/10/25
- Re: [QEMU][PATCHv2 2/8] softmmu: physmem: Split ram_block_add(),
Stefano Stabellini <=
- [QEMU][PATCHv2 5/8] xen: let xen_ram_addr_from_mapcache() return -1 in case of not found entry, Vikram Garhwal, 2023/10/25
- [QEMU][PATCHv2 1/8] xen: when unplugging emulated devices skip virtio devices, Vikram Garhwal, 2023/10/25
Re: [QEMU][PATCHv2 0/8] Xen: support grant mappings., David Woodhouse, 2023/10/26