diff mbox

[v2,04/11] memory: add getter for owner

Message ID 1372438702-20491-5-git-send-email-pbonzini@redhat.com
State New
Headers show

Commit Message

Paolo Bonzini June 28, 2013, 4:58 p.m. UTC
Whenever memory regions are accessed outside the BQL, they need to be
preserved against hot-unplug.  MemoryRegions actually do not have their
own reference count; they piggyback on a QOM object, their "owner".
The owner is set at creation time, and there is a function to retrieve
the owner.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/exec/memory.h | 7 +++++++
 memory.c              | 6 ++++++
 2 files changed, 13 insertions(+)

Comments

Jan Kiszka July 1, 2013, 2:24 p.m. UTC | #1
On 2013-06-28 18:58, Paolo Bonzini wrote:
> Whenever memory regions are accessed outside the BQL, they need to be
> preserved against hot-unplug.  MemoryRegions actually do not have their
> own reference count; they piggyback on a QOM object, their "owner".
> The owner is set at creation time, and there is a function to retrieve
> the owner.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  include/exec/memory.h | 7 +++++++
>  memory.c              | 6 ++++++
>  2 files changed, 13 insertions(+)
> 
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index be3d39f..1ad9c19 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -380,6 +380,13 @@ void memory_region_init_iommu(MemoryRegion *mr,
>  void memory_region_destroy(MemoryRegion *mr);
>  
>  /**
> + * memory_region_owner: get a memory region's owner.
> + *
> + * @mr: the memory region being queried.
> + */
> +struct Object *memory_region_owner(MemoryRegion *mr);
> +
> +/**
>   * memory_region_size: get a memory region's size.
>   *
>   * @mr: the memory region being queried.
> diff --git a/memory.c b/memory.c
> index 6250bec1..4d396c3 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -738,6 +738,7 @@ void memory_region_init(MemoryRegion *mr,
>      mr->owner = owner;
>      mr->iommu_ops = NULL;
>      mr->parent = NULL;
> +    mr->owner = NULL;
>      mr->size = int128_make64(size);
>      if (size == UINT64_MAX) {
>          mr->size = int128_2_64();
> @@ -1011,6 +1012,11 @@ void memory_region_destroy(MemoryRegion *mr)
>      g_free(mr->ioeventfds);
>  }
>  
> +Object *memory_region_owner(MemoryRegion *mr)
> +{
> +    return mr->owner;
> +}
> +
>  uint64_t memory_region_size(MemoryRegion *mr)
>  {
>      if (int128_eq(mr->size, int128_2_64())) {
> 

OK, fine... and who is using this? ;)

Also, as this is trivial and the structure publicly known anyway, I'd go
for a static inline function instead.

Jan
Paolo Bonzini July 1, 2013, 2:35 p.m. UTC | #2
Il 01/07/2013 16:24, Jan Kiszka ha scritto:
> On 2013-06-28 18:58, Paolo Bonzini wrote:
>> Whenever memory regions are accessed outside the BQL, they need to be
>> preserved against hot-unplug.  MemoryRegions actually do not have their
>> own reference count; they piggyback on a QOM object, their "owner".
>> The owner is set at creation time, and there is a function to retrieve
>> the owner.
>>
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>> ---
>>  include/exec/memory.h | 7 +++++++
>>  memory.c              | 6 ++++++
>>  2 files changed, 13 insertions(+)
>>
>> diff --git a/include/exec/memory.h b/include/exec/memory.h
>> index be3d39f..1ad9c19 100644
>> --- a/include/exec/memory.h
>> +++ b/include/exec/memory.h
>> @@ -380,6 +380,13 @@ void memory_region_init_iommu(MemoryRegion *mr,
>>  void memory_region_destroy(MemoryRegion *mr);
>>  
>>  /**
>> + * memory_region_owner: get a memory region's owner.
>> + *
>> + * @mr: the memory region being queried.
>> + */
>> +struct Object *memory_region_owner(MemoryRegion *mr);
>> +
>> +/**
>>   * memory_region_size: get a memory region's size.
>>   *
>>   * @mr: the memory region being queried.
>> diff --git a/memory.c b/memory.c
>> index 6250bec1..4d396c3 100644
>> --- a/memory.c
>> +++ b/memory.c
>> @@ -738,6 +738,7 @@ void memory_region_init(MemoryRegion *mr,
>>      mr->owner = owner;
>>      mr->iommu_ops = NULL;
>>      mr->parent = NULL;
>> +    mr->owner = NULL;
>>      mr->size = int128_make64(size);
>>      if (size == UINT64_MAX) {
>>          mr->size = int128_2_64();
>> @@ -1011,6 +1012,11 @@ void memory_region_destroy(MemoryRegion *mr)
>>      g_free(mr->ioeventfds);
>>  }
>>  
>> +Object *memory_region_owner(MemoryRegion *mr)
>> +{
>> +    return mr->owner;
>> +}
>> +
>>  uint64_t memory_region_size(MemoryRegion *mr)
>>  {
>>      if (int128_eq(mr->size, int128_2_64())) {
>>
> 
> OK, fine... and who is using this? ;)

There'll be a couple users in hw/acpi/core.c.

> Also, as this is trivial and the structure publicly known anyway, I'd go
> for a static inline function instead.

Ok.  Though it's not a fast path anyway.

Paolo
diff mbox

Patch

diff --git a/include/exec/memory.h b/include/exec/memory.h
index be3d39f..1ad9c19 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -380,6 +380,13 @@  void memory_region_init_iommu(MemoryRegion *mr,
 void memory_region_destroy(MemoryRegion *mr);
 
 /**
+ * memory_region_owner: get a memory region's owner.
+ *
+ * @mr: the memory region being queried.
+ */
+struct Object *memory_region_owner(MemoryRegion *mr);
+
+/**
  * memory_region_size: get a memory region's size.
  *
  * @mr: the memory region being queried.
diff --git a/memory.c b/memory.c
index 6250bec1..4d396c3 100644
--- a/memory.c
+++ b/memory.c
@@ -738,6 +738,7 @@  void memory_region_init(MemoryRegion *mr,
     mr->owner = owner;
     mr->iommu_ops = NULL;
     mr->parent = NULL;
+    mr->owner = NULL;
     mr->size = int128_make64(size);
     if (size == UINT64_MAX) {
         mr->size = int128_2_64();
@@ -1011,6 +1012,11 @@  void memory_region_destroy(MemoryRegion *mr)
     g_free(mr->ioeventfds);
 }
 
+Object *memory_region_owner(MemoryRegion *mr)
+{
+    return mr->owner;
+}
+
 uint64_t memory_region_size(MemoryRegion *mr)
 {
     if (int128_eq(mr->size, int128_2_64())) {