Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Dec 2016 18:48:02 +0000 (10:48 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Dec 2016 18:48:02 +0000 (10:48 -0800)
Pull locking updates from Ingo Molnar:
 "The tree got pretty big in this development cycle, but the net effect
  is pretty good:

    115 files changed, 673 insertions(+), 1522 deletions(-)

  The main changes were:

   - Rework and generalize the mutex code to remove per arch mutex
     primitives. (Peter Zijlstra)

   - Add vCPU preemption support: add an interface to query the
     preemption status of vCPUs and use it in locking primitives - this
     optimizes paravirt performance. (Pan Xinhui, Juergen Gross,
     Christian Borntraeger)

   - Introduce cpu_relax_yield() and remov cpu_relax_lowlatency() to
     clean up and improve the s390 lock yielding machinery and its core
     kernel impact. (Christian Borntraeger)

   - Micro-optimize mutexes some more. (Waiman Long)

   - Reluctantly add the to-be-deprecated mutex_trylock_recursive()
     interface on a temporary basis, to give the DRM code more time to
     get rid of its locking hacks. Any other users will be NAK-ed on
     sight. (We turned off the deprecation warning for the time being to
     not pollute the build log.) (Peter Zijlstra)

   - Improve the rtmutex code a bit, in light of recent long lived
     bugs/races. (Thomas Gleixner)

   - Misc fixes, cleanups"

* 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (36 commits)
  x86/paravirt: Fix bool return type for PVOP_CALL()
  x86/paravirt: Fix native_patch()
  locking/ww_mutex: Use relaxed atomics
  locking/rtmutex: Explain locking rules for rt_mutex_proxy_unlock()/init_proxy_locked()
  locking/rtmutex: Get rid of RT_MUTEX_OWNER_MASKALL
  x86/paravirt: Optimize native pv_lock_ops.vcpu_is_preempted()
  locking/mutex: Break out of expensive busy-loop on {mutex,rwsem}_spin_on_owner() when owner vCPU is preempted
  locking/osq: Break out of spin-wait busy waiting loop for a preempted vCPU in osq_lock()
  Documentation/virtual/kvm: Support the vCPU preemption check
  x86/xen: Support the vCPU preemption check
  x86/kvm: Support the vCPU preemption check
  x86/kvm: Support the vCPU preemption check
  kvm: Introduce kvm_write_guest_offset_cached()
  locking/core, x86/paravirt: Implement vcpu_is_preempted(cpu) for KVM and Xen guests
  locking/spinlocks, s390: Implement vcpu_is_preempted(cpu)
  locking/core, powerpc: Implement vcpu_is_preempted(cpu)
  sched/core: Introduce the vcpu_is_preempted(cpu) interface
  sched/wake_q: Rename WAKE_Q to DEFINE_WAKE_Q
  locking/core: Provide common cpu_relax_yield() definition
  locking/mutex: Don't mark mutex_trylock_recursive() as deprecated, temporarily
  ...

1  2 
net/core/dev.c

diff --cc net/core/dev.c
index 1d33ce03365f1e10996ad5274e86bf351a526284,6666b28b6815e1665218af967bc9e3adbb87b86f..3fec23cdeb80ed909d71dd4edda81dbb791c67f3
@@@ -5049,26 -5013,10 +5049,26 @@@ count
                if (rc == LL_FLUSH_FAILED)
                        break; /* permanent failure */
  
 -              cpu_relax();
 -      } while (!nonblock && skb_queue_empty(&sk->sk_receive_queue) &&
 -               !need_resched() && !busy_loop_timeout(end_time));
 +              if (nonblock || !skb_queue_empty(&sk->sk_receive_queue) ||
 +                  busy_loop_timeout(end_time))
 +                      break;
  
-               cpu_relax_lowlatency();
 +              if (unlikely(need_resched())) {
 +                      if (napi_poll)
 +                              busy_poll_stop(napi, have_poll_lock);
 +                      preempt_enable();
 +                      rcu_read_unlock();
 +                      cond_resched();
 +                      rc = !skb_queue_empty(&sk->sk_receive_queue);
 +                      if (rc || busy_loop_timeout(end_time))
 +                              return rc;
 +                      goto restart;
 +              }
++              cpu_relax();
 +      }
 +      if (napi_poll)
 +              busy_poll_stop(napi, have_poll_lock);
 +      preempt_enable();
        rc = !skb_queue_empty(&sk->sk_receive_queue);
  out:
        rcu_read_unlock();