Author: hselasky
Date: Wed May 31 10:01:15 2017
New Revision: 319312
URL: https://svnweb.freebsd.org/changeset/base/319312

Log:
  Make sure the thread's priority is restored for all three cases inside
  linux_synchronize_rcu_cb() in the LinuxKPI.
  
  MFC after:            1 week
  Sponsored by:         Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/src/linux_rcu.c

Modified: head/sys/compat/linuxkpi/common/src/linux_rcu.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_rcu.c     Wed May 31 09:25:47 
2017        (r319311)
+++ head/sys/compat/linuxkpi/common/src/linux_rcu.c     Wed May 31 10:01:15 
2017        (r319312)
@@ -236,7 +236,6 @@ linux_synchronize_rcu_cb(ck_epoch_t *epoch __unused, c
        if (record->cpuid == PCPU_GET(cpuid)) {
                bool is_sleeping = 0;
                u_char prio = 0;
-               u_char old_prio;
 
                /*
                 * Find the lowest priority or sleeping thread which
@@ -255,13 +254,10 @@ linux_synchronize_rcu_cb(ck_epoch_t *epoch __unused, c
                        pause("W", 1);
                        thread_lock(td);
                } else {
-                       old_prio = td->td_priority;
                        /* set new thread priority */
                        sched_prio(td, prio);
                        /* task switch */
                        mi_switch(SW_VOL | SWT_RELINQUISH, NULL);
-                       /* restore thread priority */
-                       sched_prio(td, old_prio);
                }
        } else {
                /*
@@ -282,6 +278,7 @@ linux_synchronize_rcu(void)
        int was_bound;
        int old_cpu;
        int old_pinned;
+       u_char old_prio;
 
        if (RCU_SKIP())
                return;
@@ -301,6 +298,7 @@ linux_synchronize_rcu(void)
 
        old_cpu = PCPU_GET(cpuid);
        old_pinned = td->td_pinned;
+       old_prio = td->td_priority;
        td->td_pinned = 0;
        was_bound = sched_is_bound(td);
        sched_bind(td, old_cpu);
@@ -319,6 +317,9 @@ linux_synchronize_rcu(void)
        }
        /* restore pinned after bind */
        td->td_pinned = old_pinned;
+
+       /* restore thread priority */
+       sched_prio(td, old_prio);
        thread_unlock(td);
 
        PICKUP_GIANT();
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to