diff options
Diffstat (limited to 'kernel/marker.c')
| -rw-r--r-- | kernel/marker.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/marker.c b/kernel/marker.c index 971da5317903..7d1faecd7a51 100644 --- a/kernel/marker.c +++ b/kernel/marker.c | |||
| @@ -126,6 +126,11 @@ void marker_probe_cb(const struct marker *mdata, void *call_private, ...) | |||
| 126 | struct marker_probe_closure *multi; | 126 | struct marker_probe_closure *multi; |
| 127 | int i; | 127 | int i; |
| 128 | /* | 128 | /* |
| 129 | * Read mdata->ptype before mdata->multi. | ||
| 130 | */ | ||
| 131 | smp_rmb(); | ||
| 132 | multi = mdata->multi; | ||
| 133 | /* | ||
| 129 | * multi points to an array, therefore accessing the array | 134 | * multi points to an array, therefore accessing the array |
| 130 | * depends on reading multi. However, even in this case, | 135 | * depends on reading multi. However, even in this case, |
| 131 | * we must insure that the pointer is read _before_ the array | 136 | * we must insure that the pointer is read _before_ the array |
| @@ -133,7 +138,6 @@ void marker_probe_cb(const struct marker *mdata, void *call_private, ...) | |||
| 133 | * in the fast path, so put the explicit barrier here. | 138 | * in the fast path, so put the explicit barrier here. |
| 134 | */ | 139 | */ |
| 135 | smp_read_barrier_depends(); | 140 | smp_read_barrier_depends(); |
| 136 | multi = mdata->multi; | ||
| 137 | for (i = 0; multi[i].func; i++) { | 141 | for (i = 0; multi[i].func; i++) { |
| 138 | va_start(args, call_private); | 142 | va_start(args, call_private); |
| 139 | multi[i].func(multi[i].probe_private, call_private, | 143 | multi[i].func(multi[i].probe_private, call_private, |
| @@ -175,6 +179,11 @@ void marker_probe_cb_noarg(const struct marker *mdata, void *call_private, ...) | |||
| 175 | struct marker_probe_closure *multi; | 179 | struct marker_probe_closure *multi; |
| 176 | int i; | 180 | int i; |
| 177 | /* | 181 | /* |
| 182 | * Read mdata->ptype before mdata->multi. | ||
| 183 | */ | ||
| 184 | smp_rmb(); | ||
| 185 | multi = mdata->multi; | ||
| 186 | /* | ||
| 178 | * multi points to an array, therefore accessing the array | 187 | * multi points to an array, therefore accessing the array |
| 179 | * depends on reading multi. However, even in this case, | 188 | * depends on reading multi. However, even in this case, |
| 180 | * we must insure that the pointer is read _before_ the array | 189 | * we must insure that the pointer is read _before_ the array |
| @@ -182,7 +191,6 @@ void marker_probe_cb_noarg(const struct marker *mdata, void *call_private, ...) | |||
| 182 | * in the fast path, so put the explicit barrier here. | 191 | * in the fast path, so put the explicit barrier here. |
| 183 | */ | 192 | */ |
| 184 | smp_read_barrier_depends(); | 193 | smp_read_barrier_depends(); |
| 185 | multi = mdata->multi; | ||
| 186 | for (i = 0; multi[i].func; i++) | 194 | for (i = 0; multi[i].func; i++) |
| 187 | multi[i].func(multi[i].probe_private, call_private, | 195 | multi[i].func(multi[i].probe_private, call_private, |
| 188 | mdata->format, &args); | 196 | mdata->format, &args); |
