qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 08/10] softmmu/physmem: Extend ram_block_discard_(require|


From: Pankaj Gupta
Subject: Re: [PATCH v2 08/10] softmmu/physmem: Extend ram_block_discard_(require|disable) by two discard types
Date: Wed, 9 Dec 2020 19:47:17 +0100

> We want to separate the two cases whereby we discard ram
> - uncoordinated: e.g., virito-balloon
> - coordinated: e.g., virtio-mem coordinated via the RamDiscardMgr
>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: "Michael S. Tsirkin" <mst@redhat.com>
> Cc: Alex Williamson <alex.williamson@redhat.com>
> Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Cc: Igor Mammedov <imammedo@redhat.com>
> Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
> Cc: Peter Xu <peterx@redhat.com>
> Cc: Auger Eric <eric.auger@redhat.com>
> Cc: Wei Yang <richard.weiyang@linux.alibaba.com>
> Cc: teawater <teawaterz@linux.alibaba.com>
> Cc: Marek Kedzierski <mkedzier@redhat.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  include/exec/memory.h | 18 +++++++++++++--
>  softmmu/physmem.c     | 54 ++++++++++++++++++++++++++++++++++++++-----
>  2 files changed, 64 insertions(+), 8 deletions(-)
>
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index 30d4fcd2c0..3f0942aa5b 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -2804,6 +2804,12 @@ static inline MemOp devend_memop(enum device_endian 
> end)
>   */
>  int ram_block_discard_disable(bool state);
>
> +/*
> + * See ram_block_discard_disable(): only disable unccordinated discards,
s/unccordinated/uncoordinated
> + * keeping coordinated discards (via the RamDiscardMgr) enabled.
> + */
> +int ram_block_uncoordinated_discard_disable(bool state);
> +
>  /*
>   * Inhibit technologies that disable discarding of pages in RAM blocks.
>   *
> @@ -2813,12 +2819,20 @@ int ram_block_discard_disable(bool state);
>  int ram_block_discard_require(bool state);
>
>  /*
> - * Test if discarding of memory in ram blocks is disabled.
> + * See ram_block_discard_require(): only inhibit technologies that disable
> + * uncoordinated discarding of pages in RAM blocks, allowing co-existance 
> with
> + * technologies that only inhibit uncoordinated discards (via the
> + * RamDiscardMgr).
> + */
> +int ram_block_coordinated_discard_require(bool state);
> +
> +/*
> + * Test if any discarding of memory in ram blocks is disabled.
>   */
>  bool ram_block_discard_is_disabled(void);
>
>  /*
> - * Test if discarding of memory in ram blocks is required to work reliably.
> + * Test if any discarding of memory in ram blocks is required to work 
> reliably.
>   */
>  bool ram_block_discard_is_required(void);
>
> diff --git a/softmmu/physmem.c b/softmmu/physmem.c
> index 448e4e8c86..7a4f3db1b4 100644
> --- a/softmmu/physmem.c
> +++ b/softmmu/physmem.c
> @@ -3650,8 +3650,14 @@ void mtree_print_dispatch(AddressSpaceDispatch *d, 
> MemoryRegion *root)
>      }
>  }
>
> +/* Require any discards to work. */
>  static unsigned int ram_block_discard_requirers;
> +/* Require only coordinated discards to work. */
> +static unsigned int ram_block_coordinated_discard_requirers;
> +/* Disable any discards. */
>  static unsigned int ram_block_discard_disablers;
> +/* Disable only uncoordinated disards. */
s/disards/discards
> +static unsigned int ram_block_uncoordinated_discard_disablers;
>  static QemuMutex ram_block_discard_disable_mutex;
>
>  static void ram_block_discard_disable_mutex_lock(void)
> @@ -3677,10 +3683,27 @@ int ram_block_discard_disable(bool state)
>      ram_block_discard_disable_mutex_lock();
>      if (!state) {
>          ram_block_discard_disablers--;
> -    } else if (!ram_block_discard_requirers) {
> -        ram_block_discard_disablers++;
> +    } else if (ram_block_discard_requirers ||
> +               ram_block_coordinated_discard_requirers) {
> +        ret = -EBUSY;
>      } else {
> +        ram_block_discard_disablers++;
> +    }
> +    ram_block_discard_disable_mutex_unlock();
> +    return ret;
> +}
> +
> +int ram_block_uncoordinated_discard_disable(bool state)
> +{
> +    int ret = 0;
> +
> +    ram_block_discard_disable_mutex_lock();
> +    if (!state) {
> +        ram_block_uncoordinated_discard_disablers--;
> +    } else if (ram_block_discard_requirers) {
>          ret = -EBUSY;
> +    } else {
> +        ram_block_uncoordinated_discard_disablers++;
>      }
>      ram_block_discard_disable_mutex_unlock();
>      return ret;
> @@ -3693,10 +3716,27 @@ int ram_block_discard_require(bool state)
>      ram_block_discard_disable_mutex_lock();
>      if (!state) {
>          ram_block_discard_requirers--;
> -    } else if (!ram_block_discard_disablers) {
> -        ram_block_discard_requirers++;
> +    } else if (ram_block_discard_disablers ||
> +               ram_block_uncoordinated_discard_disablers) {
> +        ret = -EBUSY;
>      } else {
> +        ram_block_discard_requirers++;
> +    }
> +    ram_block_discard_disable_mutex_unlock();
> +    return ret;
> +}
> +
> +int ram_block_coordinated_discard_require(bool state)
> +{
> +    int ret = 0;
> +
> +    ram_block_discard_disable_mutex_lock();
> +    if (!state) {
> +        ram_block_coordinated_discard_requirers--;
> +    } else if (ram_block_discard_disablers) {
>          ret = -EBUSY;
> +    } else {
> +        ram_block_coordinated_discard_requirers++;
>      }
>      ram_block_discard_disable_mutex_unlock();
>      return ret;
> @@ -3704,10 +3744,12 @@ int ram_block_discard_require(bool state)
>
>  bool ram_block_discard_is_disabled(void)
>  {
> -    return qatomic_read(&ram_block_discard_disablers);
> +    return qatomic_read(&ram_block_discard_disablers) ||
> +           qatomic_read(&ram_block_uncoordinated_discard_disablers);
>  }
>
>  bool ram_block_discard_is_required(void)
>  {
> -    return qatomic_read(&ram_block_discard_requirers);
> +    return qatomic_read(&ram_block_discard_requirers) ||
> +           qatomic_read(&ram_block_coordinated_discard_requirers);
>  }

How to differentiate if we have both un-coordinated & coordinated
cases together?



reply via email to

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