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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to