svn commit: r285751 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Tue Jul 21 14:39:35 UTC 2015
Author: kib
Date: Tue Jul 21 14:39:34 2015
New Revision: 285751
URL: https://svnweb.freebsd.org/changeset/base/285751
Log:
The part of r285680 which removed release semantic for two stores to
it_need was wrong [*]. Restore the releases and add a comment
explaining why it is needed.
Noted by: alc [*]
Reviewed by: bde [*]
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/kern/kern_intr.c
Modified: head/sys/kern/kern_intr.c
==============================================================================
--- head/sys/kern/kern_intr.c Tue Jul 21 14:36:33 2015 (r285750)
+++ head/sys/kern/kern_intr.c Tue Jul 21 14:39:34 2015 (r285751)
@@ -829,8 +829,14 @@ ok:
* Ensure that the thread will process the handler list
* again and remove this handler if it has already passed
* it on the list.
+ *
+ * The release part of the following store ensures
+ * that the update of ih_flags is ordered before the
+ * it_need setting. See the comment before
+ * atomic_cmpset_acq(&ithd->it_need, ...) operation in
+ * the ithread_execute_handlers().
*/
- ie->ie_thread->it_need = 1;
+ atomic_store_rel_int(&ie->ie_thread->it_need, 1);
} else
TAILQ_REMOVE(&ie->ie_handlers, handler, ih_next);
thread_unlock(ie->ie_thread->it_thread);
@@ -979,8 +985,14 @@ ok:
* Ensure that the thread will process the handler list
* again and remove this handler if it has already passed
* it on the list.
+ *
+ * The release part of the following store ensures
+ * that the update of ih_flags is ordered before the
+ * it_need setting. See the comment before
+ * atomic_cmpset_acq(&ithd->it_need, ...) operation in
+ * the ithread_execute_handlers().
*/
- it->it_need = 1;
+ atomic_store_rel_int(&it->it_need, 1);
} else
TAILQ_REMOVE(&ie->ie_handlers, handler, ih_next);
thread_unlock(it->it_thread);
More information about the svn-src-head
mailing list