diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-06 20:10:04 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-06 20:10:04 -0500 |
commit | f94181da7192f4ed8ccb1b633ea4ce56954df130 (patch) | |
tree | 2e28785f2df447573a11fbdd611dc19eb3fcb794 /kernel | |
parent | 932adbed6d99cc373fc3433d701b3a594fea872c (diff) | |
parent | fdbc0450df12cc9cb397f3497db4b0cad7c1a8ff (diff) |
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
rcu: fix rcutorture bug
rcu: eliminate synchronize_rcu_xxx macro
rcu: make treercu safe for suspend and resume
rcu: fix rcutree grace-period-latency bug on small systems
futex: catch certain assymetric (get|put)_futex_key calls
futex: make futex_(get|put)_key() calls symmetric
locking, percpu counters: introduce separate lock classes
swiotlb: clean up EXPORT_SYMBOL usage
swiotlb: remove unnecessary declaration
swiotlb: replace architecture-specific swiotlb.h with linux/swiotlb.h
swiotlb: add support for systems with highmem
swiotlb: store phys address in io_tlb_orig_addr array
swiotlb: add hwdev to swiotlb_phys_to_bus() / swiotlb_sg_to_bus()
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/futex.c | 72 | ||||
-rw-r--r-- | kernel/rcupdate.c | 11 | ||||
-rw-r--r-- | kernel/rcupreempt.c | 11 | ||||
-rw-r--r-- | kernel/rcutorture.c | 18 | ||||
-rw-r--r-- | kernel/rcutree.c | 13 |
5 files changed, 72 insertions, 53 deletions
diff --git a/kernel/futex.c b/kernel/futex.c index 7c6cbabe52b3..002aa189eb09 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -170,8 +170,11 @@ static void get_futex_key_refs(union futex_key *key) | |||
170 | */ | 170 | */ |
171 | static void drop_futex_key_refs(union futex_key *key) | 171 | static void drop_futex_key_refs(union futex_key *key) |
172 | { | 172 | { |
173 | if (!key->both.ptr) | 173 | if (!key->both.ptr) { |
174 | /* If we're here then we tried to put a key we failed to get */ | ||
175 | WARN_ON_ONCE(1); | ||
174 | return; | 176 | return; |
177 | } | ||
175 | 178 | ||
176 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { | 179 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { |
177 | case FUT_OFF_INODE: | 180 | case FUT_OFF_INODE: |
@@ -730,8 +733,8 @@ static int futex_wake(u32 __user *uaddr, int fshared, int nr_wake, u32 bitset) | |||
730 | } | 733 | } |
731 | 734 | ||
732 | spin_unlock(&hb->lock); | 735 | spin_unlock(&hb->lock); |
733 | out: | ||
734 | put_futex_key(fshared, &key); | 736 | put_futex_key(fshared, &key); |
737 | out: | ||
735 | return ret; | 738 | return ret; |
736 | } | 739 | } |
737 | 740 | ||
@@ -755,7 +758,7 @@ retryfull: | |||
755 | goto out; | 758 | goto out; |
756 | ret = get_futex_key(uaddr2, fshared, &key2); | 759 | ret = get_futex_key(uaddr2, fshared, &key2); |
757 | if (unlikely(ret != 0)) | 760 | if (unlikely(ret != 0)) |
758 | goto out; | 761 | goto out_put_key1; |
759 | 762 | ||
760 | hb1 = hash_futex(&key1); | 763 | hb1 = hash_futex(&key1); |
761 | hb2 = hash_futex(&key2); | 764 | hb2 = hash_futex(&key2); |
@@ -777,12 +780,12 @@ retry: | |||
777 | * but we might get them from range checking | 780 | * but we might get them from range checking |
778 | */ | 781 | */ |
779 | ret = op_ret; | 782 | ret = op_ret; |
780 | goto out; | 783 | goto out_put_keys; |
781 | #endif | 784 | #endif |
782 | 785 | ||
783 | if (unlikely(op_ret != -EFAULT)) { | 786 | if (unlikely(op_ret != -EFAULT)) { |
784 | ret = op_ret; | 787 | ret = op_ret; |
785 | goto out; | 788 | goto out_put_keys; |
786 | } | 789 | } |
787 | 790 | ||
788 | /* | 791 | /* |
@@ -796,7 +799,7 @@ retry: | |||
796 | ret = futex_handle_fault((unsigned long)uaddr2, | 799 | ret = futex_handle_fault((unsigned long)uaddr2, |
797 | attempt); | 800 | attempt); |
798 | if (ret) | 801 | if (ret) |
799 | goto out; | 802 | goto out_put_keys; |
800 | goto retry; | 803 | goto retry; |
801 | } | 804 | } |
802 | 805 | ||
@@ -834,10 +837,11 @@ retry: | |||
834 | spin_unlock(&hb1->lock); | 837 | spin_unlock(&hb1->lock); |
835 | if (hb1 != hb2) | 838 | if (hb1 != hb2) |
836 | spin_unlock(&hb2->lock); | 839 | spin_unlock(&hb2->lock); |
837 | out: | 840 | out_put_keys: |
838 | put_futex_key(fshared, &key2); | 841 | put_futex_key(fshared, &key2); |
842 | out_put_key1: | ||
839 | put_futex_key(fshared, &key1); | 843 | put_futex_key(fshared, &key1); |
840 | 844 | out: | |
841 | return ret; | 845 | return ret; |
842 | } | 846 | } |
843 | 847 | ||
@@ -854,13 +858,13 @@ static int futex_requeue(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, | |||
854 | struct futex_q *this, *next; | 858 | struct futex_q *this, *next; |
855 | int ret, drop_count = 0; | 859 | int ret, drop_count = 0; |
856 | 860 | ||
857 | retry: | 861 | retry: |
858 | ret = get_futex_key(uaddr1, fshared, &key1); | 862 | ret = get_futex_key(uaddr1, fshared, &key1); |
859 | if (unlikely(ret != 0)) | 863 | if (unlikely(ret != 0)) |
860 | goto out; | 864 | goto out; |
861 | ret = get_futex_key(uaddr2, fshared, &key2); | 865 | ret = get_futex_key(uaddr2, fshared, &key2); |
862 | if (unlikely(ret != 0)) | 866 | if (unlikely(ret != 0)) |
863 | goto out; | 867 | goto out_put_key1; |
864 | 868 | ||
865 | hb1 = hash_futex(&key1); | 869 | hb1 = hash_futex(&key1); |
866 | hb2 = hash_futex(&key2); | 870 | hb2 = hash_futex(&key2); |
@@ -882,7 +886,7 @@ static int futex_requeue(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, | |||
882 | if (!ret) | 886 | if (!ret) |
883 | goto retry; | 887 | goto retry; |
884 | 888 | ||
885 | return ret; | 889 | goto out_put_keys; |
886 | } | 890 | } |
887 | if (curval != *cmpval) { | 891 | if (curval != *cmpval) { |
888 | ret = -EAGAIN; | 892 | ret = -EAGAIN; |
@@ -927,9 +931,11 @@ out_unlock: | |||
927 | while (--drop_count >= 0) | 931 | while (--drop_count >= 0) |
928 | drop_futex_key_refs(&key1); | 932 | drop_futex_key_refs(&key1); |
929 | 933 | ||
930 | out: | 934 | out_put_keys: |
931 | put_futex_key(fshared, &key2); | 935 | put_futex_key(fshared, &key2); |
936 | out_put_key1: | ||
932 | put_futex_key(fshared, &key1); | 937 | put_futex_key(fshared, &key1); |
938 | out: | ||
933 | return ret; | 939 | return ret; |
934 | } | 940 | } |
935 | 941 | ||
@@ -990,7 +996,7 @@ static int unqueue_me(struct futex_q *q) | |||
990 | int ret = 0; | 996 | int ret = 0; |
991 | 997 | ||
992 | /* In the common case we don't take the spinlock, which is nice. */ | 998 | /* In the common case we don't take the spinlock, which is nice. */ |
993 | retry: | 999 | retry: |
994 | lock_ptr = q->lock_ptr; | 1000 | lock_ptr = q->lock_ptr; |
995 | barrier(); | 1001 | barrier(); |
996 | if (lock_ptr != NULL) { | 1002 | if (lock_ptr != NULL) { |
@@ -1172,11 +1178,11 @@ static int futex_wait(u32 __user *uaddr, int fshared, | |||
1172 | 1178 | ||
1173 | q.pi_state = NULL; | 1179 | q.pi_state = NULL; |
1174 | q.bitset = bitset; | 1180 | q.bitset = bitset; |
1175 | retry: | 1181 | retry: |
1176 | q.key = FUTEX_KEY_INIT; | 1182 | q.key = FUTEX_KEY_INIT; |
1177 | ret = get_futex_key(uaddr, fshared, &q.key); | 1183 | ret = get_futex_key(uaddr, fshared, &q.key); |
1178 | if (unlikely(ret != 0)) | 1184 | if (unlikely(ret != 0)) |
1179 | goto out_release_sem; | 1185 | goto out; |
1180 | 1186 | ||
1181 | hb = queue_lock(&q); | 1187 | hb = queue_lock(&q); |
1182 | 1188 | ||
@@ -1204,6 +1210,7 @@ static int futex_wait(u32 __user *uaddr, int fshared, | |||
1204 | 1210 | ||
1205 | if (unlikely(ret)) { | 1211 | if (unlikely(ret)) { |
1206 | queue_unlock(&q, hb); | 1212 | queue_unlock(&q, hb); |
1213 | put_futex_key(fshared, &q.key); | ||
1207 | 1214 | ||
1208 | ret = get_user(uval, uaddr); | 1215 | ret = get_user(uval, uaddr); |
1209 | 1216 | ||
@@ -1213,7 +1220,7 @@ static int futex_wait(u32 __user *uaddr, int fshared, | |||
1213 | } | 1220 | } |
1214 | ret = -EWOULDBLOCK; | 1221 | ret = -EWOULDBLOCK; |
1215 | if (uval != val) | 1222 | if (uval != val) |
1216 | goto out_unlock_release_sem; | 1223 | goto out_unlock_put_key; |
1217 | 1224 | ||
1218 | /* Only actually queue if *uaddr contained val. */ | 1225 | /* Only actually queue if *uaddr contained val. */ |
1219 | queue_me(&q, hb); | 1226 | queue_me(&q, hb); |
@@ -1305,11 +1312,11 @@ static int futex_wait(u32 __user *uaddr, int fshared, | |||
1305 | return -ERESTART_RESTARTBLOCK; | 1312 | return -ERESTART_RESTARTBLOCK; |
1306 | } | 1313 | } |
1307 | 1314 | ||
1308 | out_unlock_release_sem: | 1315 | out_unlock_put_key: |
1309 | queue_unlock(&q, hb); | 1316 | queue_unlock(&q, hb); |
1310 | |||
1311 | out_release_sem: | ||
1312 | put_futex_key(fshared, &q.key); | 1317 | put_futex_key(fshared, &q.key); |
1318 | |||
1319 | out: | ||
1313 | return ret; | 1320 | return ret; |
1314 | } | 1321 | } |
1315 | 1322 | ||
@@ -1358,16 +1365,16 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared, | |||
1358 | } | 1365 | } |
1359 | 1366 | ||
1360 | q.pi_state = NULL; | 1367 | q.pi_state = NULL; |
1361 | retry: | 1368 | retry: |
1362 | q.key = FUTEX_KEY_INIT; | 1369 | q.key = FUTEX_KEY_INIT; |
1363 | ret = get_futex_key(uaddr, fshared, &q.key); | 1370 | ret = get_futex_key(uaddr, fshared, &q.key); |
1364 | if (unlikely(ret != 0)) | 1371 | if (unlikely(ret != 0)) |
1365 | goto out_release_sem; | 1372 | goto out; |
1366 | 1373 | ||
1367 | retry_unlocked: | 1374 | retry_unlocked: |
1368 | hb = queue_lock(&q); | 1375 | hb = queue_lock(&q); |
1369 | 1376 | ||
1370 | retry_locked: | 1377 | retry_locked: |
1371 | ret = lock_taken = 0; | 1378 | ret = lock_taken = 0; |
1372 | 1379 | ||
1373 | /* | 1380 | /* |
@@ -1388,14 +1395,14 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared, | |||
1388 | */ | 1395 | */ |
1389 | if (unlikely((curval & FUTEX_TID_MASK) == task_pid_vnr(current))) { | 1396 | if (unlikely((curval & FUTEX_TID_MASK) == task_pid_vnr(current))) { |
1390 | ret = -EDEADLK; | 1397 | ret = -EDEADLK; |
1391 | goto out_unlock_release_sem; | 1398 | goto out_unlock_put_key; |
1392 | } | 1399 | } |
1393 | 1400 | ||
1394 | /* | 1401 | /* |
1395 | * Surprise - we got the lock. Just return to userspace: | 1402 | * Surprise - we got the lock. Just return to userspace: |
1396 | */ | 1403 | */ |
1397 | if (unlikely(!curval)) | 1404 | if (unlikely(!curval)) |
1398 | goto out_unlock_release_sem; | 1405 | goto out_unlock_put_key; |
1399 | 1406 | ||
1400 | uval = curval; | 1407 | uval = curval; |
1401 | 1408 | ||
@@ -1431,7 +1438,7 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared, | |||
1431 | * We took the lock due to owner died take over. | 1438 | * We took the lock due to owner died take over. |
1432 | */ | 1439 | */ |
1433 | if (unlikely(lock_taken)) | 1440 | if (unlikely(lock_taken)) |
1434 | goto out_unlock_release_sem; | 1441 | goto out_unlock_put_key; |
1435 | 1442 | ||
1436 | /* | 1443 | /* |
1437 | * We dont have the lock. Look up the PI state (or create it if | 1444 | * We dont have the lock. Look up the PI state (or create it if |
@@ -1470,7 +1477,7 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared, | |||
1470 | goto retry_locked; | 1477 | goto retry_locked; |
1471 | } | 1478 | } |
1472 | default: | 1479 | default: |
1473 | goto out_unlock_release_sem; | 1480 | goto out_unlock_put_key; |
1474 | } | 1481 | } |
1475 | } | 1482 | } |
1476 | 1483 | ||
@@ -1561,16 +1568,17 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared, | |||
1561 | destroy_hrtimer_on_stack(&to->timer); | 1568 | destroy_hrtimer_on_stack(&to->timer); |
1562 | return ret != -EINTR ? ret : -ERESTARTNOINTR; | 1569 | return ret != -EINTR ? ret : -ERESTARTNOINTR; |
1563 | 1570 | ||
1564 | out_unlock_release_sem: | 1571 | out_unlock_put_key: |
1565 | queue_unlock(&q, hb); | 1572 | queue_unlock(&q, hb); |
1566 | 1573 | ||
1567 | out_release_sem: | 1574 | out_put_key: |
1568 | put_futex_key(fshared, &q.key); | 1575 | put_futex_key(fshared, &q.key); |
1576 | out: | ||
1569 | if (to) | 1577 | if (to) |
1570 | destroy_hrtimer_on_stack(&to->timer); | 1578 | destroy_hrtimer_on_stack(&to->timer); |
1571 | return ret; | 1579 | return ret; |
1572 | 1580 | ||
1573 | uaddr_faulted: | 1581 | uaddr_faulted: |
1574 | /* | 1582 | /* |
1575 | * We have to r/w *(int __user *)uaddr, and we have to modify it | 1583 | * We have to r/w *(int __user *)uaddr, and we have to modify it |
1576 | * atomically. Therefore, if we continue to fault after get_user() | 1584 | * atomically. Therefore, if we continue to fault after get_user() |
@@ -1583,7 +1591,7 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared, | |||
1583 | if (attempt++) { | 1591 | if (attempt++) { |
1584 | ret = futex_handle_fault((unsigned long)uaddr, attempt); | 1592 | ret = futex_handle_fault((unsigned long)uaddr, attempt); |
1585 | if (ret) | 1593 | if (ret) |
1586 | goto out_release_sem; | 1594 | goto out_put_key; |
1587 | goto retry_unlocked; | 1595 | goto retry_unlocked; |
1588 | } | 1596 | } |
1589 | 1597 | ||
@@ -1675,9 +1683,9 @@ retry_unlocked: | |||
1675 | 1683 | ||
1676 | out_unlock: | 1684 | out_unlock: |
1677 | spin_unlock(&hb->lock); | 1685 | spin_unlock(&hb->lock); |
1678 | out: | ||
1679 | put_futex_key(fshared, &key); | 1686 | put_futex_key(fshared, &key); |
1680 | 1687 | ||
1688 | out: | ||
1681 | return ret; | 1689 | return ret; |
1682 | 1690 | ||
1683 | pi_faulted: | 1691 | pi_faulted: |
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index ad63af8b2521..d92a76a881aa 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
@@ -77,8 +77,15 @@ void wakeme_after_rcu(struct rcu_head *head) | |||
77 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), | 77 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), |
78 | * and may be nested. | 78 | * and may be nested. |
79 | */ | 79 | */ |
80 | void synchronize_rcu(void); /* Makes kernel-doc tools happy */ | 80 | void synchronize_rcu(void) |
81 | synchronize_rcu_xxx(synchronize_rcu, call_rcu) | 81 | { |
82 | struct rcu_synchronize rcu; | ||
83 | init_completion(&rcu.completion); | ||
84 | /* Will wake me after RCU finished. */ | ||
85 | call_rcu(&rcu.head, wakeme_after_rcu); | ||
86 | /* Wait for it. */ | ||
87 | wait_for_completion(&rcu.completion); | ||
88 | } | ||
82 | EXPORT_SYMBOL_GPL(synchronize_rcu); | 89 | EXPORT_SYMBOL_GPL(synchronize_rcu); |
83 | 90 | ||
84 | static void rcu_barrier_callback(struct rcu_head *notused) | 91 | static void rcu_barrier_callback(struct rcu_head *notused) |
diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c index f9dc8f3720f6..33cfc50781f9 100644 --- a/kernel/rcupreempt.c +++ b/kernel/rcupreempt.c | |||
@@ -1177,7 +1177,16 @@ EXPORT_SYMBOL_GPL(call_rcu_sched); | |||
1177 | * in -rt this does -not- necessarily result in all currently executing | 1177 | * in -rt this does -not- necessarily result in all currently executing |
1178 | * interrupt -handlers- having completed. | 1178 | * interrupt -handlers- having completed. |
1179 | */ | 1179 | */ |
1180 | synchronize_rcu_xxx(__synchronize_sched, call_rcu_sched) | 1180 | void __synchronize_sched(void) |
1181 | { | ||
1182 | struct rcu_synchronize rcu; | ||
1183 | |||
1184 | init_completion(&rcu.completion); | ||
1185 | /* Will wake me after RCU finished. */ | ||
1186 | call_rcu_sched(&rcu.head, wakeme_after_rcu); | ||
1187 | /* Wait for it. */ | ||
1188 | wait_for_completion(&rcu.completion); | ||
1189 | } | ||
1181 | EXPORT_SYMBOL_GPL(__synchronize_sched); | 1190 | EXPORT_SYMBOL_GPL(__synchronize_sched); |
1182 | 1191 | ||
1183 | /* | 1192 | /* |
diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 3245b40952c6..1cff28db56b6 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c | |||
@@ -136,7 +136,7 @@ static int stutter_pause_test = 0; | |||
136 | #endif | 136 | #endif |
137 | int rcutorture_runnable = RCUTORTURE_RUNNABLE_INIT; | 137 | int rcutorture_runnable = RCUTORTURE_RUNNABLE_INIT; |
138 | 138 | ||
139 | #define FULLSTOP_SIGNALED 1 /* Bail due to signal. */ | 139 | #define FULLSTOP_SHUTDOWN 1 /* Bail due to system shutdown/panic. */ |
140 | #define FULLSTOP_CLEANUP 2 /* Orderly shutdown. */ | 140 | #define FULLSTOP_CLEANUP 2 /* Orderly shutdown. */ |
141 | static int fullstop; /* stop generating callbacks at test end. */ | 141 | static int fullstop; /* stop generating callbacks at test end. */ |
142 | DEFINE_MUTEX(fullstop_mutex); /* protect fullstop transitions and */ | 142 | DEFINE_MUTEX(fullstop_mutex); /* protect fullstop transitions and */ |
@@ -151,12 +151,10 @@ rcutorture_shutdown_notify(struct notifier_block *unused1, | |||
151 | { | 151 | { |
152 | if (fullstop) | 152 | if (fullstop) |
153 | return NOTIFY_DONE; | 153 | return NOTIFY_DONE; |
154 | if (signal_pending(current)) { | 154 | mutex_lock(&fullstop_mutex); |
155 | mutex_lock(&fullstop_mutex); | 155 | if (!fullstop) |
156 | if (!ACCESS_ONCE(fullstop)) | 156 | fullstop = FULLSTOP_SHUTDOWN; |
157 | fullstop = FULLSTOP_SIGNALED; | 157 | mutex_unlock(&fullstop_mutex); |
158 | mutex_unlock(&fullstop_mutex); | ||
159 | } | ||
160 | return NOTIFY_DONE; | 158 | return NOTIFY_DONE; |
161 | } | 159 | } |
162 | 160 | ||
@@ -624,7 +622,7 @@ rcu_torture_writer(void *arg) | |||
624 | rcu_stutter_wait(); | 622 | rcu_stutter_wait(); |
625 | } while (!kthread_should_stop() && !fullstop); | 623 | } while (!kthread_should_stop() && !fullstop); |
626 | VERBOSE_PRINTK_STRING("rcu_torture_writer task stopping"); | 624 | VERBOSE_PRINTK_STRING("rcu_torture_writer task stopping"); |
627 | while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED) | 625 | while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN) |
628 | schedule_timeout_uninterruptible(1); | 626 | schedule_timeout_uninterruptible(1); |
629 | return 0; | 627 | return 0; |
630 | } | 628 | } |
@@ -649,7 +647,7 @@ rcu_torture_fakewriter(void *arg) | |||
649 | } while (!kthread_should_stop() && !fullstop); | 647 | } while (!kthread_should_stop() && !fullstop); |
650 | 648 | ||
651 | VERBOSE_PRINTK_STRING("rcu_torture_fakewriter task stopping"); | 649 | VERBOSE_PRINTK_STRING("rcu_torture_fakewriter task stopping"); |
652 | while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED) | 650 | while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN) |
653 | schedule_timeout_uninterruptible(1); | 651 | schedule_timeout_uninterruptible(1); |
654 | return 0; | 652 | return 0; |
655 | } | 653 | } |
@@ -759,7 +757,7 @@ rcu_torture_reader(void *arg) | |||
759 | VERBOSE_PRINTK_STRING("rcu_torture_reader task stopping"); | 757 | VERBOSE_PRINTK_STRING("rcu_torture_reader task stopping"); |
760 | if (irqreader && cur_ops->irqcapable) | 758 | if (irqreader && cur_ops->irqcapable) |
761 | del_timer_sync(&t); | 759 | del_timer_sync(&t); |
762 | while (!kthread_should_stop() && fullstop != FULLSTOP_SIGNALED) | 760 | while (!kthread_should_stop() && fullstop != FULLSTOP_SHUTDOWN) |
763 | schedule_timeout_uninterruptible(1); | 761 | schedule_timeout_uninterruptible(1); |
764 | return 0; | 762 | return 0; |
765 | } | 763 | } |
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index a342b032112c..f2d8638e6c60 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -79,7 +79,10 @@ struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh_state); | |||
79 | DEFINE_PER_CPU(struct rcu_data, rcu_bh_data); | 79 | DEFINE_PER_CPU(struct rcu_data, rcu_bh_data); |
80 | 80 | ||
81 | #ifdef CONFIG_NO_HZ | 81 | #ifdef CONFIG_NO_HZ |
82 | DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks); | 82 | DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = { |
83 | .dynticks_nesting = 1, | ||
84 | .dynticks = 1, | ||
85 | }; | ||
83 | #endif /* #ifdef CONFIG_NO_HZ */ | 86 | #endif /* #ifdef CONFIG_NO_HZ */ |
84 | 87 | ||
85 | static int blimit = 10; /* Maximum callbacks per softirq. */ | 88 | static int blimit = 10; /* Maximum callbacks per softirq. */ |
@@ -572,6 +575,7 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
572 | /* Special-case the common single-level case. */ | 575 | /* Special-case the common single-level case. */ |
573 | if (NUM_RCU_NODES == 1) { | 576 | if (NUM_RCU_NODES == 1) { |
574 | rnp->qsmask = rnp->qsmaskinit; | 577 | rnp->qsmask = rnp->qsmaskinit; |
578 | rsp->signaled = RCU_SIGNAL_INIT; /* force_quiescent_state OK. */ | ||
575 | spin_unlock_irqrestore(&rnp->lock, flags); | 579 | spin_unlock_irqrestore(&rnp->lock, flags); |
576 | return; | 580 | return; |
577 | } | 581 | } |
@@ -1379,13 +1383,6 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp) | |||
1379 | 1383 | ||
1380 | static void __cpuinit rcu_online_cpu(int cpu) | 1384 | static void __cpuinit rcu_online_cpu(int cpu) |
1381 | { | 1385 | { |
1382 | #ifdef CONFIG_NO_HZ | ||
1383 | struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); | ||
1384 | |||
1385 | rdtp->dynticks_nesting = 1; | ||
1386 | rdtp->dynticks |= 1; /* need consecutive #s even for hotplug. */ | ||
1387 | rdtp->dynticks_nmi = (rdtp->dynticks_nmi + 1) & ~0x1; | ||
1388 | #endif /* #ifdef CONFIG_NO_HZ */ | ||
1389 | rcu_init_percpu_data(cpu, &rcu_state); | 1386 | rcu_init_percpu_data(cpu, &rcu_state); |
1390 | rcu_init_percpu_data(cpu, &rcu_bh_state); | 1387 | rcu_init_percpu_data(cpu, &rcu_bh_state); |
1391 | open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); | 1388 | open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); |