[packages/kernel/LINUX_4_4] RT patch updated

jajcus jajcus at pld-linux.org
Fri Nov 11 14:30:00 CET 2016


commit cb95d48a86989c0e2140489a728fb98cef740ffc
Author: Jacek Konieczny <jajcus at jajcus.net>
Date:   Fri Nov 11 14:29:46 2016 +0100

    RT patch updated

 kernel-rt.patch | 318 ++++++++++++++++++++++++++++++++++++--------------------
 kernel.spec     |   2 +-
 2 files changed, 208 insertions(+), 112 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 72fa8bc..108acf5 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -222,7 +222,7 @@ Patch250:	kernel-fix_256colors_menuconfig.patch
 Patch400:	kernel-virtio-gl-accel.patch
 
 # https://rt.wiki.kernel.org/
-# https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/patch-4.4.27-rt37.patch.xz
+# https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/patch-4.4.30-rt41.patch.xz
 Patch500:	kernel-rt.patch
 
 Patch2000:	kernel-small_fixes.patch
diff --git a/kernel-rt.patch b/kernel-rt.patch
index 96ec6ba..41baa92 100644
--- a/kernel-rt.patch
+++ b/kernel-rt.patch
@@ -69,10 +69,10 @@ index 000000000000..cb61516483d3
 +then we write to a global sample ring buffer of 8K samples, which is
 +consumed by reading from the "sample" (pipe) debugfs file interface.
 diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
-index 0e4102ae1a61..26b5f39d57a8 100644
+index c360f80c3473..5489dea355a2 100644
 --- a/Documentation/kernel-parameters.txt
 +++ b/Documentation/kernel-parameters.txt
-@@ -1629,6 +1629,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
+@@ -1636,6 +1636,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
  	ip=		[IP_PNP]
  			See Documentation/filesystems/nfs/nfsroot.txt.
  
@@ -305,9 +305,18 @@ index 000000000000..6f2aeabf7faa
 +
 +These data are also reset when the wakeup histogram is reset.
 diff --git a/Makefile b/Makefile
-index b6ee4ce561f8..3b2614a0fa1b 100644
+index 98239d56924c..5ed3edefebde 100644
 --- a/Makefile
 +++ b/Makefile
+@@ -394,7 +394,7 @@ KBUILD_CPPFLAGS := -D__KERNEL__
+ KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
+ 		   -fno-strict-aliasing -fno-common \
+ 		   -Werror-implicit-function-declaration \
+-		   -Wno-format-security \
++		   -Wno-format-security -fno-PIE \
+ 		   -std=gnu89
+ 
+ KBUILD_AFLAGS_KERNEL :=
 @@ -783,6 +783,9 @@ KBUILD_CFLAGS   += $(call cc-option,-Werror=strict-prototypes)
  # Prohibit date/time macros, which would make the build non-deterministic
  KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)
@@ -2762,6 +2771,20 @@ index ea7074784cc4..01ec643ce66e 100644
  	unsigned long	nmi_count;	/* obsolete, see uv_hub_nmi */
  };
  extern struct uv_blade_info *uv_blade_info;
+diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
+index e75907601a41..a29fc4f84fc4 100644
+--- a/arch/x86/kernel/acpi/boot.c
++++ b/arch/x86/kernel/acpi/boot.c
+@@ -87,7 +87,9 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
+  *		->ioapic_mutex
+  *			->ioapic_lock
+  */
++#ifdef CONFIG_X86_IO_APIC
+ static DEFINE_MUTEX(acpi_ioapic_lock);
++#endif
+ 
+ /* --------------------------------------------------------------------------
+                               Boot-time Configuration
 diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
 index fdb0fbfb1197..678c711e2a16 100644
 --- a/arch/x86/kernel/apic/io_apic.c
@@ -9113,7 +9136,7 @@ index 4d200883c505..98b64ed5cb81 100644
  	Allows a block device to be used as cache for other devices; uses
  	a btree for indexing and the layout is optimized for SSDs.
 diff --git a/drivers/md/dm.c b/drivers/md/dm.c
-index a42729ebf272..c717ec464459 100644
+index 84aa8b1d0480..b7f070e3698e 100644
 --- a/drivers/md/dm.c
 +++ b/drivers/md/dm.c
 @@ -2127,7 +2127,7 @@ static void dm_request_fn(struct request_queue *q)
@@ -12596,7 +12619,7 @@ index a19bcf9e762e..897495386446 100644
  static inline int kdb_register(char *cmd, kdb_func_t func, char *usage,
  			       char *help, short minlen) { return 0; }
 diff --git a/include/linux/kernel.h b/include/linux/kernel.h
-index e571e592e53a..8004feb91175 100644
+index 50220cab738c..d68f639f7330 100644
 --- a/include/linux/kernel.h
 +++ b/include/linux/kernel.h
 @@ -188,6 +188,9 @@ extern int _cond_resched(void);
@@ -12625,7 +12648,7 @@ index e571e592e53a..8004feb91175 100644
  extern void oops_enter(void);
  extern void oops_exit(void);
  void print_oops_end_marker(void);
-@@ -446,6 +451,14 @@ extern int sysctl_panic_on_stackoverflow;
+@@ -448,6 +453,14 @@ extern int sysctl_panic_on_stackoverflow;
  extern bool crash_kexec_post_notifiers;
  
  /*
@@ -12640,7 +12663,7 @@ index e571e592e53a..8004feb91175 100644
   * Only to be used by arch init code. If the user over-wrote the default
   * CONFIG_PANIC_TIMEOUT, honor it.
   */
-@@ -473,6 +486,7 @@ extern enum system_states {
+@@ -475,6 +488,7 @@ extern enum system_states {
  	SYSTEM_HALT,
  	SYSTEM_POWER_OFF,
  	SYSTEM_RESTART,
@@ -13240,7 +13263,7 @@ index 000000000000..c38a44b14da5
 +
 +#endif
 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
-index 4e9c75226f07..53dd7087d75e 100644
+index 12b4d54a8ffa..a2e7d1816b4c 100644
 --- a/include/linux/netdevice.h
 +++ b/include/linux/netdevice.h
 @@ -2248,11 +2248,20 @@ void netdev_freemem(struct net_device *dev);
@@ -14850,7 +14873,7 @@ index c4414074bd88..e6ab36aeaaab 100644
   * Callback to arch code if there's nosmp or maxcpus=0 on the
   * boot command line:
 diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h
-index 47dd0cebd204..b241cc044bd3 100644
+index 47dd0cebd204..02928fa5499d 100644
 --- a/include/linux/spinlock.h
 +++ b/include/linux/spinlock.h
 @@ -271,7 +271,11 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock)
@@ -14877,7 +14900,20 @@ index 47dd0cebd204..b241cc044bd3 100644
  /*
   * Map the spin_lock functions to the raw variants for PREEMPT_RT=n
   */
-@@ -416,4 +424,6 @@ extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
+@@ -347,6 +355,12 @@ static __always_inline void spin_unlock(spinlock_t *lock)
+ 	raw_spin_unlock(&lock->rlock);
+ }
+ 
++static __always_inline int spin_unlock_no_deboost(spinlock_t *lock)
++{
++	raw_spin_unlock(&lock->rlock);
++	return 0;
++}
++
+ static __always_inline void spin_unlock_bh(spinlock_t *lock)
+ {
+ 	raw_spin_unlock_bh(&lock->rlock);
+@@ -416,4 +430,6 @@ extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
  #define atomic_dec_and_lock(atomic, lock) \
  		__cond_lock(lock, _atomic_dec_and_lock(atomic, lock))
  
@@ -14900,10 +14936,10 @@ index 5344268e6e62..043263f30e81 100644
  #endif /* __LINUX_SPINLOCK_API_SMP_H */
 diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h
 new file mode 100644
-index 000000000000..3b2825537531
+index 000000000000..7eb87584e843
 --- /dev/null
 +++ b/include/linux/spinlock_rt.h
-@@ -0,0 +1,163 @@
+@@ -0,0 +1,165 @@
 +#ifndef __LINUX_SPINLOCK_RT_H
 +#define __LINUX_SPINLOCK_RT_H
 +
@@ -14932,6 +14968,7 @@ index 000000000000..3b2825537531
 +extern unsigned long __lockfunc rt_spin_lock_trace_flags(spinlock_t *lock);
 +extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass);
 +extern void __lockfunc rt_spin_unlock(spinlock_t *lock);
++extern int __lockfunc rt_spin_unlock_no_deboost(spinlock_t *lock);
 +extern void __lockfunc rt_spin_unlock_wait(spinlock_t *lock);
 +extern int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags);
 +extern int __lockfunc rt_spin_trylock_bh(spinlock_t *lock);
@@ -15018,6 +15055,7 @@ index 000000000000..3b2825537531
 +#define spin_lock_nest_lock(lock, nest_lock) spin_lock_nested(lock, 0)
 +
 +#define spin_unlock(lock)			rt_spin_unlock(lock)
++#define spin_unlock_no_deboost(lock)		rt_spin_unlock_no_deboost(lock)
 +
 +#define spin_unlock_bh(lock)				\
 +	do {						\
@@ -15540,7 +15578,7 @@ index 000000000000..83f004a72320
 +
 +#endif /* _LINUX_SWAIT_H */
 diff --git a/include/linux/swap.h b/include/linux/swap.h
-index 7ba7dccaf0e7..da646f2eb3c6 100644
+index d8ca2eaa3a8b..19e038054914 100644
 --- a/include/linux/swap.h
 +++ b/include/linux/swap.h
 @@ -11,6 +11,7 @@
@@ -15561,7 +15599,7 @@ index 7ba7dccaf0e7..da646f2eb3c6 100644
  
  static inline unsigned int workingset_node_pages(struct radix_tree_node *node)
  {
-@@ -296,6 +298,7 @@ extern unsigned long nr_free_pagecache_pages(void);
+@@ -298,6 +300,7 @@ extern unsigned long nr_free_pagecache_pages(void);
  
  
  /* linux/mm/swap.c */
@@ -16511,10 +16549,10 @@ index c6521c205cb4..996d89023552 100644
  		if (msg != ERR_PTR(-EAGAIN))
  			goto out_unlock0;
 diff --git a/ipc/sem.c b/ipc/sem.c
-index 20d07008ad5e..40b5cc070720 100644
+index 9862c3d1c26d..ef34d7376697 100644
 --- a/ipc/sem.c
 +++ b/ipc/sem.c
-@@ -690,6 +690,13 @@ undo:
+@@ -708,6 +708,13 @@ undo:
  static void wake_up_sem_queue_prepare(struct list_head *pt,
  				struct sem_queue *q, int error)
  {
@@ -16528,7 +16566,7 @@ index 20d07008ad5e..40b5cc070720 100644
  	if (list_empty(pt)) {
  		/*
  		 * Hold preempt off so that we don't get preempted and have the
-@@ -701,6 +708,7 @@ static void wake_up_sem_queue_prepare(struct list_head *pt,
+@@ -719,6 +726,7 @@ static void wake_up_sem_queue_prepare(struct list_head *pt,
  	q->pid = error;
  
  	list_add_tail(&q->list, pt);
@@ -16536,7 +16574,7 @@ index 20d07008ad5e..40b5cc070720 100644
  }
  
  /**
-@@ -714,6 +722,7 @@ static void wake_up_sem_queue_prepare(struct list_head *pt,
+@@ -732,6 +740,7 @@ static void wake_up_sem_queue_prepare(struct list_head *pt,
   */
  static void wake_up_sem_queue_do(struct list_head *pt)
  {
@@ -16544,7 +16582,7 @@ index 20d07008ad5e..40b5cc070720 100644
  	struct sem_queue *q, *t;
  	int did_something;
  
-@@ -726,6 +735,7 @@ static void wake_up_sem_queue_do(struct list_head *pt)
+@@ -744,6 +753,7 @@ static void wake_up_sem_queue_do(struct list_head *pt)
  	}
  	if (did_something)
  		preempt_enable();
@@ -17213,7 +17251,7 @@ index 7161ebe67cbb..3b880312b385 100644
  
  #if defined(SPLIT_RSS_COUNTING)
 diff --git a/kernel/futex.c b/kernel/futex.c
-index 9d8163afd87c..ad38af0bcff3 100644
+index 9d8163afd87c..059623427b99 100644
 --- a/kernel/futex.c
 +++ b/kernel/futex.c
 @@ -815,7 +815,9 @@ void exit_pi_state_list(struct task_struct *curr)
@@ -17276,9 +17314,12 @@ index 9d8163afd87c..ad38af0bcff3 100644
  
  	/*
  	 * First unlock HB so the waiter does not spin on it once he got woken
-@@ -1286,6 +1290,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this,
+@@ -1284,8 +1288,9 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this,
+ 	 * deboost first (and lose our higher priority), then the task might get
+ 	 * scheduled away before the wake up can take place.
  	 */
- 	spin_unlock(&hb->lock);
+-	spin_unlock(&hb->lock);
++	deboost |= spin_unlock_no_deboost(&hb->lock);
  	wake_up_q(&wake_q);
 +	wake_up_q_sleeper(&wake_sleeper_q);
  	if (deboost)
@@ -18613,7 +18654,7 @@ index 000000000000..d4ab61c1848b
 +}
 +EXPORT_SYMBOL(atomic_dec_and_mutex_lock);
 diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
-index 8251e75dd9c0..fde5e54f1096 100644
+index 8251e75dd9c0..6759a798c927 100644
 --- a/kernel/locking/rtmutex.c
 +++ b/kernel/locking/rtmutex.c
 @@ -7,6 +7,11 @@
@@ -18928,7 +18969,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  takeit:
  	/* We got the lock. */
-@@ -878,12 +919,405 @@ takeit:
+@@ -878,12 +919,444 @@ takeit:
  	return 1;
  }
  
@@ -18952,13 +18993,14 @@ index 8251e75dd9c0..fde5e54f1096 100644
 +		slowfn(lock, do_mig_dis);
 +}
 +
-+static inline void rt_spin_lock_fastunlock(struct rt_mutex *lock,
-+					   void  (*slowfn)(struct rt_mutex *lock))
++static inline int rt_spin_lock_fastunlock(struct rt_mutex *lock,
++					   int  (*slowfn)(struct rt_mutex *lock))
 +{
-+	if (likely(rt_mutex_cmpxchg_release(lock, current, NULL)))
++	if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) {
 +		rt_mutex_deadlock_account_unlock(current);
-+	else
-+		slowfn(lock);
++		return 0;
++	}
++	return slowfn(lock);
 +}
 +#ifdef CONFIG_SMP
 +/*
@@ -19099,7 +19141,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
 +/*
 + * Slow path to release a rt_mutex spin_lock style
 + */
-+static void  noinline __sched rt_spin_lock_slowunlock(struct rt_mutex *lock)
++static int noinline __sched rt_spin_lock_slowunlock(struct rt_mutex *lock)
 +{
 +	unsigned long flags;
 +	WAKE_Q(wake_q);
@@ -19114,7 +19156,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
 +	if (!rt_mutex_has_waiters(lock)) {
 +		lock->owner = NULL;
 +		raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
-+		return;
++		return 0;
 +	}
 +
 +	mark_wakeup_next_waiter(&wake_q, &wake_sleeper_q, lock);
@@ -19125,6 +19167,33 @@ index 8251e75dd9c0..fde5e54f1096 100644
 +
 +	/* Undo pi boosting.when necessary */
 +	rt_mutex_adjust_prio(current);
++	return 0;
++}
++
++static int noinline __sched rt_spin_lock_slowunlock_no_deboost(struct rt_mutex *lock)
++{
++	unsigned long flags;
++	WAKE_Q(wake_q);
++	WAKE_Q(wake_sleeper_q);
++
++	raw_spin_lock_irqsave(&lock->wait_lock, flags);
++
++	debug_rt_mutex_unlock(lock);
++
++	rt_mutex_deadlock_account_unlock(current);
++
++	if (!rt_mutex_has_waiters(lock)) {
++		lock->owner = NULL;
++		raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
++		return 0;
++	}
++
++	mark_wakeup_next_waiter(&wake_q, &wake_sleeper_q, lock);
++
++	raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
++	wake_up_q(&wake_q);
++	wake_up_q_sleeper(&wake_sleeper_q);
++	return 1;
 +}
 +
 +void __lockfunc rt_spin_lock__no_mg(spinlock_t *lock)
@@ -19179,6 +19248,17 @@ index 8251e75dd9c0..fde5e54f1096 100644
 +}
 +EXPORT_SYMBOL(rt_spin_unlock);
 +
++int __lockfunc rt_spin_unlock_no_deboost(spinlock_t *lock)
++{
++	int ret;
++
++	/* NOTE: we always pass in '1' for nested, for simplicity */
++	spin_release(&lock->dep_map, 1, _RET_IP_);
++	ret = rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock_no_deboost);
++	migrate_enable();
++	return ret;
++}
++
 +void __lockfunc __rt_spin_unlock(struct rt_mutex *lock)
 +{
 +	rt_spin_lock_fastunlock(lock, rt_spin_lock_slowunlock);
@@ -19335,7 +19415,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
   */
  static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
  				   struct rt_mutex_waiter *waiter,
-@@ -894,7 +1328,6 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
+@@ -894,7 +1367,6 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
  	struct rt_mutex_waiter *top_waiter = waiter;
  	struct rt_mutex *next_lock;
  	int chain_walk = 0, res;
@@ -19343,7 +19423,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	/*
  	 * Early deadlock detection. We really don't want the task to
-@@ -908,7 +1341,24 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
+@@ -908,7 +1380,24 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
  	if (owner == task)
  		return -EDEADLK;
  
@@ -19369,7 +19449,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  	__rt_mutex_adjust_prio(task);
  	waiter->task = task;
  	waiter->lock = lock;
-@@ -921,18 +1371,18 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
+@@ -921,18 +1410,18 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
  
  	task->pi_blocked_on = waiter;
  
@@ -19391,7 +19471,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  			chain_walk = 1;
  	} else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) {
  		chain_walk = 1;
-@@ -941,7 +1391,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
+@@ -941,7 +1430,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
  	/* Store the lock on which owner is blocked or NULL */
  	next_lock = task_blocked_on_lock(owner);
  
@@ -19400,7 +19480,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  	/*
  	 * Even if full deadlock detection is on, if the owner is not
  	 * blocked itself, we can avoid finding this out in the chain
-@@ -957,12 +1407,12 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
+@@ -957,12 +1446,12 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
  	 */
  	get_task_struct(owner);
  
@@ -19415,7 +19495,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	return res;
  }
-@@ -971,15 +1421,15 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
+@@ -971,15 +1460,15 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
   * Remove the top waiter from the current tasks pi waiter tree and
   * queue it up.
   *
@@ -19434,7 +19514,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	waiter = rt_mutex_top_waiter(lock);
  
-@@ -1001,15 +1451,18 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q,
+@@ -1001,15 +1490,18 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q,
  	 */
  	lock->owner = (void *) RT_MUTEX_HAS_WAITERS;
  
@@ -19456,7 +19536,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
   * have just failed to try_to_take_rt_mutex().
   */
  static void remove_waiter(struct rt_mutex *lock,
-@@ -1017,13 +1470,12 @@ static void remove_waiter(struct rt_mutex *lock,
+@@ -1017,13 +1509,12 @@ static void remove_waiter(struct rt_mutex *lock,
  {
  	bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
  	struct task_struct *owner = rt_mutex_owner(lock);
@@ -19473,7 +19553,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	/*
  	 * Only update priority if the waiter was the highest priority
-@@ -1032,7 +1484,7 @@ static void remove_waiter(struct rt_mutex *lock,
+@@ -1032,7 +1523,7 @@ static void remove_waiter(struct rt_mutex *lock,
  	if (!owner || !is_top_waiter)
  		return;
  
@@ -19482,7 +19562,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	rt_mutex_dequeue_pi(owner, waiter);
  
-@@ -1042,9 +1494,10 @@ static void remove_waiter(struct rt_mutex *lock,
+@@ -1042,9 +1533,10 @@ static void remove_waiter(struct rt_mutex *lock,
  	__rt_mutex_adjust_prio(owner);
  
  	/* Store the lock on which owner is blocked or NULL */
@@ -19495,7 +19575,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	/*
  	 * Don't walk the chain, if the owner task is not blocked
-@@ -1056,12 +1509,12 @@ static void remove_waiter(struct rt_mutex *lock,
+@@ -1056,12 +1548,12 @@ static void remove_waiter(struct rt_mutex *lock,
  	/* gets dropped in rt_mutex_adjust_prio_chain()! */
  	get_task_struct(owner);
  
@@ -19510,7 +19590,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  }
  
  /*
-@@ -1078,17 +1531,17 @@ void rt_mutex_adjust_pi(struct task_struct *task)
+@@ -1078,17 +1570,17 @@ void rt_mutex_adjust_pi(struct task_struct *task)
  	raw_spin_lock_irqsave(&task->pi_lock, flags);
  
  	waiter = task->pi_blocked_on;
@@ -19530,7 +19610,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  	rt_mutex_adjust_prio_chain(task, RT_MUTEX_MIN_CHAINWALK, NULL,
  				   next_lock, NULL, task);
  }
-@@ -1097,16 +1550,17 @@ void rt_mutex_adjust_pi(struct task_struct *task)
+@@ -1097,16 +1589,17 @@ void rt_mutex_adjust_pi(struct task_struct *task)
   * __rt_mutex_slowlock() - Perform the wait-wake-try-to-take loop
   * @lock:		 the rt_mutex to take
   * @state:		 the state the task should block in (TASK_INTERRUPTIBLE
@@ -19551,7 +19631,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  {
  	int ret = 0;
  
-@@ -1129,13 +1583,19 @@ __rt_mutex_slowlock(struct rt_mutex *lock, int state,
+@@ -1129,13 +1622,19 @@ __rt_mutex_slowlock(struct rt_mutex *lock, int state,
  				break;
  		}
  
@@ -19573,7 +19653,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  		set_current_state(state);
  	}
  
-@@ -1163,26 +1623,112 @@ static void rt_mutex_handle_deadlock(int res, int detect_deadlock,
+@@ -1163,26 +1662,112 @@ static void rt_mutex_handle_deadlock(int res, int detect_deadlock,
  	}
  }
  
@@ -19692,7 +19772,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  		return 0;
  	}
  
-@@ -1196,13 +1742,23 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
+@@ -1196,13 +1781,23 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
  
  	if (likely(!ret))
  		/* sleep on the mutex */
@@ -19718,7 +19798,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  	}
  
  	/*
-@@ -1211,7 +1767,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
+@@ -1211,7 +1806,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
  	 */
  	fixup_rt_mutex_waiters(lock);
  
@@ -19727,7 +19807,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	/* Remove pending timer: */
  	if (unlikely(timeout))
-@@ -1227,6 +1783,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
+@@ -1227,6 +1822,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
   */
  static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)
  {
@@ -19735,7 +19815,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  	int ret;
  
  	/*
-@@ -1238,10 +1795,10 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)
+@@ -1238,10 +1834,10 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)
  		return 0;
  
  	/*
@@ -19749,7 +19829,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	ret = try_to_take_rt_mutex(lock, current, NULL);
  
-@@ -1251,7 +1808,7 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)
+@@ -1251,7 +1847,7 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)
  	 */
  	fixup_rt_mutex_waiters(lock);
  
@@ -19758,7 +19838,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	return ret;
  }
-@@ -1261,9 +1818,13 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)
+@@ -1261,9 +1857,13 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock)
   * Return whether the current task needs to undo a potential priority boosting.
   */
  static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
@@ -19774,7 +19854,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	debug_rt_mutex_unlock(lock);
  
-@@ -1302,10 +1863,10 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
+@@ -1302,10 +1902,10 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
  	 */
  	while (!rt_mutex_has_waiters(lock)) {
  		/* Drops lock->wait_lock ! */
@@ -19787,7 +19867,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  	}
  
  	/*
-@@ -1314,9 +1875,9 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
+@@ -1314,9 +1914,9 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
  	 *
  	 * Queue the next waiter for wakeup once we release the wait_lock.
  	 */
@@ -19799,7 +19879,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	/* check PI boosting */
  	return true;
-@@ -1330,31 +1891,36 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
+@@ -1330,31 +1930,36 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
   */
  static inline int
  rt_mutex_fastlock(struct rt_mutex *lock, int state,
@@ -19840,7 +19920,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  }
  
  static inline int
-@@ -1371,17 +1937,20 @@ rt_mutex_fasttrylock(struct rt_mutex *lock,
+@@ -1371,17 +1976,20 @@ rt_mutex_fasttrylock(struct rt_mutex *lock,
  static inline void
  rt_mutex_fastunlock(struct rt_mutex *lock,
  		    bool (*slowfn)(struct rt_mutex *lock,
@@ -19863,7 +19943,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  		/* Undo pi boosting if necessary: */
  		if (deboost)
-@@ -1398,7 +1967,7 @@ void __sched rt_mutex_lock(struct rt_mutex *lock)
+@@ -1398,7 +2006,7 @@ void __sched rt_mutex_lock(struct rt_mutex *lock)
  {
  	might_sleep();
  
@@ -19872,7 +19952,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  }
  EXPORT_SYMBOL_GPL(rt_mutex_lock);
  
-@@ -1415,7 +1984,7 @@ int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock)
+@@ -1415,7 +2023,7 @@ int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock)
  {
  	might_sleep();
  
@@ -19881,7 +19961,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  }
  EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible);
  
-@@ -1428,11 +1997,30 @@ int rt_mutex_timed_futex_lock(struct rt_mutex *lock,
+@@ -1428,11 +2036,30 @@ int rt_mutex_timed_futex_lock(struct rt_mutex *lock,
  	might_sleep();
  
  	return rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout,
@@ -19913,7 +19993,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
   * rt_mutex_timed_lock - lock a rt_mutex interruptible
   *			the timeout structure is provided
   *			by the caller
-@@ -1452,6 +2040,7 @@ rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout)
+@@ -1452,6 +2079,7 @@ rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout)
  
  	return rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout,
  				       RT_MUTEX_MIN_CHAINWALK,
@@ -19921,7 +20001,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  				       rt_mutex_slowlock);
  }
  EXPORT_SYMBOL_GPL(rt_mutex_timed_lock);
-@@ -1469,7 +2058,11 @@ EXPORT_SYMBOL_GPL(rt_mutex_timed_lock);
+@@ -1469,7 +2097,11 @@ EXPORT_SYMBOL_GPL(rt_mutex_timed_lock);
   */
  int __sched rt_mutex_trylock(struct rt_mutex *lock)
  {
@@ -19933,7 +20013,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  		return 0;
  
  	return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock);
-@@ -1495,13 +2088,14 @@ EXPORT_SYMBOL_GPL(rt_mutex_unlock);
+@@ -1495,13 +2127,14 @@ EXPORT_SYMBOL_GPL(rt_mutex_unlock);
   * required or not.
   */
  bool __sched rt_mutex_futex_unlock(struct rt_mutex *lock,
@@ -19950,7 +20030,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  }
  
  /**
-@@ -1534,13 +2128,12 @@ EXPORT_SYMBOL_GPL(rt_mutex_destroy);
+@@ -1534,13 +2167,12 @@ EXPORT_SYMBOL_GPL(rt_mutex_destroy);
  void __rt_mutex_init(struct rt_mutex *lock, const char *name)
  {
  	lock->owner = NULL;
@@ -19965,7 +20045,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  /**
   * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a
-@@ -1555,7 +2148,7 @@ EXPORT_SYMBOL_GPL(__rt_mutex_init);
+@@ -1555,7 +2187,7 @@ EXPORT_SYMBOL_GPL(__rt_mutex_init);
  void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
  				struct task_struct *proxy_owner)
  {
@@ -19974,7 +20054,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  	debug_rt_mutex_proxy_lock(lock, proxy_owner);
  	rt_mutex_set_owner(lock, proxy_owner);
  	rt_mutex_deadlock_account_lock(lock, proxy_owner);
-@@ -1596,13 +2189,42 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
+@@ -1596,13 +2228,42 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
  {
  	int ret;
  
@@ -20019,7 +20099,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  	/* We enforce deadlock detection for futexes */
  	ret = task_blocks_on_rt_mutex(lock, waiter, task,
  				      RT_MUTEX_FULL_CHAINWALK);
-@@ -1617,10 +2239,10 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
+@@ -1617,10 +2278,10 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
  		ret = 0;
  	}
  
@@ -20032,7 +20112,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	debug_rt_mutex_print_deadlock(waiter);
  
-@@ -1668,12 +2290,12 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
+@@ -1668,12 +2329,12 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
  {
  	int ret;
  
@@ -20047,7 +20127,7 @@ index 8251e75dd9c0..fde5e54f1096 100644
  
  	if (unlikely(ret))
  		remove_waiter(lock, waiter);
-@@ -1684,7 +2306,93 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
+@@ -1684,7 +2345,93 @@ int rt_mutex_finish_proxy_lock(struct rt_mutex *lock,
  	 */
  	fixup_rt_mutex_waiters(lock);
  
@@ -27475,7 +27555,7 @@ index 000000000000..7f6ee70dea41
 +
 +device_initcall(latency_hist_init);
 diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index 059233abcfcf..aebdbff7d425 100644
+index 059233abcfcf..cad1a28bfbe2 100644
 --- a/kernel/trace/trace.c
 +++ b/kernel/trace/trace.c
 @@ -1652,6 +1652,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags,
@@ -27511,17 +27591,17 @@ index 059233abcfcf..aebdbff7d425 100644
 -		    "#                |||| /     delay            \n"
 -		    "#  cmd     pid   ||||| time  |   caller      \n"
 -		    "#     \\   /      |||||  \\    |   /         \n");
-+	seq_puts(m, "#                   _--------=> CPU#              \n"
-+		    "#                  / _-------=> irqs-off          \n"
-+		    "#                 | / _------=> need-resched      \n"
-+		    "#                 || / _-----=> need-resched_lazy \n"
-+		    "#                 ||| / _----=> hardirq/softirq   \n"
-+		    "#                 |||| / _---=> preempt-depth     \n"
-+		    "#                 ||||| / _--=> preempt-lazy-depth\n"
-+		    "#                 |||||| / _-=> migrate-disable   \n"
-+		    "#                 ||||||| /     delay             \n"
-+		    "#  cmd     pid    |||||||| time  |   caller       \n"
-+		    "#     \\   /      ||||||||  \\   |   /            \n");
++	seq_puts(m, "#                  _--------=> CPU#              \n"
++		    "#                 / _-------=> irqs-off          \n"
++		    "#                | / _------=> need-resched      \n"
++		    "#                || / _-----=> need-resched_lazy \n"
++		    "#                ||| / _----=> hardirq/softirq   \n"
++		    "#                |||| / _---=> preempt-depth     \n"
++		    "#                ||||| / _--=> preempt-lazy-depth\n"
++		    "#                |||||| / _-=> migrate-disable   \n"
++		    "#                ||||||| /     delay             \n"
++		    "# cmd     pid    |||||||| time   |  caller       \n"
++		    "#     \\   /      ||||||||   \\    |  /            \n");
  }
  
  static void print_event_info(struct trace_buffer *buf, struct seq_file *m)
@@ -27537,11 +27617,11 @@ index 059233abcfcf..aebdbff7d425 100644
 +		    "#                            |/  _-----=> need-resched_lazy\n"
 +		    "#                            || / _---=> hardirq/softirq\n"
 +		    "#                            ||| / _--=> preempt-depth\n"
-+		    "#                            |||| /_--=> preempt-lazy-depth\n"
-+		    "#                            |||||  _-=> migrate-disable   \n"
-+		    "#                            ||||| /    delay\n"
-+		    "#           TASK-PID   CPU#  ||||||    TIMESTAMP  FUNCTION\n"
-+		    "#              | |       |   ||||||       |         |\n");
++		    "#                            |||| / _-=> preempt-lazy-depth\n"
++		    "#                            ||||| / _-=> migrate-disable   \n"
++		    "#                            |||||| /    delay\n"
++		    "#           TASK-PID   CPU#  |||||||   TIMESTAMP  FUNCTION\n"
++		    "#              | |       |   |||||||      |         |\n");
  }
  
  void
@@ -28941,11 +29021,11 @@ index 1afec32de6f2..11fa431046a8 100644
  	dump_stack();
 diff --git a/localversion-rt b/localversion-rt
 new file mode 100644
-index 000000000000..a3b2408c1da6
+index 000000000000..629e0b4384b8
 --- /dev/null
 +++ b/localversion-rt
 @@ -0,0 +1 @@
-+-rt37
++-rt41
 diff --git a/mm/Kconfig b/mm/Kconfig
 index 97a4e06b15c0..9614351e68b8 100644
 --- a/mm/Kconfig
@@ -28995,21 +29075,10 @@ index dba02dec7195..51963f58a29b 100644
  				cc->last_migrated_pfn = 0;
  			}
 diff --git a/mm/filemap.c b/mm/filemap.c
-index 1bb007624b53..44301361c100 100644
+index c588d1222b2a..da6a5fbfadd2 100644
 --- a/mm/filemap.c
 +++ b/mm/filemap.c
-@@ -168,7 +168,9 @@ static void page_cache_tree_delete(struct address_space *mapping,
- 	if (!workingset_node_pages(node) &&
- 	    list_empty(&node->private_list)) {
- 		node->private_data = mapping;
--		list_lru_add(&workingset_shadow_nodes, &node->private_list);
-+		local_lock(workingset_shadow_lock);
-+		list_lru_add(&__workingset_shadow_nodes, &node->private_list);
-+		local_unlock(workingset_shadow_lock);
- 	}
- }
- 
-@@ -597,9 +599,12 @@ static int page_cache_tree_insert(struct address_space *mapping,
+@@ -144,9 +144,12 @@ static int page_cache_tree_insert(struct address_space *mapping,
  		 * node->private_list is protected by
  		 * mapping->tree_lock.
  		 */
@@ -29024,6 +29093,17 @@ index 1bb007624b53..44301361c100 100644
  	}
  	return 0;
  }
+@@ -218,7 +221,9 @@ static void page_cache_tree_delete(struct address_space *mapping,
+ 	if (!workingset_node_pages(node) &&
+ 	    list_empty(&node->private_list)) {
+ 		node->private_data = mapping;
+-		list_lru_add(&workingset_shadow_nodes, &node->private_list);
++		local_lock(workingset_shadow_lock);
++		list_lru_add(&__workingset_shadow_nodes, &node->private_list);
++		local_unlock(workingset_shadow_lock);
+ 	}
+ }
+ 
 diff --git a/mm/highmem.c b/mm/highmem.c
 index 123bcd3ed4f2..16e8cf26d38a 100644
 --- a/mm/highmem.c
@@ -30267,7 +30347,7 @@ index c54fd2924f25..64416fd7c209 100644
  
  void __dec_zone_page_state(struct page *page, enum zone_stat_item item)
 diff --git a/mm/workingset.c b/mm/workingset.c
-index aa017133744b..263d0194734a 100644
+index df66f426fdcf..6db7b243fa0d 100644
 --- a/mm/workingset.c
 +++ b/mm/workingset.c
 @@ -264,7 +264,8 @@ void workingset_activation(struct page *page)
@@ -30293,7 +30373,7 @@ index aa017133744b..263d0194734a 100644
  
  	pages = node_present_pages(sc->nid);
  	/*
-@@ -363,9 +364,9 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
+@@ -361,9 +362,9 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
  	spin_unlock(&mapping->tree_lock);
  	ret = LRU_REMOVED_RETRY;
  out:
@@ -30305,7 +30385,7 @@ index aa017133744b..263d0194734a 100644
  	spin_lock(lru_lock);
  	return ret;
  }
-@@ -376,10 +377,10 @@ static unsigned long scan_shadow_nodes(struct shrinker *shrinker,
+@@ -374,10 +375,10 @@ static unsigned long scan_shadow_nodes(struct shrinker *shrinker,
  	unsigned long ret;
  
  	/* list_lru lock nests inside IRQ-safe mapping->tree_lock */
@@ -30319,7 +30399,7 @@ index aa017133744b..263d0194734a 100644
  	return ret;
  }
  
-@@ -400,7 +401,7 @@ static int __init workingset_init(void)
+@@ -398,7 +399,7 @@ static int __init workingset_init(void)
  {
  	int ret;
  
@@ -30328,7 +30408,7 @@ index aa017133744b..263d0194734a 100644
  	if (ret)
  		goto err;
  	ret = register_shrinker(&workingset_shadow_shrinker);
-@@ -408,7 +409,7 @@ static int __init workingset_init(void)
+@@ -406,7 +407,7 @@ static int __init workingset_init(void)
  		goto err_list_lru;
  	return 0;
  err_list_lru:
@@ -30338,29 +30418,45 @@ index aa017133744b..263d0194734a 100644
  	return ret;
  }
 diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
-index c1ea19478119..b552fd607df8 100644
+index c1ea19478119..529552c3716d 100644
 --- a/mm/zsmalloc.c
 +++ b/mm/zsmalloc.c
-@@ -1289,7 +1289,7 @@ void *zs_map_object(struct zs_pool *pool, unsigned long handle,
+@@ -64,6 +64,7 @@
+ #include <linux/debugfs.h>
+ #include <linux/zsmalloc.h>
+ #include <linux/zpool.h>
++#include <linux/locallock.h>
+ 
+ /*
+  * This must be power of 2 and greater than of equal to sizeof(link_free).
+@@ -403,6 +404,7 @@ static unsigned int get_maxobj_per_zspage(int size, int pages_per_zspage)
+ 
+ /* per-cpu VM mapping areas for zspage accesses that cross page boundaries */
+ static DEFINE_PER_CPU(struct mapping_area, zs_map_area);
++static DEFINE_LOCAL_IRQ_LOCK(zs_map_area_lock);
+ 
+ static int is_first_page(struct page *page)
+ {
+@@ -1289,7 +1291,7 @@ void *zs_map_object(struct zs_pool *pool, unsigned long handle,
  	class = pool->size_class[class_idx];
  	off = obj_idx_to_offset(page, obj_idx, class->size);
  
 -	area = &get_cpu_var(zs_map_area);
-+	area = per_cpu_ptr(&zs_map_area, get_cpu_light());
++	area = &get_locked_var(zs_map_area_lock, zs_map_area);
  	area->vm_mm = mm;
  	if (off + class->size <= PAGE_SIZE) {
  		/* this object is contained entirely within a page */
-@@ -1342,7 +1342,7 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle)
+@@ -1342,7 +1344,7 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle)
  
  		__zs_unmap_object(area, pages, off, class->size);
  	}
 -	put_cpu_var(zs_map_area);
-+	put_cpu_light();
++	put_locked_var(zs_map_area_lock, zs_map_area);
  	unpin_tag(handle);
  }
  EXPORT_SYMBOL_GPL(zs_unmap_object);
 diff --git a/net/core/dev.c b/net/core/dev.c
-index de4ed2b5a221..564933374c5f 100644
+index 0989fea88c44..4d5f550f01f5 100644
 --- a/net/core/dev.c
 +++ b/net/core/dev.c
 @@ -186,6 +186,7 @@ static unsigned int napi_gen_id;
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/kernel.git/commitdiff/cb95d48a86989c0e2140489a728fb98cef740ffc



More information about the pld-cvs-commit mailing list