diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-03-19 16:27:33 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-03-19 16:27:33 -0400 |
commit | 24d559cac4d741d60ec85e927974408020a2f060 (patch) | |
tree | e01419724e2da6c817d525756e92d584d41c03eb | |
parent | 5851fadce8824d5d4b8fd02c22ae098401f6489e (diff) |
[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>
-rw-r--r-- | arch/sparc64/kernel/tsb.S | 1 | ||||
-rw-r--r-- | arch/sparc64/lib/NGbzero.S | 1 | ||||
-rw-r--r-- | arch/sparc64/lib/NGmemcpy.S | 2 | ||||
-rw-r--r-- | arch/sparc64/lib/NGpage.S | 2 |
4 files changed, 6 insertions, 0 deletions
diff --git a/arch/sparc64/kernel/tsb.S b/arch/sparc64/kernel/tsb.S index eedf94fa5664..10adb2fb8ffe 100644 --- a/arch/sparc64/kernel/tsb.S +++ b/arch/sparc64/kernel/tsb.S | |||
@@ -546,6 +546,7 @@ NGtsb_init: | |||
546 | subcc %o1, 0x100, %o1 | 546 | subcc %o1, 0x100, %o1 |
547 | bne,pt %xcc, 1b | 547 | bne,pt %xcc, 1b |
548 | add %o0, 0x100, %o0 | 548 | add %o0, 0x100, %o0 |
549 | membar #Sync | ||
549 | retl | 550 | retl |
550 | wr %g2, 0x0, %asi | 551 | wr %g2, 0x0, %asi |
551 | .size NGtsb_init, .-NGtsb_init | 552 | .size NGtsb_init, .-NGtsb_init |
diff --git a/arch/sparc64/lib/NGbzero.S b/arch/sparc64/lib/NGbzero.S index e86baece5cc8..f10e4529ee37 100644 --- a/arch/sparc64/lib/NGbzero.S +++ b/arch/sparc64/lib/NGbzero.S | |||
@@ -88,6 +88,7 @@ NGbzero_loop: | |||
88 | bne,pt %xcc, NGbzero_loop | 88 | bne,pt %xcc, NGbzero_loop |
89 | add %o0, 64, %o0 | 89 | add %o0, 64, %o0 |
90 | 90 | ||
91 | membar #Sync | ||
91 | wr %o4, 0x0, %asi | 92 | wr %o4, 0x0, %asi |
92 | brz,pn %o1, NGbzero_done | 93 | brz,pn %o1, NGbzero_done |
93 | NGbzero_medium: | 94 | NGbzero_medium: |
diff --git a/arch/sparc64/lib/NGmemcpy.S b/arch/sparc64/lib/NGmemcpy.S index 8e522b3dc095..66063a9a66b8 100644 --- a/arch/sparc64/lib/NGmemcpy.S +++ b/arch/sparc64/lib/NGmemcpy.S | |||
@@ -247,6 +247,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
247 | /* fall through */ | 247 | /* fall through */ |
248 | 248 | ||
249 | 60: | 249 | 60: |
250 | membar #Sync | ||
251 | |||
250 | /* %o2 contains any final bytes still needed to be copied | 252 | /* %o2 contains any final bytes still needed to be copied |
251 | * over. If anything is left, we copy it one byte at a time. | 253 | * over. If anything is left, we copy it one byte at a time. |
252 | */ | 254 | */ |
diff --git a/arch/sparc64/lib/NGpage.S b/arch/sparc64/lib/NGpage.S index 7d7c3bb8dcbf..8ce3a0c9c537 100644 --- a/arch/sparc64/lib/NGpage.S +++ b/arch/sparc64/lib/NGpage.S | |||
@@ -41,6 +41,7 @@ NGcopy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ | |||
41 | subcc %g7, 64, %g7 | 41 | subcc %g7, 64, %g7 |
42 | bne,pt %xcc, 1b | 42 | bne,pt %xcc, 1b |
43 | add %o0, 32, %o0 | 43 | add %o0, 32, %o0 |
44 | membar #Sync | ||
44 | retl | 45 | retl |
45 | nop | 46 | nop |
46 | 47 | ||
@@ -63,6 +64,7 @@ NGclear_user_page: /* %o0=dest, %o1=vaddr */ | |||
63 | subcc %g7, 64, %g7 | 64 | subcc %g7, 64, %g7 |
64 | bne,pt %xcc, 1b | 65 | bne,pt %xcc, 1b |
65 | add %o0, 32, %o0 | 66 | add %o0, 32, %o0 |
67 | membar #Sync | ||
66 | retl | 68 | retl |
67 | nop | 69 | nop |
68 | 70 | ||