Hi all,
I have tested a solution to the random invalid instruction occourances on
sparc32 (sun4c). I have attached the patch as my mail client messes up
patch files.
The problem apears to be an alignment error of the redzone2 word, caused
by the userword not being forced onto a 64bit boundary. My solution is to
increase the size of the user word (BYTES_PER_WORD) to 64bits in order to
force the correct alignment of the user word (and hence the redzone2
word). My solution also works on platforms where sizeof(unsigned long
long) is 128bits and requires 128bit alignment.
Regards
Mark Fortescue.
On Tue, 3 Jul 2007, Mark Fortescue wrote:
Hi all,
I think I have found the cause of the problem.
Commit b46b8f19c9cd435ecac4d9d12b39d78c137ecd66 partially fixed alignment
issues but does not ensure that all 64bit alignment requirements of sparc32
are met. Tests have shown that the redzone2 word can become misallignd.
I am currently working on a posible fix.
Regards
Mark Fortescue.
On Tue, 3 Jul 2007, Michal Piotrowski wrote:
Hi all,
Here is a list of some known regressions in 2.6.22-rc7.
Feel free to add new regressions/remove fixed etc.
http://kernelnewbies.org/known_regressions
List of Aces
Name Regressions fixed since 21-Jun-2007
Hugh Dickins 2
Andi Kleen 1
Andrew Morton 1
Benjamin Herrenschmidt 1
Bj�rn Steinbrink 1
Bjorn Helgaas 1
Jean Delvare 1
Olaf Hering 1
Siddha, Suresh B 1
Trent Piepho 1
Ville Syrj�l� 1
FS
Subject : 2.6.22-rc4-git5 reiserfs: null ptr deref.
References : http://lkml.org/lkml/2007/6/13/322
Submitter : Randy Dunlap <[email protected]>
Handled-By : Vladimir V. Saveliev <[email protected]>
Status : problem is being debugged
IDE
Subject : 2.6.22-rcX: hda: lost interrupt
References : http://lkml.org/lkml/2007/6/29/121
Submitter : David Chinner <[email protected]>
Status : unknown
Sparc64
Subject : random invalid instruction occourances on sparc32 (sun4c)
References : http://lkml.org/lkml/2007/6/17/111
Submitter : Mark Fortescue <[email protected]>
Status : problem is being debugged
Subject : 2.6.22-rc broke X on Ultra5
References : http://lkml.org/lkml/2007/5/22/78
Submitter : Mikael Pettersson <[email protected]>
Handled-By : David Miller <[email protected]>
Status : problem is being debugged
Regards,
Michal
--
LOG
http://www.stardust.webpages.pl/log/
-
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Mark Fortescue <[email protected]>
Verious alignment fixes in the SLAB alocator that increased the size
of the RedZone words failed to ensure that RedZone word 2 is aligned
on a 64bit boundary. This has resulted in random invalid instruction
occourances on Sparc32 (sun4c).
By increasing the size of the User Word (BYTES_PER_WORD) to 64bits
seams to ensure that correct alignment is maintained but assumes that:
sizeof (void *) <= sizeof (unsigned dlong long)
Signed-off-by: Mark Fortescue <[email protected]>
---
Alternative solutions would involve correcting the size caculations on
lines 2175 to 2275 and may also involve additional changes to the
calculations to get a pointer to the RedZone Word 2.
--- linux-2.6/mm/slab.c 2007-07-03 17:35:07.000000000 +0100
+++ linux-test/mm/slab.c 2007-07-03 19:05:19.000000000 +0100
@@ -136,7 +136,8 @@
#endif
/* Shouldn't this be in a header file somewhere? */
-#define BYTES_PER_WORD sizeof(void *)
+/* Fix alignment of redzone2. Assumes sizeof (void*) <= sizeof (unsigned long long) */
+#define BYTES_PER_WORD sizeof(unsigned long long)
#ifndef cache_line_size
#define cache_line_size() L1_CACHE_BYTES
@@ -538,7 +539,7 @@ static unsigned long long *dbg_redzone1(
{
BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
return (unsigned long long*) (objp + obj_offset(cachep) -
- sizeof(unsigned long long));
+ BYTES_PER_WORD);
}
static unsigned long long *dbg_redzone2(struct kmem_cache *cachep, void *objp)
@@ -546,10 +547,9 @@ static unsigned long long *dbg_redzone2(
BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
if (cachep->flags & SLAB_STORE_USER)
return (unsigned long long *)(objp + cachep->buffer_size -
- sizeof(unsigned long long) -
- BYTES_PER_WORD);
+ 2 * BYTES_PER_WORD);
return (unsigned long long *) (objp + cachep->buffer_size -
- sizeof(unsigned long long));
+ BYTES_PER_WORD);
}
static void **dbg_userword(struct kmem_cache *cachep, void *objp)
@@ -2256,8 +2256,8 @@ kmem_cache_create (const char *name, siz
*/
if (flags & SLAB_RED_ZONE) {
/* add space for red zone words */
- cachep->obj_offset += sizeof(unsigned long long);
- size += 2 * sizeof(unsigned long long);
+ cachep->obj_offset += BYTES_PER_WORD;
+ size += 2 * BYTES_PER_WORD;
}
if (flags & SLAB_STORE_USER) {
/* user store requires one word storage behind the end of
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]