Skip to contentSkip to conversation

Variable PTE_FILE_MAX_BITS

PATCH Pete Zaitcev 2 participants 3 messages Apr 9, 2003 Memory management

lore
Share & tools
lore
#0 lore raw

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);
 
#1 lore raw
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".

#2 lore raw
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_BITS variable".

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_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".

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