Fix niagara memory corruption
[SPARC64]: store-init needs trailing membar. The manual says that it is required and we actually have crash reports where loads see stale data due to not having membars here. In one case the networking does: memset(skb, 0, offsetof(struct sk_buff, truesize)); and then some code later checks skb->nohdr for zero, but it's still the value that was there before the memset(). Note that arch/sparc64/lib/xor.S already got this right. Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
ad23c76c32
commit
9c06278212
@@ -546,6 +546,7 @@ NGtsb_init:
|
||||
subcc %o1, 0x100, %o1
|
||||
bne,pt %xcc, 1b
|
||||
add %o0, 0x100, %o0
|
||||
membar #Sync
|
||||
retl
|
||||
wr %g2, 0x0, %asi
|
||||
.size NGtsb_init, .-NGtsb_init
|
||||
|
||||
@@ -88,6 +88,7 @@ NGbzero_loop:
|
||||
bne,pt %xcc, NGbzero_loop
|
||||
add %o0, 64, %o0
|
||||
|
||||
membar #Sync
|
||||
wr %o4, 0x0, %asi
|
||||
brz,pn %o1, NGbzero_done
|
||||
NGbzero_medium:
|
||||
|
||||
@@ -247,6 +247,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||
/* fall through */
|
||||
|
||||
60:
|
||||
membar #Sync
|
||||
|
||||
/* %o2 contains any final bytes still needed to be copied
|
||||
* over. If anything is left, we copy it one byte at a time.
|
||||
*/
|
||||
|
||||
@@ -41,6 +41,7 @@ NGcopy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
|
||||
subcc %g7, 64, %g7
|
||||
bne,pt %xcc, 1b
|
||||
add %o0, 32, %o0
|
||||
membar #Sync
|
||||
retl
|
||||
nop
|
||||
|
||||
@@ -63,6 +64,7 @@ NGclear_user_page: /* %o0=dest, %o1=vaddr */
|
||||
subcc %g7, 64, %g7
|
||||
bne,pt %xcc, 1b
|
||||
add %o0, 32, %o0
|
||||
membar #Sync
|
||||
retl
|
||||
nop
|
||||
|
||||
|
||||
Reference in New Issue
Block a user