qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] ACPI: Avoid infinite recursion when dump-vmstate


From: Peng Liang
Subject: Re: [PATCH] ACPI: Avoid infinite recursion when dump-vmstate
Date: Mon, 26 Oct 2020 14:22:06 +0800
User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.2.2

On 10/24/2020 2:54 AM, Dr. David Alan Gilbert wrote:
> * Igor Mammedov (imammedo@redhat.com) wrote:
>> On Mon, 19 Oct 2020 17:31:56 +0800
>> Peng Liang <liangpeng10@huawei.com> wrote:
>>
>>> There is a field with vmstate_ghes_state as vmsd in vmstate_ghes_state,
>>> which will lead to infinite recursion in dump_vmstate_vmsd.
>>>
>>> Fixes: a08a64627b ("ACPI: Record the Generic Error Status Block address")
>>> Reported-by: Euler Robot <euler.robot@huawei.com>
>>> Signed-off-by: Peng Liang <liangpeng10@huawei.com>
>>> ---
>>>  hw/acpi/generic_event_device.c | 3 +--
>>>  1 file changed, 1 insertion(+), 2 deletions(-)
>>>
>>> diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c
>>> index 6df400e1ee16..4b6867300a55 100644
>>> --- a/hw/acpi/generic_event_device.c
>>> +++ b/hw/acpi/generic_event_device.c
>>> @@ -334,8 +334,7 @@ static const VMStateDescription vmstate_ghes_state = {
>>>      .minimum_version_id = 1,
>>>      .needed = ghes_needed,
>>>      .fields      = (VMStateField[]) {
>>> -        VMSTATE_STRUCT(ghes_state, AcpiGedState, 1,
>>> -                       vmstate_ghes_state, AcpiGhesState),
>>> +        VMSTATE_UINT64(ghes_state.ghes_addr_le, AcpiGedState),
>>
>> not sure its' ok handle it this way,
>>
>> see how it is done with another structure:
>>
>> static const VMStateDescription vmstate_ged_state = {                        
>>     
>>     .name = "acpi-ged-state",                                                
>>     
>>     .version_id = 1,                                                         
>>     
>>     .minimum_version_id = 1,                                                 
>>     
>>     .fields      = (VMStateField[]) {                                        
>>     
>>         VMSTATE_UINT32(sel, GEDState),                                       
>>     
>>         VMSTATE_END_OF_LIST()                                                
>>     
>>     }                                                                        
>>     
>> }; 
>>
>> ...
>>
>> VMSTATE_STRUCT(ged_state, AcpiGedState, 1, vmstate_ged_state, GEDState),
>>
>> i.e. it looks like we are missing structure definition for AcpiGhesState
>>
>> CCing David,
>>  to help with migration magic in case I'm wrong or missed something
> 
> Yeh that's confusing :-)
> 
> Given a:
> 
>   VMSTATE_STRUCT(a, B, 1, vmstate_c, C)
> 
> We're saying there's a field 'a' in type B, and field 'a'
> should be of type C and be serialised using vmstate_c.
> 
> That also means that in any vmstate_c, we're expecting it
> to be passed a type C generally.
> 
> Having said that; you don't need a struct - you can get away
> with that VMSTATE_UINT64, there's two problems:
> 
>   a) That assumes that your ghes always stays that simple.
>   b) If you wanted to store a Ghes from a number of different
> parent structures then you're stuck because your vmstate_ghes_state
> is bound to being a strict field of AcpiGedState.
> 
> So yes, it's neatest to do it using a VMSD for AcpiGhesState
> 
> And congratulations on finding a loop; I don't think we've ever had one
> before :-)
> 
> Dave
> 
>>>          VMSTATE_END_OF_LIST()
>>>      }
>>>  };
>>

Do you mean that we need another VMStateDescription to describe
AcpiGhesState instead of using VMSTATE_UINT64 directly?  Maybe like this:

diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c
index 6df400e1ee16..5454be67d5f0 100644
--- a/hw/acpi/generic_event_device.c
+++ b/hw/acpi/generic_event_device.c
@@ -322,6 +322,16 @@ static const VMStateDescription vmstate_ged_state = {
     }
 };

+static const VMStateDescription vmstate_ghes = {
+    .name = "acpi-ghes",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields     = (VMStateField[]) {
+        VMSTATE_UINT64(ghes_addr_le, AcpiGhesState),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
 static bool ghes_needed(void *opaque)
 {
     AcpiGedState *s = opaque;
@@ -335,7 +345,7 @@ static const VMStateDescription vmstate_ghes_state = {
     .needed = ghes_needed,
     .fields      = (VMStateField[]) {
         VMSTATE_STRUCT(ghes_state, AcpiGedState, 1,
-                       vmstate_ghes_state, AcpiGhesState),
+                       vmstate_ghes, AcpiGhesState),
         VMSTATE_END_OF_LIST()
     }
 };

-- 
Thanks,
Peng



reply via email to

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