linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE
@ 2011-11-17 21:57 David Daney
  2011-11-17 21:57 ` [PATCH v2 1/2] hugetlb: Provide a default HPAGE_SHIFT if !CONFIG_HUGETLB_PAGE David Daney
                   ` (2 more replies)
  0 siblings, 3 replies; 26+ messages in thread
From: David Daney @ 2011-11-17 21:57 UTC (permalink / raw)
  To: linux-mips, ralf, Andrew Morton, linux-kernel; +Cc: David Daney, David Rientjes

From: David Daney <david.daney@cavium.com>

After a, somewhat heated, discussion with David Rientjes, I think the
following approach will work.

The first patch adds HPAGE_SHIFT, needed by MIPS.

The second cleans up the exiting HPAGE_MASK and HPAGE_SIZE

David Daney (2):
  hugetlb: Provide a default HPAGE_SHIFT if !CONFIG_HUGETLB_PAGE
  hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE

 include/linux/hugetlb.h |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

Cc: David Rientjes <rientjes@google.com>
-- 
1.7.2.3


^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v2 1/2] hugetlb: Provide a default HPAGE_SHIFT if !CONFIG_HUGETLB_PAGE
  2011-11-17 21:57 [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE David Daney
@ 2011-11-17 21:57 ` David Daney
  2011-11-17 21:57 ` [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE David Daney
  2011-11-17 23:22 ` [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE David Rientjes
  2 siblings, 0 replies; 26+ messages in thread
From: David Daney @ 2011-11-17 21:57 UTC (permalink / raw)
  To: linux-mips, ralf, Andrew Morton, linux-kernel; +Cc: David Daney, David Rientjes

From: David Daney <david.daney@cavium.com>

When linux-next 10111117 is build for MIPS with
cavium-octeon_defconfig, we get:

  arch/mips/mm/tlb-r4k.c: In function 'local_flush_tlb_range':
  arch/mips/mm/tlb-r4k.c:129:28: error: 'HPAGE_SHIFT' undeclared (first use in this function)

The fix is to supply a dummy HPAGE_SHIFT in the !CONFIG_HUGETLB_PAGE
case.  Instead of supplying the non-huge value, as was done for
HPAGE_MASK and HPAGE_SIZE, we do BUG() instead.  This satisfies the
compiler, but give us runtime safety if someone were to use HPAGE_SIZE
incorrectly.

Cc: David Rientjes <rientjes@google.com>
Signed-off-by: David Daney <david.daney@cavium.com>
---
 include/linux/hugetlb.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 19644e0..380451c 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -113,6 +113,7 @@ static inline void copy_huge_page(struct page *dst, struct page *src)
 #ifndef HPAGE_MASK
 #define HPAGE_MASK	PAGE_MASK		/* Keep the compiler happy */
 #define HPAGE_SIZE	PAGE_SIZE
+#define HPAGE_SHIFT	({BUG(); 0; })
 #endif
 
 #endif /* !CONFIG_HUGETLB_PAGE */
-- 
1.7.2.3


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE
  2011-11-17 21:57 [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE David Daney
  2011-11-17 21:57 ` [PATCH v2 1/2] hugetlb: Provide a default HPAGE_SHIFT if !CONFIG_HUGETLB_PAGE David Daney
@ 2011-11-17 21:57 ` David Daney
  2011-11-17 23:28   ` Andrew Morton
  2011-11-18  8:56   ` Sergei Shtylyov
  2011-11-17 23:22 ` [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE David Rientjes
  2 siblings, 2 replies; 26+ messages in thread
From: David Daney @ 2011-11-17 21:57 UTC (permalink / raw)
  To: linux-mips, ralf, Andrew Morton, linux-kernel; +Cc: David Daney, David Rientjes

From: David Daney <david.daney@cavium.com>

It was pointed out by David Rientjes that the dummy values for
HPAGE_MASK and HPAGE_SIZE are quite unsafe.  It they are inadvertently
used with !CONFIG_HUGETLB_PAGE, compilation would succeed, but the
resulting code would surly not do anything sensible.

Place BUG() in the these dummy definitions, as we do in similar
circumstances in other places, so any abuse can be easily detected.

Since the only sane place to use these symbols when
!CONFIG_HUGETLB_PAGE is on dead code paths, the BUG() cause any actual
code to be emitted by the compiler.

Cc: David Rientjes <rientjes@google.com>
Signed-off-by: David Daney <david.daney@cavium.com>
---
 include/linux/hugetlb.h |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 380451c..3ed6dbd 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -111,8 +111,9 @@ static inline void copy_huge_page(struct page *dst, struct page *src)
 #define hugetlb_change_protection(vma, address, end, newprot)
 
 #ifndef HPAGE_MASK
-#define HPAGE_MASK	PAGE_MASK		/* Keep the compiler happy */
-#define HPAGE_SIZE	PAGE_SIZE
+/* Keep the compiler happy with some dummy (but BUGgy) values */
+#define HPAGE_MASK	({BUG(); 0; })
+#define HPAGE_SIZE	({BUG(); 0; })
 #define HPAGE_SHIFT	({BUG(); 0; })
 #endif
 
-- 
1.7.2.3


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE
  2011-11-17 21:57 [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE David Daney
  2011-11-17 21:57 ` [PATCH v2 1/2] hugetlb: Provide a default HPAGE_SHIFT if !CONFIG_HUGETLB_PAGE David Daney
  2011-11-17 21:57 ` [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE David Daney
@ 2011-11-17 23:22 ` David Rientjes
  2011-11-17 23:22   ` [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE David Rientjes
  2 siblings, 1 reply; 26+ messages in thread
From: David Rientjes @ 2011-11-17 23:22 UTC (permalink / raw)
  To: David Daney; +Cc: linux-mips, ralf, Andrew Morton, linux-kernel, David Daney

On Thu, 17 Nov 2011, David Daney wrote:

> From: David Daney <david.daney@cavium.com>
> 
> After a, somewhat heated, discussion with David Rientjes, I think the
> following approach will work.
> 
> The first patch adds HPAGE_SHIFT, needed by MIPS.
> 
> The second cleans up the exiting HPAGE_MASK and HPAGE_SIZE
> 
> David Daney (2):
>   hugetlb: Provide a default HPAGE_SHIFT if !CONFIG_HUGETLB_PAGE
>   hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE
> 
>  include/linux/hugetlb.h |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
> 
> Cc: David Rientjes <rientjes@google.com>

Nack on both, we already discussed this in the other thread (and I 
wouldn't call it "somewhat heated").

We don't need these dummy definitions at all for any current architectures 
that use them and they should be removed so that any future code using 
them will have the proper dependency on CONFIG_HUGETLB_PAGE.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-17 23:22 ` [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE David Rientjes
@ 2011-11-17 23:22   ` David Rientjes
  2011-11-17 23:35     ` Andrew Morton
  2011-11-21 22:23     ` David Daney
  0 siblings, 2 replies; 26+ messages in thread
From: David Rientjes @ 2011-11-17 23:22 UTC (permalink / raw)
  To: Andrew Morton
  Cc: David Daney, linux-mips, ralf, linux-kernel, David Daney,
	linux-arch, Robin Holt

Dummy, non-zero definitions for HPAGE_MASK and HPAGE_SIZE were added in
51c6f666fceb ("mm: ZAP_BLOCK causes redundant work") to avoid a divide
by zero in generic kernel code.

That code has since been removed, but probably should never have been
added in the first place: we don't want HPAGE_SIZE to act like PAGE_SIZE
for code that is working with hugepages, for example, when the dependency
on CONFIG_HUGETLB_PAGE has not been fulfilled.

Because hugepage size can differ from architecture to architecture, each
is required to have their own definitions for both HPAGE_MASK and
HPAGE_SIZE.  This is always done in arch/*/include/asm/page.h.

So, just remove the dummy and dangerous definitions since they are no
longer needed and reveals the correct dependencies.  Tested on
architectures using the definitions with allyesconfig: x86 (even with
thp), hppa, mips, powerpc, s390, sh3, sh4, sparc, and sparc64, and
with defconfig on ia64.

Cc: Robin Holt <holt@sgi.com>
Cc: David Daney <david.daney@cavium.com>
Signed-off-by: David Rientjes <rientjes@google.com>
---
 include/linux/hugetlb.h |    5 -----
 1 files changed, 0 insertions(+), 5 deletions(-)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -110,11 +110,6 @@ static inline void copy_huge_page(struct page *dst, struct page *src)
 
 #define hugetlb_change_protection(vma, address, end, newprot)
 
-#ifndef HPAGE_MASK
-#define HPAGE_MASK	PAGE_MASK		/* Keep the compiler happy */
-#define HPAGE_SIZE	PAGE_SIZE
-#endif
-
 #endif /* !CONFIG_HUGETLB_PAGE */
 
 #define HUGETLB_ANON_FILE "anon_hugepage"

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE
  2011-11-17 21:57 ` [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE David Daney
@ 2011-11-17 23:28   ` Andrew Morton
  2011-11-17 23:38     ` David Daney
  2011-11-18  8:56   ` Sergei Shtylyov
  1 sibling, 1 reply; 26+ messages in thread
From: Andrew Morton @ 2011-11-17 23:28 UTC (permalink / raw)
  To: David Daney; +Cc: linux-mips, ralf, linux-kernel, David Daney, David Rientjes

On Thu, 17 Nov 2011 13:57:30 -0800
David Daney <ddaney.cavm@gmail.com> wrote:

> From: David Daney <david.daney@cavium.com>
> 
> It was pointed out by David Rientjes that the dummy values for
> HPAGE_MASK and HPAGE_SIZE are quite unsafe.  It they are inadvertently
> used with !CONFIG_HUGETLB_PAGE, compilation would succeed, but the
> resulting code would surly not do anything sensible.
> 
> Place BUG() in the these dummy definitions, as we do in similar
> circumstances in other places, so any abuse can be easily detected.
> 
> Since the only sane place to use these symbols when
> !CONFIG_HUGETLB_PAGE is on dead code paths, the BUG() cause any actual
> code to be emitted by the compiler.

I assume you meant "omitted" here.

But I don't think it's true.  Any such code would occur after testing
is_vm_hugetlb_page() or similar, and would have been omitted anyway.

> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -111,8 +111,9 @@ static inline void copy_huge_page(struct page *dst, struct page *src)
>  #define hugetlb_change_protection(vma, address, end, newprot)
>  
>  #ifndef HPAGE_MASK
> -#define HPAGE_MASK	PAGE_MASK		/* Keep the compiler happy */
> -#define HPAGE_SIZE	PAGE_SIZE
> +/* Keep the compiler happy with some dummy (but BUGgy) values */

That's a quite poor comment.  This?

--- a/include/linux/hugetlb.h~hugetlb-provide-safer-dummy-values-for-hpage_mask-and-hpage_size-fix
+++ a/include/linux/hugetlb.h
@@ -111,7 +111,11 @@ static inline void copy_huge_page(struct
 #define hugetlb_change_protection(vma, address, end, newprot)
 
 #ifndef HPAGE_MASK
-/* Keep the compiler happy with some dummy (but BUGgy) values */
+/*
+ * HPAGE_MASK and friends are defined if !CONFIG_HUGETLB_PAGE as an
+ * ifdef-avoiding convenience.  However they should never be evaluated at
+ * runtime if !CONFIG_HUGETLB_PAGE.
+ */
 #define HPAGE_MASK	({BUG(); 0; })
 #define HPAGE_SIZE	({BUG(); 0; })
 #define HPAGE_SHIFT	({BUG(); 0; })
_

> +#define HPAGE_MASK	({BUG(); 0; })
> +#define HPAGE_SIZE	({BUG(); 0; })
>  #define HPAGE_SHIFT	({BUG(); 0; })

This change means that HPAGE_* cannot be evaluated at compile time.  So

int foo = HPAGE_SIZE;

outside functions will explode.  I guess that's OK - actually desirable
- as such code shouldn't have been compiled anyway.




^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-17 23:22   ` [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE David Rientjes
@ 2011-11-17 23:35     ` Andrew Morton
  2011-11-17 23:44       ` David Rientjes
  2011-11-21 22:23     ` David Daney
  1 sibling, 1 reply; 26+ messages in thread
From: Andrew Morton @ 2011-11-17 23:35 UTC (permalink / raw)
  To: David Rientjes
  Cc: David Daney, linux-mips, ralf, linux-kernel, David Daney,
	linux-arch, Robin Holt

On Thu, 17 Nov 2011 15:22:53 -0800 (PST)
David Rientjes <rientjes@google.com> wrote:

> So, just remove the dummy and dangerous definitions since they are no
> longer needed and reveals the correct dependencies.  Tested on
> architectures using the definitions with allyesconfig: x86 (even with
> thp), hppa, mips, powerpc, s390, sh3, sh4, sparc, and sparc64, and
> with defconfig on ia64.

How could arch/mips/mm/tlb-r4k.c:local_flush_tlb_range() compile OK
with this change?

What that function is doing looks reasonable to me.  Why fill the poor
thing with an ifdef mess?

otoh, catching mistakes is good too.  Doing it at runtime as David
proposes is OK.


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE
  2011-11-17 23:28   ` Andrew Morton
@ 2011-11-17 23:38     ` David Daney
  0 siblings, 0 replies; 26+ messages in thread
From: David Daney @ 2011-11-17 23:38 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-mips, ralf, linux-kernel, David Daney, David Rientjes

On 11/17/2011 03:28 PM, Andrew Morton wrote:
> On Thu, 17 Nov 2011 13:57:30 -0800
> David Daney<ddaney.cavm@gmail.com>  wrote:
>
>> From: David Daney<david.daney@cavium.com>
>>
>> It was pointed out by David Rientjes that the dummy values for
>> HPAGE_MASK and HPAGE_SIZE are quite unsafe.  It they are inadvertently
>> used with !CONFIG_HUGETLB_PAGE, compilation would succeed, but the
>> resulting code would surly not do anything sensible.
>>
>> Place BUG() in the these dummy definitions, as we do in similar
>> circumstances in other places, so any abuse can be easily detected.
>>
>> Since the only sane place to use these symbols when
>> !CONFIG_HUGETLB_PAGE is on dead code paths, the BUG() cause any actual
>> code to be emitted by the compiler.
>
> I assume you meant "omitted" here.

I jumbled it up.  It should read:

... the BUG() will not cause any actual code to be emitted by the 
compiler.  In fact I have verified this on both MIPS64 and x86_64 kernels.

I could re-spin the patch with a corrected changelog if desired.

>
> But I don't think it's true.  Any such code would occur after testing
> is_vm_hugetlb_page() or similar, and would have been omitted anyway.
>

The point being that we are doing:

if (is_vm_hugetlb_page(vma)) {
	/* Do something with HPAGE_MASK*/
} else {
	/* Do something with PAGE_MASK */
}

In the !CONFIG_HUGETLB_PAGE case we have:
static inline int is_vm_hugetlb_page(struct vm_area_struct *vma)
{
	return 0;
}

The compiler sees that the usage of the dummy definitions is in a dead 
code path and nothing is emitted.

>> --- a/include/linux/hugetlb.h
>> +++ b/include/linux/hugetlb.h
>> @@ -111,8 +111,9 @@ static inline void copy_huge_page(struct page *dst, struct page *src)
>>   #define hugetlb_change_protection(vma, address, end, newprot)
>>
>>   #ifndef HPAGE_MASK
>> -#define HPAGE_MASK	PAGE_MASK		/* Keep the compiler happy */
>> -#define HPAGE_SIZE	PAGE_SIZE
>> +/* Keep the compiler happy with some dummy (but BUGgy) values */
>
> That's a quite poor comment.  This?

I was trying to communicate the presence of the BUG() in the definition. 
  Perhaps it is more confusing than it was before.

>
> --- a/include/linux/hugetlb.h~hugetlb-provide-safer-dummy-values-for-hpage_mask-and-hpage_size-fix
> +++ a/include/linux/hugetlb.h
> @@ -111,7 +111,11 @@ static inline void copy_huge_page(struct
>   #define hugetlb_change_protection(vma, address, end, newprot)
>
>   #ifndef HPAGE_MASK
> -/* Keep the compiler happy with some dummy (but BUGgy) values */
> +/*
> + * HPAGE_MASK and friends are defined if !CONFIG_HUGETLB_PAGE as an
> + * ifdef-avoiding convenience.  However they should never be evaluated at
> + * runtime if !CONFIG_HUGETLB_PAGE.
> + */
>   #define HPAGE_MASK	({BUG(); 0; })
>   #define HPAGE_SIZE	({BUG(); 0; })
>   #define HPAGE_SHIFT	({BUG(); 0; })
> _
>
>> +#define HPAGE_MASK	({BUG(); 0; })
>> +#define HPAGE_SIZE	({BUG(); 0; })
>>   #define HPAGE_SHIFT	({BUG(); 0; })
>
> This change means that HPAGE_* cannot be evaluated at compile time.  So
>
> int foo = HPAGE_SIZE;
>
> outside functions will explode.  I guess that's OK - actually desirable
> - as such code shouldn't have been compiled anyway.
>

The exact point of the patch.

Thanks,
David Daney



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-17 23:35     ` Andrew Morton
@ 2011-11-17 23:44       ` David Rientjes
  2011-11-17 23:52         ` David Daney
  0 siblings, 1 reply; 26+ messages in thread
From: David Rientjes @ 2011-11-17 23:44 UTC (permalink / raw)
  To: Andrew Morton
  Cc: David Daney, linux-mips, ralf, linux-kernel, David Daney,
	linux-arch, Robin Holt

On Thu, 17 Nov 2011, Andrew Morton wrote:

> > So, just remove the dummy and dangerous definitions since they are no
> > longer needed and reveals the correct dependencies.  Tested on
> > architectures using the definitions with allyesconfig: x86 (even with
> > thp), hppa, mips, powerpc, s390, sh3, sh4, sparc, and sparc64, and
> > with defconfig on ia64.
> 
> How could arch/mips/mm/tlb-r4k.c:local_flush_tlb_range() compile OK
> with this change?
> 

This was tested on Linus' tree, not on Ralf's linux-next tree.  All uses 
of HPAGE_* are protected by CONFIG_HUGETLB_PAGE as it appropriately should 
be in Linus' tree in that file.

> What that function is doing looks reasonable to me.  Why fill the poor
> thing with an ifdef mess?
> 
> otoh, catching mistakes is good too.  Doing it at runtime as David
> proposes is OK.
> 

Nobody else needs it other than Ralf's pending change, and you're 
suggesting we need them in a generic header file when any sane arch that 
uses hugepages (all of them, in the current tree) declares these 
themselves in arch/*/include/asm/page.h where it's supposed to be done?

Why on earth do we have CONFIG_HUGETLB_PAGE for at all, then?  To catch 
code that's operating on hugepages when our kernel doesn't support it.  
I'd much rather break the build than get a runtime BUG() because we want 
to avoid an #ifdef or actually write well-written code like every other 
arch has!  Panicking the code to find errors like this is just insanity.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-17 23:44       ` David Rientjes
@ 2011-11-17 23:52         ` David Daney
  2011-11-17 23:57           ` Andrew Morton
  2011-11-17 23:57           ` David Rientjes
  0 siblings, 2 replies; 26+ messages in thread
From: David Daney @ 2011-11-17 23:52 UTC (permalink / raw)
  To: David Rientjes
  Cc: Andrew Morton, David Daney, linux-mips@linux-mips.org,
	ralf@linux-mips.org, linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

On 11/17/2011 03:44 PM, David Rientjes wrote:
> On Thu, 17 Nov 2011, Andrew Morton wrote:
>
>>> So, just remove the dummy and dangerous definitions since they are no
>>> longer needed and reveals the correct dependencies.  Tested on
>>> architectures using the definitions with allyesconfig: x86 (even with
>>> thp), hppa, mips, powerpc, s390, sh3, sh4, sparc, and sparc64, and
>>> with defconfig on ia64.
>>
>> How could arch/mips/mm/tlb-r4k.c:local_flush_tlb_range() compile OK
>> with this change?
>>
>
> This was tested on Linus' tree, not on Ralf's linux-next tree.  All uses
> of HPAGE_* are protected by CONFIG_HUGETLB_PAGE as it appropriately should
> be in Linus' tree in that file.
>
>> What that function is doing looks reasonable to me.  Why fill the poor
>> thing with an ifdef mess?
>>
>> otoh, catching mistakes is good too.  Doing it at runtime as David
>> proposes is OK.
>>
>
> Nobody else needs it other than Ralf's pending change, and you're
> suggesting we need them in a generic header file when any sane arch that
> uses hugepages (all of them, in the current tree) declares these
> themselves in arch/*/include/asm/page.h where it's supposed to be done?
>
> Why on earth do we have CONFIG_HUGETLB_PAGE for at all, then?  To catch
> code that's operating on hugepages when our kernel doesn't support it.
> I'd much rather break the build than get a runtime BUG() because we want
> to avoid an #ifdef or actually write well-written code like every other
> arch has!  Panicking the code to find errors like this is just insanity.
>

A counter argument would be:

There are hundreds of places in the kernel where dummy definitions are 
selected by !CONFIG_* so that we can do:

    if (test_something()) {
       do_one_thing();
    } else {
       do_the_other_thing();
    }


Rather than:

#ifdef CONFIG_SOMETHING
    if (test_something()) {
       do_one_thing();
    } else
#else
    {
       do_the_other_thing();
    }



We even do this all over the place with dummy definitions selected by 
CONFIG_HUGETLB_PAGE, What exactly makes HPAGE_MASK special and not the 
hundreds of other similar situations?

David Daney


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-17 23:52         ` David Daney
@ 2011-11-17 23:57           ` Andrew Morton
  2011-11-17 23:57           ` David Rientjes
  1 sibling, 0 replies; 26+ messages in thread
From: Andrew Morton @ 2011-11-17 23:57 UTC (permalink / raw)
  To: David Daney
  Cc: David Rientjes, linux-mips@linux-mips.org, ralf@linux-mips.org,
	linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

On Thu, 17 Nov 2011 15:52:28 -0800
David Daney <ddaney.cavm@gmail.com> wrote:

> A counter argument would be:
> 
> There are hundreds of places in the kernel where dummy definitions are 
> selected by !CONFIG_* so that we can do:
> 
>     if (test_something()) {
>        do_one_thing();
>     } else {
>        do_the_other_thing();
>     }
> 
> 
> Rather than:
> 
> #ifdef CONFIG_SOMETHING
>     if (test_something()) {
>        do_one_thing();
>     } else
> #else
>     {
>        do_the_other_thing();
>     }
> 
> 
> 
> We even do this all over the place with dummy definitions selected by 
> CONFIG_HUGETLB_PAGE, What exactly makes HPAGE_MASK special and not the 
> hundreds of other similar situations?

yup.  Look at free_pgtables():

		if (is_vm_hugetlb_page(vma)) {
			hugetlb_free_pgd_range(tlb, addr, vma->vm_end,
				floor, next? next->vm_start: ceiling);
		} else {

and

#define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; })

This is the same thing.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-17 23:52         ` David Daney
  2011-11-17 23:57           ` Andrew Morton
@ 2011-11-17 23:57           ` David Rientjes
  1 sibling, 0 replies; 26+ messages in thread
From: David Rientjes @ 2011-11-17 23:57 UTC (permalink / raw)
  To: David Daney
  Cc: Andrew Morton, linux-mips@linux-mips.org, ralf@linux-mips.org,
	linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

On Thu, 17 Nov 2011, David Daney wrote:

> A counter argument would be:
> 
> There are hundreds of places in the kernel where dummy definitions are
> selected by !CONFIG_* so that we can do:
> 
>    if (test_something()) {
>       do_one_thing();
>    } else {
>       do_the_other_thing();
>    }
> 
> 
> Rather than:
> 
> #ifdef CONFIG_SOMETHING
>    if (test_something()) {
>       do_one_thing();
>    } else
> #else
>    {
>       do_the_other_thing();
>    }
> 
> 
> 
> We even do this all over the place with dummy definitions selected by
> CONFIG_HUGETLB_PAGE, What exactly makes HPAGE_MASK special and not the
> hundreds of other similar situations?
> 

Dummy functions that return 0 when a feature isn't enabled isn't the 
problem, that's very convenient.  Definitions of constants are a 
completely separate story because they can be easily used outside the 
required context and cause brekage.  What happens if you reference a 
variable in a function that is declarated in a different function?  Does 
the compiler put a BUG() in there and let you explode at runtime?  This is 
just absurd, every other arch has done the necessary declarations in their 
own header files and everything works fine because there's a clear config 
dependency on using HPAGE_*.  Adding dummy definitions to panic at runtime 
is irresponsibly to an extreme.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE
  2011-11-17 21:57 ` [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE David Daney
  2011-11-17 23:28   ` Andrew Morton
@ 2011-11-18  8:56   ` Sergei Shtylyov
  2011-11-18 17:14     ` David Daney
  1 sibling, 1 reply; 26+ messages in thread
From: Sergei Shtylyov @ 2011-11-18  8:56 UTC (permalink / raw)
  To: David Daney
  Cc: linux-mips, ralf, Andrew Morton, linux-kernel, David Daney,
	David Rientjes

Hello.

On 18-11-2011 1:57, David Daney wrote:

> From: David Daney<david.daney@cavium.com>

> It was pointed out by David Rientjes that the dummy values for
> HPAGE_MASK and HPAGE_SIZE are quite unsafe.  It they are inadvertently
> used with !CONFIG_HUGETLB_PAGE, compilation would succeed, but the
> resulting code would surly not do anything sensible.
>
> Place BUG() in the these dummy definitions, as we do in similar
> circumstances in other places, so any abuse can be easily detected.
>
> Since the only sane place to use these symbols when
> !CONFIG_HUGETLB_PAGE is on dead code paths, the BUG() cause any actual
> code to be emitted by the compiler.

    You mean "doesn't cause"?

> Cc: David Rientjes<rientjes@google.com>
> Signed-off-by: David Daney<david.daney@cavium.com>

WBR, Sergei


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE
  2011-11-18  8:56   ` Sergei Shtylyov
@ 2011-11-18 17:14     ` David Daney
  0 siblings, 0 replies; 26+ messages in thread
From: David Daney @ 2011-11-18 17:14 UTC (permalink / raw)
  To: Sergei Shtylyov, Andrew Morton
  Cc: linux-mips, ralf, linux-kernel, David Daney

On 11/18/2011 12:56 AM, Sergei Shtylyov wrote:
> Hello.
>
> On 18-11-2011 1:57, David Daney wrote:
>
>> From: David Daney<david.daney@cavium.com>
>
>> It was pointed out by David Rientjes that the dummy values for
>> HPAGE_MASK and HPAGE_SIZE are quite unsafe. It they are inadvertently
>> used with !CONFIG_HUGETLB_PAGE, compilation would succeed, but the
>> resulting code would surly not do anything sensible.
>>
>> Place BUG() in the these dummy definitions, as we do in similar
>> circumstances in other places, so any abuse can be easily detected.
>>
>> Since the only sane place to use these symbols when
>> !CONFIG_HUGETLB_PAGE is on dead code paths, the BUG() cause any actual
>> code to be emitted by the compiler.
>
> You mean "doesn't cause"?

Yes.

I mentioned this in a different message to akpm, but I am not sure if I 
should resend the patch with a corrected change log.

David Daney

>
>> Cc: David Rientjes<rientjes@google.com>
>> Signed-off-by: David Daney<david.daney@cavium.com>
>
> WBR, Sergei
>
>


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-17 23:22   ` [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE David Rientjes
  2011-11-17 23:35     ` Andrew Morton
@ 2011-11-21 22:23     ` David Daney
  2011-11-21 22:43       ` Linus Torvalds
  2011-11-21 22:48       ` David Rientjes
  1 sibling, 2 replies; 26+ messages in thread
From: David Daney @ 2011-11-21 22:23 UTC (permalink / raw)
  To: David Rientjes, Andrew Morton, Linus Torvalds
  Cc: linux-mips, ralf, linux-kernel, David Daney, linux-arch,
	Robin Holt

Linus,

It may not have been evident when you committed this (commit 
a5c86e986f0b2fe779f13cf53ce6e9f467b03950), but there was considerable 
discussion around this patch.

Andrew had taken into his tree a couple of patches to make the 
definitions that David Rientjes is removing safer:

http://marc.info/?l=linux-kernel&m=132156712623915&w=2
http://marc.info/?l=linux-kernel&m=132156712523914&w=2

David objected, but Andrew wasn't convinced, see all the replies to this 
patch but especially:

http://marc.info/?l=linux-kernel&m=132157428626522&w=2

On 11/17/2011 03:22 PM, David Rientjes wrote:
> Dummy, non-zero definitions for HPAGE_MASK and HPAGE_SIZE were added in
> 51c6f666fceb ("mm: ZAP_BLOCK causes redundant work") to avoid a divide
> by zero in generic kernel code.
>
> That code has since been removed, but probably should never have been
> added in the first place: we don't want HPAGE_SIZE to act like PAGE_SIZE
> for code that is working with hugepages, for example, when the dependency
> on CONFIG_HUGETLB_PAGE has not been fulfilled.
>
> Because hugepage size can differ from architecture to architecture, each
> is required to have their own definitions for both HPAGE_MASK and
> HPAGE_SIZE.  This is always done in arch/*/include/asm/page.h.
>
> So, just remove the dummy and dangerous definitions since they are no
> longer needed and reveals the correct dependencies.  Tested on
> architectures using the definitions with allyesconfig: x86 (even with
> thp), hppa, mips, powerpc, s390, sh3, sh4, sparc, and sparc64, and
> with defconfig on ia64.
>

This whole comment strikes me as somewhat dishonest, as at the time 
David Rientjes wrote it, he knew that there were dependencies on these 
symbols in the linux-next tree.

Now we can add these:
+#define HPAGE_SHIFT	({ BUG(); 0; })
+#define HPAGE_SIZE	({ BUG(); 0; })
+#define HPAGE_MASK	({ BUG(); 0; })

To the different architecture header files instead of having them in the 
common include/linux/hugetlb.h

If this is the way Linus wants it, I can live with that.  But it was a 
little surprising to see that this was merged when there were strong 
arguments against it.

David Daney

> Cc: Robin Holt<holt@sgi.com>
> Cc: David Daney<david.daney@cavium.com>
> Signed-off-by: David Rientjes<rientjes@google.com>
> ---
>   include/linux/hugetlb.h |    5 -----
>   1 files changed, 0 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -110,11 +110,6 @@ static inline void copy_huge_page(struct page *dst, struct page *src)
>
>   #define hugetlb_change_protection(vma, address, end, newprot)
>
> -#ifndef HPAGE_MASK
> -#define HPAGE_MASK	PAGE_MASK		/* Keep the compiler happy */
> -#define HPAGE_SIZE	PAGE_SIZE
> -#endif
> -
>   #endif /* !CONFIG_HUGETLB_PAGE */
>
>   #define HUGETLB_ANON_FILE "anon_hugepage"
>


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 22:23     ` David Daney
@ 2011-11-21 22:43       ` Linus Torvalds
  2011-11-21 23:23         ` David Daney
  2011-11-21 23:47         ` David Daney
  2011-11-21 22:48       ` David Rientjes
  1 sibling, 2 replies; 26+ messages in thread
From: Linus Torvalds @ 2011-11-21 22:43 UTC (permalink / raw)
  To: David Daney
  Cc: David Rientjes, Andrew Morton, linux-mips, ralf, linux-kernel,
	David Daney, linux-arch, Robin Holt

On Mon, Nov 21, 2011 at 2:23 PM, David Daney <ddaney.cavm@gmail.com> wrote:
>
> This whole comment strikes me as somewhat dishonest, as at the time David
> Rientjes wrote it, he knew that there were dependencies on these symbols in
> the linux-next tree.
>
> Now we can add these:
> +#define HPAGE_SHIFT    ({ BUG(); 0; })
> +#define HPAGE_SIZE     ({ BUG(); 0; })
> +#define HPAGE_MASK     ({ BUG(); 0; })

Hell no.

We don't do run-time BUG() things. No way, no how.

If that #define cannot be used, then it damn well shouldn't be defined at all.

David's patch is clearly the right thing to do. Don't try to send me
the above kind of insane crap.

                     Linus

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 22:23     ` David Daney
  2011-11-21 22:43       ` Linus Torvalds
@ 2011-11-21 22:48       ` David Rientjes
  1 sibling, 0 replies; 26+ messages in thread
From: David Rientjes @ 2011-11-21 22:48 UTC (permalink / raw)
  To: David Daney
  Cc: Andrew Morton, Linus Torvalds, linux-mips, ralf, linux-kernel,
	David Daney, linux-arch, Robin Holt

On Mon, 21 Nov 2011, David Daney wrote:

> > So, just remove the dummy and dangerous definitions since they are no
> > longer needed and reveals the correct dependencies.  Tested on
> > architectures using the definitions with allyesconfig: x86 (even with
> > thp), hppa, mips, powerpc, s390, sh3, sh4, sparc, and sparc64, and
> > with defconfig on ia64.
> > 
> 
> This whole comment strikes me as somewhat dishonest, as at the time David
> Rientjes wrote it, he knew that there were dependencies on these symbols in
> the linux-next tree.
> 

I was referring to Linus' tree at the time the patch was merged, not 
linux-next.  However, yes, I was aware of the build breakage it caused in 
Ralf's mips tree and I sent a patch to fix that breakage to the mips 
folks:

	http://marc.info/?l=linux-mips&m=132175788803677

Thanks.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 22:43       ` Linus Torvalds
@ 2011-11-21 23:23         ` David Daney
  2011-11-21 23:43           ` Linus Torvalds
  2011-11-21 23:47         ` David Daney
  1 sibling, 1 reply; 26+ messages in thread
From: David Daney @ 2011-11-21 23:23 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: David Daney, David Rientjes, Andrew Morton,
	linux-mips@linux-mips.org, ralf@linux-mips.org,
	linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

On 11/21/2011 02:43 PM, Linus Torvalds wrote:
> On Mon, Nov 21, 2011 at 2:23 PM, David Daney<ddaney.cavm@gmail.com>  wrote:
>>
>> This whole comment strikes me as somewhat dishonest, as at the time David
>> Rientjes wrote it, he knew that there were dependencies on these symbols in
>> the linux-next tree.
>>
>> Now we can add these:
>> +#define HPAGE_SHIFT    ({ BUG(); 0; })
>> +#define HPAGE_SIZE     ({ BUG(); 0; })
>> +#define HPAGE_MASK     ({ BUG(); 0; })
>
> Hell no.
>
> We don't do run-time BUG() things. No way, no how.
>
> If that #define cannot be used, then it damn well shouldn't be defined at all.
>
> David's patch is clearly the right thing to do. Don't try to send me
> the above kind of insane crap.
>

Ok Linus, for you I would recommend against running this git command on 
your tree:

git grep -E '#define.+BUG\(\);'

It's not like there isn't precedence.

David Daney

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 23:23         ` David Daney
@ 2011-11-21 23:43           ` Linus Torvalds
  2011-11-21 23:50             ` Andrew Morton
  0 siblings, 1 reply; 26+ messages in thread
From: Linus Torvalds @ 2011-11-21 23:43 UTC (permalink / raw)
  To: David Daney
  Cc: David Daney, David Rientjes, Andrew Morton,
	linux-mips@linux-mips.org, ralf@linux-mips.org,
	linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

On Mon, Nov 21, 2011 at 3:23 PM, David Daney <ddaney@caviumnetworks.com> wrote:
>
> Ok Linus, for you I would recommend against running this git command on your
> tree:
>
> git grep -E '#define.+BUG\(\);'
>
> It's not like there isn't precedence.

So two wrongs make a right?

I do note that almost all the BUG() ones are in the same broken area:
hugepages. There's something wrong with the development there.

I wish people whose code had stuff like that would take a deep look at it.

                        Linus

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 22:43       ` Linus Torvalds
  2011-11-21 23:23         ` David Daney
@ 2011-11-21 23:47         ` David Daney
  2011-11-21 23:53           ` Andrew Morton
  2011-11-22  0:37           ` Linus Torvalds
  1 sibling, 2 replies; 26+ messages in thread
From: David Daney @ 2011-11-21 23:47 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: David Rientjes, Andrew Morton, linux-mips, ralf, linux-kernel,
	David Daney, linux-arch, Robin Holt

Just to expand on this lovely topic...

On 11/21/2011 02:43 PM, Linus Torvalds wrote:
> On Mon, Nov 21, 2011 at 2:23 PM, David Daney<ddaney.cavm@gmail.com>  wrote:
>>
>> This whole comment strikes me as somewhat dishonest, as at the time David
>> Rientjes wrote it, he knew that there were dependencies on these symbols in
>> the linux-next tree.
>>
>> Now we can add these:
>> +#define HPAGE_SHIFT    ({ BUG(); 0; })
>> +#define HPAGE_SIZE     ({ BUG(); 0; })
>> +#define HPAGE_MASK     ({ BUG(); 0; })
>
> Hell no.
>
> We don't do run-time BUG() things. No way, no how.
>

These symbols are on dead code paths, so they are eliminated by the 
compiler's Dead Code Elimination (DCE) optimizations, and the BUG() code 
never gets emitted to the final executable.

I agree that it is not the best thing to do, but given the current state 
of the art in build bug macros, it is the best we could have done.

What I think we need instead, and for which I will send a patch soon, is 
something like this:

extern void you_are_screwed() __attribute__ ((error("BUILD_BUG_ON_USED 
failed")));
#define BUILD_BUG_ON_USED() you_are_screwed()
#define HPAGE_SHIFT    ({ BUILD_BUG_ON_USED(); 0; })

This allows us to use the symbols in straight line C code without a ton 
of ugly #ifdefery, but give us build time error checking.

Thanks,
David Daney


> If that #define cannot be used, then it damn well shouldn't be defined at all.
>
> David's patch is clearly the right thing to do. Don't try to send me
> the above kind of insane crap.
>
>                       Linus
>


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 23:43           ` Linus Torvalds
@ 2011-11-21 23:50             ` Andrew Morton
  2011-11-22 20:41               ` Andi Kleen
  0 siblings, 1 reply; 26+ messages in thread
From: Andrew Morton @ 2011-11-21 23:50 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: David Daney, David Daney, David Rientjes,
	linux-mips@linux-mips.org, ralf@linux-mips.org,
	linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

On Mon, 21 Nov 2011 15:43:26 -0800
Linus Torvalds <torvalds@linux-foundation.org> wrote:

> On Mon, Nov 21, 2011 at 3:23 PM, David Daney <ddaney@caviumnetworks.com> wrote:
> >
> > Ok Linus, for you I would recommend against running this git command on your
> > tree:
> >
> > git grep -E '#define.+BUG\(\);'
> >
> > It's not like there isn't precedence.
> 
> So two wrongs make a right?
> 
> I do note that almost all the BUG() ones are in the same broken area:
> hugepages. There's something wrong with the development there.
> 
> I wish people whose code had stuff like that would take a deep look at it.
> 

The original decision way back when was that huge pages shouldn't mess
up the core VM too much.  One way in which we addressed that was to
make all its functions compilable with CONFIG_HUGETLB_PAGE=n, but they
should never be executed.  So the basic implementation pattern is:

#ifndef CONFIG_HUGETLB_PAGE
#define is_vm_hugetlb_page(p) 0
#define hugetlb_foo(x) BUG()

and...

	if (is_vm_hugetlb_page(...))
		hugetlb_foo(...);

The is_vm_hugetlb_page() evaluates to literal zero and so no code is
emitted for the hugetlb_foo() call.  The BUG() should never appear in
vmlinux but it's in there as a we-screwed-up thing.




^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 23:47         ` David Daney
@ 2011-11-21 23:53           ` Andrew Morton
  2011-11-22  0:37           ` Linus Torvalds
  1 sibling, 0 replies; 26+ messages in thread
From: Andrew Morton @ 2011-11-21 23:53 UTC (permalink / raw)
  To: David Daney
  Cc: Linus Torvalds, David Rientjes, linux-mips, ralf, linux-kernel,
	David Daney, linux-arch, Robin Holt

On Mon, 21 Nov 2011 15:47:32 -0800
David Daney <ddaney.cavm@gmail.com> wrote:

> Just to expand on this lovely topic...
> 
> On 11/21/2011 02:43 PM, Linus Torvalds wrote:
> > On Mon, Nov 21, 2011 at 2:23 PM, David Daney<ddaney.cavm@gmail.com>  wrote:
> >>
> >> This whole comment strikes me as somewhat dishonest, as at the time David
> >> Rientjes wrote it, he knew that there were dependencies on these symbols in
> >> the linux-next tree.
> >>
> >> Now we can add these:
> >> +#define HPAGE_SHIFT    ({ BUG(); 0; })
> >> +#define HPAGE_SIZE     ({ BUG(); 0; })
> >> +#define HPAGE_MASK     ({ BUG(); 0; })
> >
> > Hell no.
> >
> > We don't do run-time BUG() things. No way, no how.
> >
> 
> These symbols are on dead code paths, so they are eliminated by the 
> compiler's Dead Code Elimination (DCE) optimizations, and the BUG() code 
> never gets emitted to the final executable.
> 
> I agree that it is not the best thing to do, but given the current state 
> of the art in build bug macros, it is the best we could have done.
> 
> What I think we need instead, and for which I will send a patch soon, is 
> something like this:
> 
> extern void you_are_screwed() __attribute__ ((error("BUILD_BUG_ON_USED 
> failed")));
> #define BUILD_BUG_ON_USED() you_are_screwed()
> #define HPAGE_SHIFT    ({ BUILD_BUG_ON_USED(); 0; })
> 
> This allows us to use the symbols in straight line C code without a ton 
> of ugly #ifdefery, but give us build time error checking.

The way we usually handle that is to emit a call to a
this_function_does_not_exist(), so it fails at link time.

I guess we should do that to all those follow_hugetlb_page() and
friends.

gcc has had issues at times where it incorrectly emits references to
this_function_does_not_exist(), but that hasn't happened in a couple of
years as far as I know.


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 23:47         ` David Daney
  2011-11-21 23:53           ` Andrew Morton
@ 2011-11-22  0:37           ` Linus Torvalds
  2011-11-22  0:48             ` David Daney
  1 sibling, 1 reply; 26+ messages in thread
From: Linus Torvalds @ 2011-11-22  0:37 UTC (permalink / raw)
  To: David Daney
  Cc: David Rientjes, Andrew Morton, linux-mips, ralf, linux-kernel,
	David Daney, linux-arch, Robin Holt

On Mon, Nov 21, 2011 at 3:47 PM, David Daney <ddaney.cavm@gmail.com> wrote:
>
> These symbols are on dead code paths, so they are eliminated by the
> compiler's Dead Code Elimination (DCE) optimizations, and the BUG() code
> never gets emitted to the final executable.

If you are so damn sure of that, then DON'T MAKE IT A BUG_ON! If you
are 100% syre, then you might as well leave out the BUG_ON() entirely.

Seriously. What's so hard to understand?

Either you are 100% sure, or you are not. If you are 100% sure, then
the BUG_ON() is pointless. And if you are not, then the BUG_ON() is
*wrong*.

Notice? The BUG_ON() is never *ever* valid. You cannot have it both
ways. So stop pushing crap, already!

So what are non-crap solutions?

 - the current one: error out at compile time (early) if somebody uses
them in invalid contexts.

   This seems to be a good case, especially since apparently no actual
current code wants to use them outside of the existing #ifdef's. And
there is no reason to think that some random MIPS-only future code is
a good enough reason to re-introduce these things

 - if you really want to use them, but expect the compiler to always
compile them away as dead code, use a non-existing function linkage,
so that you at least get a static failure at link-time for incorrect
code, rather than some random BUG_ON() at run-time that may be
impossible to find.

See? There are real solutions. BUG_ON() is not one of them.

                  Linus

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-22  0:37           ` Linus Torvalds
@ 2011-11-22  0:48             ` David Daney
  2011-11-22  0:55               ` Linus Torvalds
  0 siblings, 1 reply; 26+ messages in thread
From: David Daney @ 2011-11-22  0:48 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: David Daney, David Rientjes, Andrew Morton,
	linux-mips@linux-mips.org, ralf@linux-mips.org,
	linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

On 11/21/2011 04:37 PM, Linus Torvalds wrote:
> On Mon, Nov 21, 2011 at 3:47 PM, David Daney<ddaney.cavm@gmail.com>  wrote:
>>
>> These symbols are on dead code paths, so they are eliminated by the
>> compiler's Dead Code Elimination (DCE) optimizations, and the BUG() code
>> never gets emitted to the final executable.
>
> If you are so damn sure of that, then DON'T MAKE IT A BUG_ON! If you
> are 100% syre, then you might as well leave out the BUG_ON() entirely.
>
> Seriously. What's so hard to understand?

Really Linus, did you read the other half of the message you quoted?

The part you quote above explains the reason things are the way they 
currently are.

The second part, that I think you may have missed, is the part I had 
hoped you would read...

>
> Either you are 100% sure, or you are not. If you are 100% sure, then
> the BUG_ON() is pointless. And if you are not, then the BUG_ON() is
> *wrong*.
>
> Notice? The BUG_ON() is never *ever* valid. You cannot have it both
> ways. So stop pushing crap, already!
>
> So what are non-crap solutions?
>
>   - the current one: error out at compile time (early) if somebody uses
> them in invalid contexts.
>
>     This seems to be a good case, especially since apparently no actual
> current code wants to use them outside of the existing #ifdef's. And
> there is no reason to think that some random MIPS-only future code is
> a good enough reason to re-introduce these things
>
>   - if you really want to use them, but expect the compiler to always
> compile them away as dead code, use a non-existing function linkage,
> so that you at least get a static failure at link-time for incorrect
> code, rather than some random BUG_ON() at run-time that may be
> impossible to find.
>
> See? There are real solutions. BUG_ON() is not one of them.

... because it said exactly what you say above.

I will send you a patch within the next two hours that shows what may be 
an acceptable solution.

Thanks,
David Daney

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-22  0:48             ` David Daney
@ 2011-11-22  0:55               ` Linus Torvalds
  0 siblings, 0 replies; 26+ messages in thread
From: Linus Torvalds @ 2011-11-22  0:55 UTC (permalink / raw)
  To: David Daney
  Cc: David Daney, David Rientjes, Andrew Morton,
	linux-mips@linux-mips.org, ralf@linux-mips.org,
	linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

On Mon, Nov 21, 2011 at 4:48 PM, David Daney <ddaney@caviumnetworks.com> wrote:
>
> Really Linus, did you read the other half of the message you quoted?

Sorry no. It was just an automatic reaction along the lines of "oh
christ, is this argument still going on"?

I'm ok with magic gcc function attributes, although I still don't see
why you need that symbol so badly.

Quite frankly, some MIPS-only patch is *not* important-enough to worry
about this. I'd rather have the simpler "that symbol doesn't exist,
and MIPS just needs an #ifdef".

I realize that we *used* to have code that did that

   if (something_that_evaluates_to_zero) {
       .. use HPAGE_MASK ..

but considering that we don't have that any more and people are happy,
I'm not all that convinced that we need to try to re-introduce it.

                     Linus

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE
  2011-11-21 23:50             ` Andrew Morton
@ 2011-11-22 20:41               ` Andi Kleen
  0 siblings, 0 replies; 26+ messages in thread
From: Andi Kleen @ 2011-11-22 20:41 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Linus Torvalds, David Daney, David Daney, David Rientjes,
	linux-mips@linux-mips.org, ralf@linux-mips.org,
	linux-kernel@vger.kernel.org, David Daney,
	linux-arch@vger.kernel.org, Robin Holt

Andrew Morton <akpm@linux-foundation.org> writes:
>> 
>> I wish people whose code had stuff like that would take a deep look at it.
>> 
>
> The original decision way back when was that huge pages shouldn't mess
> up the core VM too much.  One way in which we addressed that was to

IMHO this decision should really be revisited now.  Originally hugetlb
was pretty simple, but these days it has most of the functionality of a
full VM now. In fact with THP we have 3 different VM systems now, all
subtle different with different issues. And with THP hugetlb will be
even more widely used than it is today.

On the other hand there are strange gaps now, like shared memory
doesn't work with THP, but only with hugetlbfs.

It would be far better to think about unifying these three VMs. Then with
less ifdefs it would also not need hacks like this anymore.

-Andi

-- 
ak@linux.intel.com -- Speaking for myself only

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2011-11-22 20:41 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-17 21:57 [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE David Daney
2011-11-17 21:57 ` [PATCH v2 1/2] hugetlb: Provide a default HPAGE_SHIFT if !CONFIG_HUGETLB_PAGE David Daney
2011-11-17 21:57 ` [PATCH v2 2/2] hugetlb: Provide safer dummy values for HPAGE_MASK and HPAGE_SIZE David Daney
2011-11-17 23:28   ` Andrew Morton
2011-11-17 23:38     ` David Daney
2011-11-18  8:56   ` Sergei Shtylyov
2011-11-18 17:14     ` David Daney
2011-11-17 23:22 ` [PATCH v2 0/2] Dummy HPAGE_* constants for !CONFIG_HUGETLB_PAGE David Rientjes
2011-11-17 23:22   ` [patch] hugetlb: remove dummy definitions of HPAGE_MASK and HPAGE_SIZE David Rientjes
2011-11-17 23:35     ` Andrew Morton
2011-11-17 23:44       ` David Rientjes
2011-11-17 23:52         ` David Daney
2011-11-17 23:57           ` Andrew Morton
2011-11-17 23:57           ` David Rientjes
2011-11-21 22:23     ` David Daney
2011-11-21 22:43       ` Linus Torvalds
2011-11-21 23:23         ` David Daney
2011-11-21 23:43           ` Linus Torvalds
2011-11-21 23:50             ` Andrew Morton
2011-11-22 20:41               ` Andi Kleen
2011-11-21 23:47         ` David Daney
2011-11-21 23:53           ` Andrew Morton
2011-11-22  0:37           ` Linus Torvalds
2011-11-22  0:48             ` David Daney
2011-11-22  0:55               ` Linus Torvalds
2011-11-21 22:48       ` David Rientjes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).