On 08/01/2020 12:18, Jürgen Groß wrote:
> On 08.01.20 13:16, Wei Liu wrote:
>> On Wed, Jan 08, 2020 at 12:01:48PM +0100, Juergen Gross wrote:
>>> cpu_smpboot_free() removes the stubs for the cpu going offline, but it
>>> isn't clearing the related percpu variables. This will result in
>>> crashes when a stub page is released due to all related cpus gone
>>> offline and one of those cpus going online later.
>>>
>>> Fix that by clearing stubs.addr and stubs.mfn in order to allocate a
>>> new stub page when needed.
>>>
>>> Signed-off-by: Juergen Gross <jgr...@suse.com>
>>> ---
>>>   xen/arch/x86/smpboot.c | 2 ++
>>>   1 file changed, 2 insertions(+)
>>>
>>> diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
>>> index 7e29704080..46c0729214 100644
>>> --- a/xen/arch/x86/smpboot.c
>>> +++ b/xen/arch/x86/smpboot.c
>>> @@ -945,6 +945,8 @@ static void cpu_smpboot_free(unsigned int cpu,
>>> bool remove)
>>>                                (per_cpu(stubs.addr, cpu) |
>>> ~PAGE_MASK) + 1);
>>>           if ( i == STUBS_PER_PAGE )
>>>               free_domheap_page(mfn_to_page(mfn));
>>> +        per_cpu(stubs.addr, cpu) = 0;
>>> +        per_cpu(stubs.mfn, cpu) = 0;
>>
>> Shouldn't the mfn be set to INVALID_MFN instead?
>
> This would require modifying alloc_stub_page():
>
>     if ( *mfn )
>         pg = mfn_to_page(_mfn(*mfn));
>     else

Correct.  per-cpu data is initialised to 0, not to a custom default, so
using INVALID_MFN is more complicated.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to