| .. | .. |
|---|
| 288 | 288 | |
|---|
| 289 | 289 | add_wait_queue(sk_sleep(sk), &wait); |
|---|
| 290 | 290 | while (1) { |
|---|
| 291 | | - /* Ensure session->terminate is updated */ |
|---|
| 292 | | - smp_mb__before_atomic(); |
|---|
| 293 | | - |
|---|
| 294 | 291 | if (atomic_read(&session->terminate)) |
|---|
| 295 | 292 | break; |
|---|
| 296 | 293 | if (sk->sk_state != BT_CONNECTED) |
|---|
| .. | .. |
|---|
| 306 | 303 | |
|---|
| 307 | 304 | cmtp_process_transmit(session); |
|---|
| 308 | 305 | |
|---|
| 306 | + /* |
|---|
| 307 | + * wait_woken() performs the necessary memory barriers |
|---|
| 308 | + * for us; see the header comment for this primitive. |
|---|
| 309 | + */ |
|---|
| 309 | 310 | wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); |
|---|
| 310 | 311 | } |
|---|
| 311 | 312 | remove_wait_queue(sk_sleep(sk), &wait); |
|---|
| .. | .. |
|---|
| 436 | 437 | /* Stop session thread */ |
|---|
| 437 | 438 | atomic_inc(&session->terminate); |
|---|
| 438 | 439 | |
|---|
| 439 | | - /* Ensure session->terminate is updated */ |
|---|
| 440 | | - smp_mb__after_atomic(); |
|---|
| 441 | | - |
|---|
| 440 | + /* |
|---|
| 441 | + * See the comment preceding the call to wait_woken() |
|---|
| 442 | + * in cmtp_session(). |
|---|
| 443 | + */ |
|---|
| 442 | 444 | wake_up_interruptible(sk_sleep(session->sock->sk)); |
|---|
| 443 | 445 | } else |
|---|
| 444 | 446 | err = -ENOENT; |
|---|