Message ID | 1397056476-9183-7-git-send-email-tomasz.nowicki@linaro.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
On Wed, Apr 09, 2014 at 05:14:34PM +0200, Tomasz Nowicki wrote: > Till now __flush_tlb_one was used for unmapping virtual memory which > is x86 specific function. Replace it with more generic > flush_tlb_kernel_range. > > Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org> > --- > drivers/acpi/apei/ghes.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c > index aaf8db3..624878b 100644 > --- a/drivers/acpi/apei/ghes.c > +++ b/drivers/acpi/apei/ghes.c > @@ -185,7 +185,7 @@ static void ghes_iounmap_nmi(void __iomem *vaddr_ptr) > > BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_NMI_PAGE(base)); > unmap_kernel_range_noflush(vaddr, PAGE_SIZE); > - __flush_tlb_one(vaddr); > + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); > } > > static void ghes_iounmap_irq(void __iomem *vaddr_ptr) > @@ -195,7 +195,7 @@ static void ghes_iounmap_irq(void __iomem *vaddr_ptr) > > BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_IRQ_PAGE(base)); > unmap_kernel_range_noflush(vaddr, PAGE_SIZE); > - __flush_tlb_one(vaddr); > + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); flush_tlb_kernel_range() does send an IPI to every core on x86 which is much more expensive than what __flush_tlb_one does. Fairer it would be if you added a __flush_tlb_one() version for arm which does flush_tlb_kernel_range for you.
On 13.05.2014 22:11, Borislav Petkov wrote: > On Wed, Apr 09, 2014 at 05:14:34PM +0200, Tomasz Nowicki wrote: >> Till now __flush_tlb_one was used for unmapping virtual memory which >> is x86 specific function. Replace it with more generic >> flush_tlb_kernel_range. >> >> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org> >> --- >> drivers/acpi/apei/ghes.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c >> index aaf8db3..624878b 100644 >> --- a/drivers/acpi/apei/ghes.c >> +++ b/drivers/acpi/apei/ghes.c >> @@ -185,7 +185,7 @@ static void ghes_iounmap_nmi(void __iomem *vaddr_ptr) >> >> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_NMI_PAGE(base)); >> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); >> - __flush_tlb_one(vaddr); >> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); >> } >> >> static void ghes_iounmap_irq(void __iomem *vaddr_ptr) >> @@ -195,7 +195,7 @@ static void ghes_iounmap_irq(void __iomem *vaddr_ptr) >> >> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_IRQ_PAGE(base)); >> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); >> - __flush_tlb_one(vaddr); >> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); > > flush_tlb_kernel_range() does send an IPI to every core on x86 which is > much more expensive than what __flush_tlb_one does. > > Fairer it would be if you added a __flush_tlb_one() version for arm > which does flush_tlb_kernel_range for you. > Thanks for comment. I am not sure if maintainers will allow me to add sth like __flush_tlb_one() for arm/arm64. Let me ask them directly. Catalin, Russell what do you think? Regards, Tomasz -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, May 14, 2014 at 01:32:27PM +0100, Tomasz Nowicki wrote: > On 13.05.2014 22:11, Borislav Petkov wrote: > > On Wed, Apr 09, 2014 at 05:14:34PM +0200, Tomasz Nowicki wrote: > >> Till now __flush_tlb_one was used for unmapping virtual memory which > >> is x86 specific function. Replace it with more generic > >> flush_tlb_kernel_range. > >> > >> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org> > >> --- > >> drivers/acpi/apei/ghes.c | 4 ++-- > >> 1 file changed, 2 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c > >> index aaf8db3..624878b 100644 > >> --- a/drivers/acpi/apei/ghes.c > >> +++ b/drivers/acpi/apei/ghes.c > >> @@ -185,7 +185,7 @@ static void ghes_iounmap_nmi(void __iomem *vaddr_ptr) > >> > >> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_NMI_PAGE(base)); > >> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); > >> - __flush_tlb_one(vaddr); > >> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); > >> } > >> > >> static void ghes_iounmap_irq(void __iomem *vaddr_ptr) > >> @@ -195,7 +195,7 @@ static void ghes_iounmap_irq(void __iomem *vaddr_ptr) > >> > >> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_IRQ_PAGE(base)); > >> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); > >> - __flush_tlb_one(vaddr); > >> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); > > > > flush_tlb_kernel_range() does send an IPI to every core on x86 which is > > much more expensive than what __flush_tlb_one does. > > > > Fairer it would be if you added a __flush_tlb_one() version for arm > > which does flush_tlb_kernel_range for you. > > > > Thanks for comment. I am not sure if maintainers will allow me to add > sth like __flush_tlb_one() for arm/arm64. Let me ask them directly. > Catalin, Russell what do you think? I don't have the background for this, but if you don't need broadcasting (if this avoids IPIs on x86, I guess you don't) then why not use local_flush_tlb_kernel_range instead? Will -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, May 14, 2014 at 01:35:42PM +0100, Will Deacon wrote: > On Wed, May 14, 2014 at 01:32:27PM +0100, Tomasz Nowicki wrote: > > On 13.05.2014 22:11, Borislav Petkov wrote: > > > On Wed, Apr 09, 2014 at 05:14:34PM +0200, Tomasz Nowicki wrote: > > >> Till now __flush_tlb_one was used for unmapping virtual memory which > > >> is x86 specific function. Replace it with more generic > > >> flush_tlb_kernel_range. > > >> > > >> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org> > > >> --- > > >> drivers/acpi/apei/ghes.c | 4 ++-- > > >> 1 file changed, 2 insertions(+), 2 deletions(-) > > >> > > >> diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c > > >> index aaf8db3..624878b 100644 > > >> --- a/drivers/acpi/apei/ghes.c > > >> +++ b/drivers/acpi/apei/ghes.c > > >> @@ -185,7 +185,7 @@ static void ghes_iounmap_nmi(void __iomem *vaddr_ptr) > > >> > > >> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_NMI_PAGE(base)); > > >> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); > > >> - __flush_tlb_one(vaddr); > > >> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); > > >> } > > >> > > >> static void ghes_iounmap_irq(void __iomem *vaddr_ptr) > > >> @@ -195,7 +195,7 @@ static void ghes_iounmap_irq(void __iomem *vaddr_ptr) > > >> > > >> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_IRQ_PAGE(base)); > > >> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); > > >> - __flush_tlb_one(vaddr); > > >> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); > > > > > > flush_tlb_kernel_range() does send an IPI to every core on x86 which is > > > much more expensive than what __flush_tlb_one does. > > > > > > Fairer it would be if you added a __flush_tlb_one() version for arm > > > which does flush_tlb_kernel_range for you. > > > > > > > Thanks for comment. I am not sure if maintainers will allow me to add > > sth like __flush_tlb_one() for arm/arm64. Let me ask them directly. > > Catalin, Russell what do you think? > > I don't have the background for this, but if you don't need broadcasting > (if this avoids IPIs on x86, I guess you don't) then why not use > local_flush_tlb_kernel_range instead? Is this generic enough (we don't have it on arm64)?
On Wed, May 14, 2014 at 01:45:07PM +0100, Catalin Marinas wrote: > On Wed, May 14, 2014 at 01:35:42PM +0100, Will Deacon wrote: > > On Wed, May 14, 2014 at 01:32:27PM +0100, Tomasz Nowicki wrote: > > > On 13.05.2014 22:11, Borislav Petkov wrote: > > > > On Wed, Apr 09, 2014 at 05:14:34PM +0200, Tomasz Nowicki wrote: > > > >> Till now __flush_tlb_one was used for unmapping virtual memory which > > > >> is x86 specific function. Replace it with more generic > > > >> flush_tlb_kernel_range. > > > >> > > > >> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org> > > > >> --- > > > >> drivers/acpi/apei/ghes.c | 4 ++-- > > > >> 1 file changed, 2 insertions(+), 2 deletions(-) > > > >> > > > >> diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c > > > >> index aaf8db3..624878b 100644 > > > >> --- a/drivers/acpi/apei/ghes.c > > > >> +++ b/drivers/acpi/apei/ghes.c > > > >> @@ -185,7 +185,7 @@ static void ghes_iounmap_nmi(void __iomem *vaddr_ptr) > > > >> > > > >> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_NMI_PAGE(base)); > > > >> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); > > > >> - __flush_tlb_one(vaddr); > > > >> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); > > > >> } > > > >> > > > >> static void ghes_iounmap_irq(void __iomem *vaddr_ptr) > > > >> @@ -195,7 +195,7 @@ static void ghes_iounmap_irq(void __iomem *vaddr_ptr) > > > >> > > > >> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_IRQ_PAGE(base)); > > > >> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); > > > >> - __flush_tlb_one(vaddr); > > > >> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); > > > > > > > > flush_tlb_kernel_range() does send an IPI to every core on x86 which is > > > > much more expensive than what __flush_tlb_one does. > > > > > > > > Fairer it would be if you added a __flush_tlb_one() version for arm > > > > which does flush_tlb_kernel_range for you. > > > > > > > > > > Thanks for comment. I am not sure if maintainers will allow me to add > > > sth like __flush_tlb_one() for arm/arm64. Let me ask them directly. > > > Catalin, Russell what do you think? > > > > I don't have the background for this, but if you don't need broadcasting > > (if this avoids IPIs on x86, I guess you don't) then why not use > > local_flush_tlb_kernel_range instead? > > Is this generic enough (we don't have it on arm64)? Well, it's more popular than __flush_tlb_one and the naming is more descriptive imo. Will -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 14.05.2014 14:48, Will Deacon wrote: > On Wed, May 14, 2014 at 01:45:07PM +0100, Catalin Marinas wrote: >> On Wed, May 14, 2014 at 01:35:42PM +0100, Will Deacon wrote: >>> On Wed, May 14, 2014 at 01:32:27PM +0100, Tomasz Nowicki wrote: >>>> On 13.05.2014 22:11, Borislav Petkov wrote: >>>>> On Wed, Apr 09, 2014 at 05:14:34PM +0200, Tomasz Nowicki wrote: >>>>>> Till now __flush_tlb_one was used for unmapping virtual memory which >>>>>> is x86 specific function. Replace it with more generic >>>>>> flush_tlb_kernel_range. >>>>>> >>>>>> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org> >>>>>> --- >>>>>> drivers/acpi/apei/ghes.c | 4 ++-- >>>>>> 1 file changed, 2 insertions(+), 2 deletions(-) >>>>>> >>>>>> diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c >>>>>> index aaf8db3..624878b 100644 >>>>>> --- a/drivers/acpi/apei/ghes.c >>>>>> +++ b/drivers/acpi/apei/ghes.c >>>>>> @@ -185,7 +185,7 @@ static void ghes_iounmap_nmi(void __iomem *vaddr_ptr) >>>>>> >>>>>> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_NMI_PAGE(base)); >>>>>> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); >>>>>> - __flush_tlb_one(vaddr); >>>>>> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); >>>>>> } >>>>>> >>>>>> static void ghes_iounmap_irq(void __iomem *vaddr_ptr) >>>>>> @@ -195,7 +195,7 @@ static void ghes_iounmap_irq(void __iomem *vaddr_ptr) >>>>>> >>>>>> BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_IRQ_PAGE(base)); >>>>>> unmap_kernel_range_noflush(vaddr, PAGE_SIZE); >>>>>> - __flush_tlb_one(vaddr); >>>>>> + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); >>>>> >>>>> flush_tlb_kernel_range() does send an IPI to every core on x86 which is >>>>> much more expensive than what __flush_tlb_one does. >>>>> >>>>> Fairer it would be if you added a __flush_tlb_one() version for arm >>>>> which does flush_tlb_kernel_range for you. >>>>> >>>> >>>> Thanks for comment. I am not sure if maintainers will allow me to add >>>> sth like __flush_tlb_one() for arm/arm64. Let me ask them directly. >>>> Catalin, Russell what do you think? >>> >>> I don't have the background for this, but if you don't need broadcasting >>> (if this avoids IPIs on x86, I guess you don't) then why not use >>> local_flush_tlb_kernel_range instead? >> >> Is this generic enough (we don't have it on arm64)? > > Well, it's more popular than __flush_tlb_one and the naming is more > descriptive imo. I am aiming ARM64 but ideally it should work for x86, arm64 and arm. Tomasz -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, May 14, 2014 at 02:52:29PM +0200, Tomasz Nowicki wrote:
> I am aiming ARM64 but ideally it should work for x86, arm64 and arm.
I guess you can call it local_flush_tlb_one() which calls
__flush_tlb_one() on x86 and flush_tlb_kernel_range() on arm*
A bunch of other arches have local_flush_tlb_one so going with that
naming might be on the right track :)
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index aaf8db3..624878b 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -185,7 +185,7 @@ static void ghes_iounmap_nmi(void __iomem *vaddr_ptr) BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_NMI_PAGE(base)); unmap_kernel_range_noflush(vaddr, PAGE_SIZE); - __flush_tlb_one(vaddr); + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); } static void ghes_iounmap_irq(void __iomem *vaddr_ptr) @@ -195,7 +195,7 @@ static void ghes_iounmap_irq(void __iomem *vaddr_ptr) BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_IRQ_PAGE(base)); unmap_kernel_range_noflush(vaddr, PAGE_SIZE); - __flush_tlb_one(vaddr); + flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); } static int ghes_estatus_pool_init(void)
Till now __flush_tlb_one was used for unmapping virtual memory which is x86 specific function. Replace it with more generic flush_tlb_kernel_range. Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org> --- drivers/acpi/apei/ghes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)