On 2016/1/22 18:15, Jan Beulich wrote:
On 22.01.16 at 10:37,<zhaoshengl...@huawei.com>  wrote:
>
>On 2016/1/22 16:47, Jan Beulich wrote:
>>>>>On 22.01.16 at 09:38,<zhaoshengl...@huawei.com>  wrote:
>>> >
>>> >On 2016/1/18 21:33, Jan Beulich wrote:
>>>>>>> >>>>>On 16.01.16 at 06:01,<zhaoshengl...@huawei.com>  wrote:
>>>>>> >>> >--- a/xen/drivers/acpi/osl.c
>>>>>> >>> >+++ b/xen/drivers/acpi/osl.c
>>>>>> >>> >@@ -86,17 +86,7 @@ acpi_physical_address __init
>>> >acpi_os_get_root_pointer(void)
>>>>>> >>> >  void __iomem *
>>>>>> >>> >  acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
>>>>>> >>> >  {
>>>>>> >>> >-     if (system_state >= SYS_STATE_active) {
>>>>>> >>> >-             mfn_t mfn = _mfn(PFN_DOWN(phys));
>>>>>> >>> >-             unsigned int offs = phys & (PAGE_SIZE - 1);
>>>>>> >>> >-
>>>>>> >>> >-             /* The low first Mb is always mapped. */
>>>>>> >>> >-             if ( !((phys + size - 1) >> 20) )
>>>>>> >>> >-                     return __va(phys);
>>>>>> >>> >-             return __vmap(&mfn, PFN_UP(offs + size), 1, 1,
>>>>>> >>> >-                           PAGE_HYPERVISOR_NOCACHE) + offs;
>>>>>> >>> >-     }
>>>>>> >>> >-     return __acpi_map_table(phys, size);
>>>>>> >>> >+     return arch_acpi_os_map_memory(phys, size);
>>>>>> >>> >  }
>>>> >>I'm quite sure I've said before that this goes too far: The __vmap()
>>>> >>part and likely also the early-boot __acpi_map_table() one already
>>>> >>are architecture independent and hence should stay. The factoring
>>>> >>hence should only concern the first Mb handling and maybe the
>>>> >>the mapping attributes passed to __vmap().
>>> >
>>> >Yes, the first MB handling and __vmap() should refactor. So if it only
>>> >moves them to an architecture function, how about below patch?
>>> >
>>> >diff --git a/xen/arch/x86/acpi/lib.c b/xen/arch/x86/acpi/lib.c
>>> >index cc15ea3..5885a3a 100644
>>> >--- a/xen/arch/x86/acpi/lib.c
>>> >+++ b/xen/arch/x86/acpi/lib.c
>>> >@@ -33,6 +33,19 @@ u8 __read_mostly acpi_disable_value;
>>> >  u32 __read_mostly x86_acpiid_to_apicid[MAX_MADT_ENTRIES] =
>>> >      {[0 ... MAX_MADT_ENTRIES - 1] = BAD_APICID };
>>> >
>>> >+void __iomem *
>>> >+arch_acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
>>> >+{
>>> >+       mfn_t mfn = _mfn(PFN_DOWN(phys));
>>> >+       unsigned int offs = phys & (PAGE_SIZE - 1);
>>> >+
>>> >+       /* The low first Mb is always mapped. */
>>> >+       if ( !((phys + size - 1) >> 20) )
>>> >+               return __va(phys);
>>> >+       return __vmap(&mfn, PFN_UP(offs + size), 1, 1,
>>> >+                     PAGE_HYPERVISOR_NOCACHE) + offs;
>>> >+}
>>Well, I had clearly said the vmap() part is generic; if there's
>>anything architecture dependent here, then the mapping
>>attributes (and hence only_those_  should be factored out,
>>not the entire function invocation).
>I know what you said. But how can we change the attribute for ARM in
>acpi_os_map_memory() without moving these codes out?
By having each arch #define their value, and use that constant here?
You really want that? Even though the way here I use is not too many dunplicated codes (and I think it looks clearer).

--
Shannon

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to