Variable PTE_FILE_MAX_BITS
Andrew,
would you be so kind to take this and forward to Linus? I think this segment of the code is your brainchild.
On sparc, the PTE_FILE_MAX_BITS is variable (Worse, actually... we change all occurences in kernel text segment to correct value at boot time.) This should not harm other arches, because gcc is capable to optimize constant conditions.
-- Pete
mm/fremap.c +4 -4
@@ -136,10 +136,10 @@return err;/* Can we represent this offset inside this architecture's pte's? */ -#if PTE_FILE_MAX_BITS <BITS_PER_LONG -if (pgoff + (size >>PAGE_SHIFT ) >= (1UL <<PTE_FILE_MAX_BITS )) -return err; -#endif +/* This needs to be evaluated at runtime on some platforms */ +if (PTE_FILE_MAX_BITS <BITS_PER_LONG ) +if (pgoff + (size >>PAGE_SHIFT ) >= (1UL <<PTE_FILE_MAX_BITS )) +return err;down_read (&mm->mmap_sem);
Quoted 5 lines · Pete Zaitcev
Andrew,
would you be so kind to take this and forward to Linus? I think this segment of the code is your brainchild.
y'know, as I was writing that code I thought "no architecture could be dumb enough to make PTE_FILE_MAX_BITS variable".
Quoted 1 line
On sparc
Ah. That architecture.
Quoted 6 lines
mm/fremap.c +0
-0@@ -136,10 +136,10 @@return err;
mm/fremap.c line 143
Quoted 10 lines
mm/fremap.c +4
-4/* Can we represent this offset inside this architecture's pte's? */ -#if PTE_FILE_MAX_BITS <BITS_PER_LONG -if (pgoff + (size >>PAGE_SHIFT ) >= (1UL <<PTE_FILE_MAX_BITS )) -return err; -#endif +/* This needs to be evaluated at runtime on some platforms */ +if (PTE_FILE_MAX_BITS <BITS_PER_LONG ) +if (pgoff + (size >>PAGE_SHIFT ) >= (1UL <<PTE_FILE_MAX_BITS )) +return err;
The reason I didn't do this in the first place is that if PTE_FILE_MAX_BITS is 32 (as it is for ia32 PAE), the compiler generates a warning about the (1<<32). I guess it generates a bug, too.
Ho hum. I shall make it "1ULL".
Quoted 5 lines
Quoted 2 lines
would you be so kind to take this and forward to Linus? I think this segment of the code is your brainchild.
y'know, as I was writing that code I thought "no architecture could be dumb enough to make
PTE_FILE_MAX_BITSvariable".
Two different PTE formats.
Quoted 10 lines
mm/fremap.c line 142
Quoted 4 lines
mm/fremap.c +4
-0+/* This needs to be evaluated at runtime on some platforms */ +if (PTE_FILE_MAX_BITS <BITS_PER_LONG ) +if (pgoff + (size >>PAGE_SHIFT ) >= (1UL <<PTE_FILE_MAX_BITS )) +return err;The reason I didn't do this in the first place is that if
PTE_FILE_MAX_BITSis 32 (as it is for ia32 PAE), the compiler generates a warning about the (1<<32). I guess it generates a bug, too.Ho hum. I shall make it "1ULL".
Wait, that would be a pessimization. Let me think about it.
I am thinking that perhaps I can arrange is so that the number bits on different sparcs would end the same.
-- Pete