lkml.org 
[lkml]   [2007]   [Jul]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] Re: Sparc32: random invalid instruction occourances on sparc32 (sun4c)
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 <randy.dunlap@oracle.com>
>> Handled-By : Vladimir V. Saveliev <vs@namesys.com>
>> 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 <dgc@sgi.com>
>> Status : unknown
>>
>>
>>
>> Sparc64
>>
>> Subject : random invalid instruction occourances on sparc32 (sun4c)
>> References : http://lkml.org/lkml/2007/6/17/111
>> Submitter : Mark Fortescue <mark@mtfhpc.demon.co.uk>
>> 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 <mikpe@it.uu.se>
>> Handled-By : David Miller <davem@davemloft.net>
>> 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 majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>From: Mark Fortescue <mark@mtfhpc.demon.co.uk>

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 <mark@mtfhpc.demon.co.uk>
---
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
\
 
 \ /
  Last update: 2007-07-03 21:05    [W:0.194 / U:7.468 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site