From: "Rafael J. Wysocki" <rjw@rjwysocki.net> To: Dan Williams <dan.j.williams@intel.com> Cc: Erik Kaneda <erik.kaneda@intel.com>, rafael.j.wysocki@intel.com, Len Brown <lenb@kernel.org>, Borislav Petkov <bp@alien8.de>, James Morse <james.morse@arm.com>, Myron Stowe <myron.stowe@redhat.com>, Andy Shevchenko <andriy.shevchenko@linux.intel.com>, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-nvdimm@lists.01.org, Bob Moore <robert.moore@intel.com> Subject: [RFT][PATCH 3/3] ACPI: OSL: Define ACPI_OS_MAP_MEMORY_FAST_PATH() Date: Wed, 10 Jun 2020 14:22:50 +0200 [thread overview] Message-ID: <6458983.dlBdKaB8z0@kreacher> (raw) In-Reply-To: <318372766.6LKUBsbRXE@kreacher> From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> Define the ACPI_OS_MAP_MEMORY_FAST_PATH() macro to allow acpi_ex_system_memory_space_handler() to avoid memory unmapping overhead by deferring the unmap operations to the point when the AML interpreter is exited after removing the operation region that held the memory mappings which are not used any more. That macro, when called on a knwon-existing memory mapping, causes the reference counter of that mapping in the OS layer to be incremented and returns a pointer representing the virtual address of the start of the mapped memory area without really mapping it, so the first subsequent unmap operation on it will only decrement the reference counter. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> --- drivers/acpi/osl.c | 67 +++++++++++++++++++++++-------- include/acpi/platform/aclinuxex.h | 4 ++ 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 762c5d50b8fe..b75f3a17776f 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -302,21 +302,8 @@ static void acpi_unmap(acpi_physical_address pg_off, void __iomem *vaddr) iounmap(vaddr); } -/** - * acpi_os_map_iomem - Get a virtual address for a given physical address range. - * @phys: Start of the physical address range to map. - * @size: Size of the physical address range to map. - * - * Look up the given physical address range in the list of existing ACPI memory - * mappings. If found, get a reference to it and return a pointer to it (its - * virtual address). If not found, map it, add it to that list and return a - * pointer to it. - * - * During early init (when acpi_permanent_mmap has not been set yet) this - * routine simply calls __acpi_map_table() to get the job done. - */ -void __iomem __ref -*acpi_os_map_iomem(acpi_physical_address phys, acpi_size size) +static void __iomem __ref *__acpi_os_map_iomem(acpi_physical_address phys, + acpi_size size, bool fast_path) { struct acpi_ioremap *map; void __iomem *virt; @@ -328,8 +315,12 @@ void __iomem __ref return NULL; } - if (!acpi_permanent_mmap) + if (!acpi_permanent_mmap) { + if (WARN_ON(fast_path)) + return NULL; + return __acpi_map_table((unsigned long)phys, size); + } mutex_lock(&acpi_ioremap_lock); /* Check if there's a suitable mapping already. */ @@ -339,6 +330,11 @@ void __iomem __ref goto out; } + if (fast_path) { + mutex_unlock(&acpi_ioremap_lock); + return NULL; + } + map = kzalloc(sizeof(*map), GFP_KERNEL); if (!map) { mutex_unlock(&acpi_ioremap_lock); @@ -366,6 +362,25 @@ void __iomem __ref mutex_unlock(&acpi_ioremap_lock); return map->virt + (phys - map->phys); } + +/** + * acpi_os_map_iomem - Get a virtual address for a given physical address range. + * @phys: Start of the physical address range to map. + * @size: Size of the physical address range to map. + * + * Look up the given physical address range in the list of existing ACPI memory + * mappings. If found, get a reference to it and return a pointer representing + * its virtual address. If not found, map it, add it to that list and return a + * pointer representing its virtual address. + * + * During early init (when acpi_permanent_mmap has not been set yet) call + * __acpi_map_table() to obtain the mapping. + */ +void __iomem __ref *acpi_os_map_iomem(acpi_physical_address phys, + acpi_size size) +{ + return __acpi_os_map_iomem(phys, size, false); +} EXPORT_SYMBOL_GPL(acpi_os_map_iomem); void *__ref acpi_os_map_memory(acpi_physical_address phys, acpi_size size) @@ -374,6 +389,24 @@ void *__ref acpi_os_map_memory(acpi_physical_address phys, acpi_size size) } EXPORT_SYMBOL_GPL(acpi_os_map_memory); +/** + * acpi_os_map_memory_fast_path - Fast-path physical-to-virtual address mapping. + * @phys: Start of the physical address range to map. + * @size: Size of the physical address range to map. + * + * Look up the given physical address range in the list of existing ACPI memory + * mappings. If found, get a reference to it and return a pointer representing + * its virtual address. If not found, return NULL. + * + * During early init (when acpi_permanent_mmap has not been set yet) log a + * warning and return NULL. + */ +void __ref *acpi_os_map_memory_fast_path(acpi_physical_address phys, + acpi_size size) +{ + return __acpi_os_map_iomem(phys, size, true); +} + /* Must be called with mutex_lock(&acpi_ioremap_lock) */ static unsigned long acpi_os_drop_map_ref(struct acpi_ioremap *map) { @@ -1571,6 +1604,8 @@ acpi_status acpi_release_memory(acpi_handle handle, struct resource *res, return acpi_walk_namespace(ACPI_TYPE_REGION, handle, level, acpi_deactivate_mem_region, NULL, res, NULL); + + acpi_release_unused_memory_mappings(); } EXPORT_SYMBOL_GPL(acpi_release_memory); diff --git a/include/acpi/platform/aclinuxex.h b/include/acpi/platform/aclinuxex.h index 04f88f2de781..1d8be4ac9ef9 100644 --- a/include/acpi/platform/aclinuxex.h +++ b/include/acpi/platform/aclinuxex.h @@ -139,6 +139,10 @@ static inline void acpi_os_terminate_debugger(void) * OSL interfaces added by Linux */ +void *acpi_os_map_memory_fast_path(acpi_physical_address where, acpi_size length); + +#define ACPI_OS_MAP_MEMORY_FAST_PATH(a, s) acpi_os_map_memory_fast_path(a, s) + #endif /* __KERNEL__ */ #endif /* __ACLINUXEX_H__ */ -- 2.26.2 _______________________________________________ Linux-nvdimm mailing list -- linux-nvdimm@lists.01.org To unsubscribe send an email to linux-nvdimm-leave@lists.01.org
WARNING: multiple messages have this Message-ID (diff)
From: "Rafael J. Wysocki" <rjw@rjwysocki.net> To: Dan Williams <dan.j.williams@intel.com> Cc: Erik Kaneda <erik.kaneda@intel.com>, rafael.j.wysocki@intel.com, Len Brown <lenb@kernel.org>, Borislav Petkov <bp@alien8.de>, Ira Weiny <ira.weiny@intel.com>, James Morse <james.morse@arm.com>, Myron Stowe <myron.stowe@redhat.com>, Andy Shevchenko <andriy.shevchenko@linux.intel.com>, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-nvdimm@lists.01.org, Bob Moore <robert.moore@intel.com> Subject: [RFT][PATCH 3/3] ACPI: OSL: Define ACPI_OS_MAP_MEMORY_FAST_PATH() Date: Wed, 10 Jun 2020 14:22:50 +0200 [thread overview] Message-ID: <6458983.dlBdKaB8z0@kreacher> (raw) In-Reply-To: <318372766.6LKUBsbRXE@kreacher> From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> Define the ACPI_OS_MAP_MEMORY_FAST_PATH() macro to allow acpi_ex_system_memory_space_handler() to avoid memory unmapping overhead by deferring the unmap operations to the point when the AML interpreter is exited after removing the operation region that held the memory mappings which are not used any more. That macro, when called on a knwon-existing memory mapping, causes the reference counter of that mapping in the OS layer to be incremented and returns a pointer representing the virtual address of the start of the mapped memory area without really mapping it, so the first subsequent unmap operation on it will only decrement the reference counter. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> --- drivers/acpi/osl.c | 67 +++++++++++++++++++++++-------- include/acpi/platform/aclinuxex.h | 4 ++ 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 762c5d50b8fe..b75f3a17776f 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -302,21 +302,8 @@ static void acpi_unmap(acpi_physical_address pg_off, void __iomem *vaddr) iounmap(vaddr); } -/** - * acpi_os_map_iomem - Get a virtual address for a given physical address range. - * @phys: Start of the physical address range to map. - * @size: Size of the physical address range to map. - * - * Look up the given physical address range in the list of existing ACPI memory - * mappings. If found, get a reference to it and return a pointer to it (its - * virtual address). If not found, map it, add it to that list and return a - * pointer to it. - * - * During early init (when acpi_permanent_mmap has not been set yet) this - * routine simply calls __acpi_map_table() to get the job done. - */ -void __iomem __ref -*acpi_os_map_iomem(acpi_physical_address phys, acpi_size size) +static void __iomem __ref *__acpi_os_map_iomem(acpi_physical_address phys, + acpi_size size, bool fast_path) { struct acpi_ioremap *map; void __iomem *virt; @@ -328,8 +315,12 @@ void __iomem __ref return NULL; } - if (!acpi_permanent_mmap) + if (!acpi_permanent_mmap) { + if (WARN_ON(fast_path)) + return NULL; + return __acpi_map_table((unsigned long)phys, size); + } mutex_lock(&acpi_ioremap_lock); /* Check if there's a suitable mapping already. */ @@ -339,6 +330,11 @@ void __iomem __ref goto out; } + if (fast_path) { + mutex_unlock(&acpi_ioremap_lock); + return NULL; + } + map = kzalloc(sizeof(*map), GFP_KERNEL); if (!map) { mutex_unlock(&acpi_ioremap_lock); @@ -366,6 +362,25 @@ void __iomem __ref mutex_unlock(&acpi_ioremap_lock); return map->virt + (phys - map->phys); } + +/** + * acpi_os_map_iomem - Get a virtual address for a given physical address range. + * @phys: Start of the physical address range to map. + * @size: Size of the physical address range to map. + * + * Look up the given physical address range in the list of existing ACPI memory + * mappings. If found, get a reference to it and return a pointer representing + * its virtual address. If not found, map it, add it to that list and return a + * pointer representing its virtual address. + * + * During early init (when acpi_permanent_mmap has not been set yet) call + * __acpi_map_table() to obtain the mapping. + */ +void __iomem __ref *acpi_os_map_iomem(acpi_physical_address phys, + acpi_size size) +{ + return __acpi_os_map_iomem(phys, size, false); +} EXPORT_SYMBOL_GPL(acpi_os_map_iomem); void *__ref acpi_os_map_memory(acpi_physical_address phys, acpi_size size) @@ -374,6 +389,24 @@ void *__ref acpi_os_map_memory(acpi_physical_address phys, acpi_size size) } EXPORT_SYMBOL_GPL(acpi_os_map_memory); +/** + * acpi_os_map_memory_fast_path - Fast-path physical-to-virtual address mapping. + * @phys: Start of the physical address range to map. + * @size: Size of the physical address range to map. + * + * Look up the given physical address range in the list of existing ACPI memory + * mappings. If found, get a reference to it and return a pointer representing + * its virtual address. If not found, return NULL. + * + * During early init (when acpi_permanent_mmap has not been set yet) log a + * warning and return NULL. + */ +void __ref *acpi_os_map_memory_fast_path(acpi_physical_address phys, + acpi_size size) +{ + return __acpi_os_map_iomem(phys, size, true); +} + /* Must be called with mutex_lock(&acpi_ioremap_lock) */ static unsigned long acpi_os_drop_map_ref(struct acpi_ioremap *map) { @@ -1571,6 +1604,8 @@ acpi_status acpi_release_memory(acpi_handle handle, struct resource *res, return acpi_walk_namespace(ACPI_TYPE_REGION, handle, level, acpi_deactivate_mem_region, NULL, res, NULL); + + acpi_release_unused_memory_mappings(); } EXPORT_SYMBOL_GPL(acpi_release_memory); diff --git a/include/acpi/platform/aclinuxex.h b/include/acpi/platform/aclinuxex.h index 04f88f2de781..1d8be4ac9ef9 100644 --- a/include/acpi/platform/aclinuxex.h +++ b/include/acpi/platform/aclinuxex.h @@ -139,6 +139,10 @@ static inline void acpi_os_terminate_debugger(void) * OSL interfaces added by Linux */ +void *acpi_os_map_memory_fast_path(acpi_physical_address where, acpi_size length); + +#define ACPI_OS_MAP_MEMORY_FAST_PATH(a, s) acpi_os_map_memory_fast_path(a, s) + #endif /* __KERNEL__ */ #endif /* __ACLINUXEX_H__ */ -- 2.26.2
next prev parent reply other threads:[~2020-06-10 12:23 UTC|newest] Thread overview: 107+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-05-07 23:39 [PATCH v2] ACPI: Drop rcu usage for MMIO mappings Dan Williams 2020-05-07 23:39 ` Dan Williams 2020-05-09 12:30 ` Sasha Levin 2020-05-13 8:52 ` [ACPI] 5a91d41f89: BUG:sleeping_function_called_from_invalid_context_at_kernel/locking/mutex.c kernel test robot 2020-05-13 8:52 ` kernel test robot 2020-05-13 8:52 ` kernel test robot 2020-06-05 13:32 ` [PATCH v2] ACPI: Drop rcu usage for MMIO mappings Rafael J. Wysocki 2020-06-05 13:32 ` Rafael J. Wysocki 2020-06-05 16:18 ` Dan Williams 2020-06-05 16:18 ` Dan Williams 2020-06-05 16:21 ` Rafael J. Wysocki 2020-06-05 16:21 ` Rafael J. Wysocki 2020-06-05 16:39 ` Dan Williams 2020-06-05 16:39 ` Dan Williams 2020-06-05 17:02 ` Rafael J. Wysocki 2020-06-05 17:02 ` Rafael J. Wysocki 2020-06-05 14:06 ` [RFT][PATCH] ACPI: OSL: Use rwlock instead of RCU for memory management Rafael J. Wysocki 2020-06-05 14:06 ` Rafael J. Wysocki 2020-06-05 17:08 ` Dan Williams 2020-06-05 17:08 ` Dan Williams 2020-06-06 6:56 ` Rafael J. Wysocki 2020-06-06 6:56 ` Rafael J. Wysocki 2020-06-08 15:33 ` Rafael J. Wysocki 2020-06-08 15:33 ` Rafael J. Wysocki 2020-06-08 16:29 ` Rafael J. Wysocki 2020-06-08 16:29 ` Rafael J. Wysocki 2020-06-05 19:40 ` Andy Shevchenko 2020-06-05 19:40 ` Andy Shevchenko 2020-06-06 6:48 ` Rafael J. Wysocki 2020-06-06 6:48 ` Rafael J. Wysocki 2020-06-10 12:17 ` [RFT][PATCH 0/3] ACPI: ACPICA / OSL: Avoid unmapping ACPI memory inside of the AML interpreter Rafael J. Wysocki 2020-06-10 12:17 ` Rafael J. Wysocki 2020-06-10 12:20 ` [RFT][PATCH 1/3] ACPICA: Defer unmapping of memory used in memory opregions Rafael J. Wysocki 2020-06-10 12:20 ` Rafael J. Wysocki 2020-06-10 12:21 ` [RFT][PATCH 2/3] ACPICA: Remove unused memory mappings on interpreter exit Rafael J. Wysocki 2020-06-10 12:21 ` Rafael J. Wysocki 2020-06-12 0:12 ` Kaneda, Erik 2020-06-12 0:12 ` Kaneda, Erik 2020-06-12 12:05 ` Rafael J. Wysocki 2020-06-12 12:05 ` Rafael J. Wysocki 2020-06-13 19:28 ` Rafael J. Wysocki 2020-06-13 19:28 ` Rafael J. Wysocki 2020-06-15 19:06 ` Dan Williams 2020-06-15 19:06 ` Dan Williams 2020-06-10 12:22 ` Rafael J. Wysocki [this message] 2020-06-10 12:22 ` [RFT][PATCH 3/3] ACPI: OSL: Define ACPI_OS_MAP_MEMORY_FAST_PATH() Rafael J. Wysocki 2020-06-13 19:19 ` [RFT][PATCH 0/3] ACPI: ACPICA / OSL: Avoid unmapping ACPI memory inside of the AML interpreter Rafael J. Wysocki 2020-06-13 19:19 ` Rafael J. Wysocki 2020-06-22 13:50 ` [RFT][PATCH v2 0/4] " Rafael J. Wysocki 2020-06-22 13:50 ` Rafael J. Wysocki 2020-06-22 13:52 ` [RFT][PATCH v2 1/4] ACPICA: Defer unmapping of opregion memory if supported by OS Rafael J. Wysocki 2020-06-22 13:52 ` Rafael J. Wysocki 2020-06-22 13:53 ` [RFT][PATCH v2 2/4] ACPI: OSL: Add support for deferred unmapping of ACPI memory Rafael J. Wysocki 2020-06-22 13:53 ` Rafael J. Wysocki 2020-06-22 14:56 ` Andy Shevchenko 2020-06-22 14:56 ` Andy Shevchenko 2020-06-22 15:27 ` Rafael J. Wysocki 2020-06-22 15:27 ` Rafael J. Wysocki 2020-06-22 15:46 ` Andy Shevchenko 2020-06-22 15:46 ` Andy Shevchenko 2020-06-22 14:01 ` [RFT][PATCH v2 3/4] ACPICA: Preserve memory opregion mappings if supported by OS Rafael J. Wysocki 2020-06-22 14:01 ` Rafael J. Wysocki 2020-06-26 22:53 ` Kaneda, Erik 2020-06-26 22:53 ` Kaneda, Erik 2020-06-29 13:02 ` Rafael J. Wysocki 2020-06-29 13:02 ` Rafael J. Wysocki 2020-06-22 14:02 ` [RFT][PATCH v2 4/4] ACPI: OSL: Implement acpi_os_map_memory_fast_path() Rafael J. Wysocki 2020-06-22 14:02 ` Rafael J. Wysocki 2020-06-26 17:28 ` [RFT][PATCH v3 0/4] ACPI: ACPICA / OSL: Avoid unmapping ACPI memory inside of the AML interpreter Rafael J. Wysocki 2020-06-26 17:28 ` Rafael J. Wysocki 2020-06-26 17:31 ` [RFT][PATCH v3 1/4] ACPICA: Take deferred unmapping of memory into account Rafael J. Wysocki 2020-06-26 17:31 ` Rafael J. Wysocki 2020-06-26 17:31 ` [RFT][PATCH v3 2/4] ACPI: OSL: Implement deferred unmapping of ACPI memory Rafael J. Wysocki 2020-06-26 17:31 ` Rafael J. Wysocki 2020-06-27 11:32 ` kernel test robot 2020-06-26 17:32 ` [RFT][PATCH v3 3/4] ACPICA: Preserve memory opregion mappings if supported by OS Rafael J. Wysocki 2020-06-26 17:32 ` Rafael J. Wysocki 2020-06-26 17:33 ` [RFT][PATCH v3 4/4] ACPI: OSL: Implement acpi_os_map_memory_fast_path() Rafael J. Wysocki 2020-06-26 17:33 ` Rafael J. Wysocki 2020-06-26 18:41 ` [RFT][PATCH v3 0/4] ACPI: ACPICA / OSL: Avoid unmapping ACPI memory inside of the AML interpreter Dan Williams 2020-06-26 18:41 ` Dan Williams 2020-06-28 17:09 ` Rafael J. Wysocki 2020-06-28 17:09 ` Rafael J. Wysocki 2020-06-29 20:46 ` Dan Williams 2020-06-29 20:46 ` Dan Williams 2020-06-30 11:04 ` Rafael J. Wysocki 2020-06-30 11:04 ` Rafael J. Wysocki 2020-06-29 16:31 ` [PATCH v4 0/2] " Rafael J. Wysocki 2020-06-29 16:31 ` Rafael J. Wysocki 2020-06-29 16:33 ` [PATCH v4 1/2] ACPI: OSL: Implement deferred unmapping of ACPI memory Rafael J. Wysocki 2020-06-29 16:33 ` Rafael J. Wysocki 2020-06-29 16:33 ` [PATCH v4 2/2] ACPICA: Preserve memory opregion mappings Rafael J. Wysocki 2020-06-29 16:33 ` Rafael J. Wysocki 2020-06-29 20:57 ` Al Stone 2020-06-29 20:57 ` Al Stone 2020-06-30 11:44 ` Rafael J. Wysocki 2020-06-30 11:44 ` Rafael J. Wysocki 2020-06-30 15:31 ` Al Stone 2020-06-30 15:31 ` Al Stone 2020-06-30 15:52 ` Rafael J. Wysocki 2020-06-30 15:52 ` Rafael J. Wysocki 2020-06-30 19:57 ` Al Stone 2020-06-30 19:57 ` Al Stone 2020-07-16 19:22 ` Verma, Vishal L 2020-07-16 19:22 ` Verma, Vishal L 2020-07-19 19:14 ` Rafael J. Wysocki 2020-07-19 19:14 ` Rafael J. Wysocki
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=6458983.dlBdKaB8z0@kreacher \ --to=rjw@rjwysocki.net \ --cc=andriy.shevchenko@linux.intel.com \ --cc=bp@alien8.de \ --cc=dan.j.williams@intel.com \ --cc=erik.kaneda@intel.com \ --cc=james.morse@arm.com \ --cc=lenb@kernel.org \ --cc=linux-acpi@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-nvdimm@lists.01.org \ --cc=myron.stowe@redhat.com \ --cc=rafael.j.wysocki@intel.com \ --cc=robert.moore@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.