mirror of
				https://github.com/linuxkit/linuxkit.git
				synced 2025-11-04 10:06:20 +00:00 
			
		
		
		
	update -rt to 4.14.39-rt29
Signed-off-by: Tiejun Chen <tiejun.china@gmail.com>
This commit is contained in:
		@@ -1,5 +1,5 @@
 | 
			
		||||
kernel:
 | 
			
		||||
  image: linuxkit/kernel:4.14.34-rt
 | 
			
		||||
  image: linuxkit/kernel:4.14.39-rt
 | 
			
		||||
  cmdline: "console=tty0"
 | 
			
		||||
init:
 | 
			
		||||
  - linuxkit/init:v0.4
 | 
			
		||||
 
 | 
			
		||||
@@ -221,14 +221,14 @@ ifeq ($(ARCH),x86_64)
 | 
			
		||||
$(eval $(call kernel,4.16.8,4.16.x,$(EXTRA),$(DEBUG)))
 | 
			
		||||
$(eval $(call kernel,4.14.40,4.14.x,$(EXTRA),$(DEBUG)))
 | 
			
		||||
$(eval $(call kernel,4.14.40,4.14.x,,-dbg))
 | 
			
		||||
$(eval $(call kernel,4.14.34,4.14.x,-rt,))
 | 
			
		||||
$(eval $(call kernel,4.14.39,4.14.x,-rt,))
 | 
			
		||||
$(eval $(call kernel,4.9.99,4.9.x,$(EXTRA),$(DEBUG)))
 | 
			
		||||
$(eval $(call kernel,4.4.131,4.4.x,$(EXTRA),$(DEBUG)))
 | 
			
		||||
 | 
			
		||||
else ifeq ($(ARCH),aarch64)
 | 
			
		||||
$(eval $(call kernel,4.16.8,4.16.x,$(EXTRA),$(DEBUG)))
 | 
			
		||||
$(eval $(call kernel,4.14.40,4.14.x,$(EXTRA),$(DEBUG)))
 | 
			
		||||
$(eval $(call kernel,4.14.34,4.14.x,-rt,))
 | 
			
		||||
$(eval $(call kernel,4.14.39,4.14.x,-rt,))
 | 
			
		||||
 | 
			
		||||
else ifeq ($(ARCH),s390x)
 | 
			
		||||
$(eval $(call kernel,4.16.8,4.16.x,$(EXTRA),$(DEBUG)))
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,62 @@
 | 
			
		||||
From: Tejun Heo <tj@kernel.org>
 | 
			
		||||
Date: Tue, 9 Jan 2018 07:21:15 -0800
 | 
			
		||||
Subject: [PATCH] string: drop __must_check from strscpy() and restore
 | 
			
		||||
 strscpy() usages in cgroup
 | 
			
		||||
MIME-Version: 1.0
 | 
			
		||||
Content-Type: text/plain; charset=UTF-8
 | 
			
		||||
Content-Transfer-Encoding: 8bit
 | 
			
		||||
 | 
			
		||||
Upstream commit 08a77676f9c5fc69a681ccd2cd8140e65dcb26c7
 | 
			
		||||
 | 
			
		||||
e7fd37ba1217 ("cgroup: avoid copying strings longer than the buffers")
 | 
			
		||||
converted possibly unsafe strncpy() usages in cgroup to strscpy().
 | 
			
		||||
However, although the callsites are completely fine with truncated
 | 
			
		||||
copied, because strscpy() is marked __must_check, it led to the
 | 
			
		||||
following warnings.
 | 
			
		||||
 | 
			
		||||
  kernel/cgroup/cgroup.c: In function ‘cgroup_file_name’:
 | 
			
		||||
  kernel/cgroup/cgroup.c:1400:10: warning: ignoring return value of ‘strscpy’, declared with attribute warn_unused_result [-Wunused-result]
 | 
			
		||||
     strscpy(buf, cft->name, CGROUP_FILE_NAME_MAX);
 | 
			
		||||
	       ^
 | 
			
		||||
 | 
			
		||||
To avoid the warnings, 50034ed49645 ("cgroup: use strlcpy() instead of
 | 
			
		||||
strscpy() to avoid spurious warning") switched them to strlcpy().
 | 
			
		||||
 | 
			
		||||
strlcpy() is worse than strlcpy() because it unconditionally runs
 | 
			
		||||
strlen() on the source string, and the only reason we switched to
 | 
			
		||||
strlcpy() here was because it was lacking __must_check, which doesn't
 | 
			
		||||
reflect any material differences between the two function.  It's just
 | 
			
		||||
that someone added __must_check to strscpy() and not to strlcpy().
 | 
			
		||||
 | 
			
		||||
These basic string copy operations are used in variety of ways, and
 | 
			
		||||
one of not-so-uncommon use cases is safely handling truncated copies,
 | 
			
		||||
where the caller naturally doesn't care about the return value.  The
 | 
			
		||||
__must_check doesn't match the actual use cases and forces users to
 | 
			
		||||
opt for inferior variants which lack __must_check by happenstance or
 | 
			
		||||
spread ugly (void) casts.
 | 
			
		||||
 | 
			
		||||
Remove __must_check from strscpy() and restore strscpy() usages in
 | 
			
		||||
cgroup.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Tejun Heo <tj@kernel.org>
 | 
			
		||||
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
 | 
			
		||||
Cc: Ma Shimiao <mashimiao.fnst@cn.fujitsu.com>
 | 
			
		||||
Cc: Arnd Bergmann <arnd@arndb.de>
 | 
			
		||||
Cc: Chris Metcalf <cmetcalf@ezchip.com>
 | 
			
		||||
[bigeasy: drop the cgroup.c hunk]
 | 
			
		||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
---
 | 
			
		||||
 include/linux/string.h |    2 +-
 | 
			
		||||
 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/include/linux/string.h
 | 
			
		||||
+++ b/include/linux/string.h
 | 
			
		||||
@@ -28,7 +28,7 @@ extern char * strncpy(char *,const char
 | 
			
		||||
 size_t strlcpy(char *, const char *, size_t);
 | 
			
		||||
 #endif
 | 
			
		||||
 #ifndef __HAVE_ARCH_STRSCPY
 | 
			
		||||
-ssize_t __must_check strscpy(char *, const char *, size_t);
 | 
			
		||||
+ssize_t strscpy(char *, const char *, size_t);
 | 
			
		||||
 #endif
 | 
			
		||||
 #ifndef __HAVE_ARCH_STRCAT
 | 
			
		||||
 extern char * strcat(char *, const char *);
 | 
			
		||||
@@ -114,7 +114,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases);
 | 
			
		||||
--- a/kernel/time/tick-sched.c
 | 
			
		||||
+++ b/kernel/time/tick-sched.c
 | 
			
		||||
@@ -1131,7 +1131,7 @@ static inline void tick_nohz_activate(st
 | 
			
		||||
@@ -1132,7 +1132,7 @@ static inline void tick_nohz_activate(st
 | 
			
		||||
 	ts->nohz_mode = mode;
 | 
			
		||||
 	/* One update is enough */
 | 
			
		||||
 	if (!test_and_set_bit(0, &tick_nohz_active))
 | 
			
		||||
@@ -1,55 +0,0 @@
 | 
			
		||||
From: Anna-Maria Gleixner <anna-maria@linutronix.de>
 | 
			
		||||
Date: Wed, 20 Dec 2017 17:12:57 +0100
 | 
			
		||||
Subject: [PATCH 08/29] tracing/hrtimer: Take all clock bases and modes into
 | 
			
		||||
 account
 | 
			
		||||
 | 
			
		||||
So far only CLOCK_MONOTONIC and CLOCK_REALTIME were taken into account as
 | 
			
		||||
well as HRTIMER_MODE_ABS/REL in hrtimer_init tracepoint. The query for
 | 
			
		||||
detecting timer mode ABS or REL is not valid, since the introduction of
 | 
			
		||||
HRTIMER_MODE_PINNED.
 | 
			
		||||
 | 
			
		||||
HRTIMER_MODE_PINNED is not evaluated in hrtimer_init() call. But for the
 | 
			
		||||
sake of completeness print all given modes.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
 | 
			
		||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
---
 | 
			
		||||
 include/trace/events/timer.h |   20 ++++++++++++++++----
 | 
			
		||||
 1 file changed, 16 insertions(+), 4 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/include/trace/events/timer.h
 | 
			
		||||
+++ b/include/trace/events/timer.h
 | 
			
		||||
@@ -136,6 +136,20 @@ DEFINE_EVENT(timer_class, timer_cancel,
 | 
			
		||||
 	TP_ARGS(timer)
 | 
			
		||||
 );
 | 
			
		||||
 
 | 
			
		||||
+#define decode_clockid(type)						\
 | 
			
		||||
+	__print_symbolic(type,						\
 | 
			
		||||
+		{ CLOCK_REALTIME,	"CLOCK_REALTIME"	},	\
 | 
			
		||||
+		{ CLOCK_MONOTONIC,	"CLOCK_MONOTONIC"	},	\
 | 
			
		||||
+		{ CLOCK_BOOTTIME,	"CLOCK_BOOTTIME"	},	\
 | 
			
		||||
+		{ CLOCK_TAI,		"CLOCK_TAI"		})
 | 
			
		||||
+
 | 
			
		||||
+#define decode_hrtimer_mode(mode)					\
 | 
			
		||||
+	__print_symbolic(mode,						\
 | 
			
		||||
+		{ HRTIMER_MODE_ABS,		"ABS"		},	\
 | 
			
		||||
+		{ HRTIMER_MODE_REL,		"REL"		},	\
 | 
			
		||||
+		{ HRTIMER_MODE_ABS_PINNED,	"ABS|PINNED"	},	\
 | 
			
		||||
+		{ HRTIMER_MODE_REL_PINNED,	"REL|PINNED"	})
 | 
			
		||||
+
 | 
			
		||||
 /**
 | 
			
		||||
  * hrtimer_init - called when the hrtimer is initialized
 | 
			
		||||
  * @hrtimer:	pointer to struct hrtimer
 | 
			
		||||
@@ -162,10 +176,8 @@ TRACE_EVENT(hrtimer_init,
 | 
			
		||||
 	),
 | 
			
		||||
 
 | 
			
		||||
 	TP_printk("hrtimer=%p clockid=%s mode=%s", __entry->hrtimer,
 | 
			
		||||
-		  __entry->clockid == CLOCK_REALTIME ?
 | 
			
		||||
-			"CLOCK_REALTIME" : "CLOCK_MONOTONIC",
 | 
			
		||||
-		  __entry->mode == HRTIMER_MODE_ABS ?
 | 
			
		||||
-			"HRTIMER_MODE_ABS" : "HRTIMER_MODE_REL")
 | 
			
		||||
+		  decode_clockid(__entry->clockid),
 | 
			
		||||
+		  decode_hrtimer_mode(__entry->mode))
 | 
			
		||||
 );
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
@@ -57,7 +57,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 
 | 
			
		||||
--- a/fs/nfs/nfs4proc.c
 | 
			
		||||
+++ b/fs/nfs/nfs4proc.c
 | 
			
		||||
@@ -2638,7 +2638,7 @@ static int _nfs4_open_and_get_state(stru
 | 
			
		||||
@@ -2642,7 +2642,7 @@ static int _nfs4_open_and_get_state(stru
 | 
			
		||||
 	unsigned int seq;
 | 
			
		||||
 	int ret;
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 
 | 
			
		||||
 	ret = _nfs4_proc_open(opendata);
 | 
			
		||||
 	if (ret != 0)
 | 
			
		||||
@@ -2676,7 +2676,7 @@ static int _nfs4_open_and_get_state(stru
 | 
			
		||||
@@ -2680,7 +2680,7 @@ static int _nfs4_open_and_get_state(stru
 | 
			
		||||
 
 | 
			
		||||
 	if (d_inode(dentry) == state->inode) {
 | 
			
		||||
 		nfs_inode_attach_open_context(ctx);
 | 
			
		||||
@@ -86,7 +86,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 	mutex_init(&sp->so_delegreturn_mutex);
 | 
			
		||||
 	return sp;
 | 
			
		||||
 }
 | 
			
		||||
@@ -1516,8 +1516,12 @@ static int nfs4_reclaim_open_state(struc
 | 
			
		||||
@@ -1519,8 +1519,12 @@ static int nfs4_reclaim_open_state(struc
 | 
			
		||||
 	 * recovering after a network partition or a reboot from a
 | 
			
		||||
 	 * server that doesn't support a grace period.
 | 
			
		||||
 	 */
 | 
			
		||||
@@ -100,7 +100,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 restart:
 | 
			
		||||
 	list_for_each_entry(state, &sp->so_states, open_states) {
 | 
			
		||||
 		if (!test_and_clear_bit(ops->state_flag_bit, &state->flags))
 | 
			
		||||
@@ -1586,14 +1590,20 @@ static int nfs4_reclaim_open_state(struc
 | 
			
		||||
@@ -1589,14 +1593,20 @@ static int nfs4_reclaim_open_state(struc
 | 
			
		||||
 		spin_lock(&sp->so_lock);
 | 
			
		||||
 		goto restart;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/kernel/trace/ring_buffer.c
 | 
			
		||||
+++ b/kernel/trace/ring_buffer.c
 | 
			
		||||
@@ -2540,61 +2540,29 @@ rb_wakeups(struct ring_buffer *buffer, s
 | 
			
		||||
@@ -2545,61 +2545,29 @@ rb_wakeups(struct ring_buffer *buffer, s
 | 
			
		||||
  * The lock and unlock are done within a preempt disable section.
 | 
			
		||||
  * The current_context per_cpu variable can only be modified
 | 
			
		||||
  * by the current task between lock and unlock. But it can
 | 
			
		||||
@@ -105,7 +105,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
@@ -2602,7 +2570,9 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
@@ -2607,7 +2575,9 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
 static __always_inline void
 | 
			
		||||
 trace_recursive_unlock(struct ring_buffer_per_cpu *cpu_buffer)
 | 
			
		||||
 {
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 struct ring_buffer_iter {
 | 
			
		||||
@@ -1382,6 +1383,16 @@ void ring_buffer_set_clock(struct ring_b
 | 
			
		||||
@@ -1387,6 +1388,16 @@ void ring_buffer_set_clock(struct ring_b
 | 
			
		||||
 	buffer->clock = clock;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -147,7 +147,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 /* Flag when events were overwritten */
 | 
			
		||||
 #define RB_MISSED_EVENTS	(1 << 31)
 | 
			
		||||
 /* Missed count stored at end */
 | 
			
		||||
@@ -2223,12 +2249,15 @@ rb_move_tail(struct ring_buffer_per_cpu
 | 
			
		||||
@@ -2228,12 +2254,15 @@ rb_move_tail(struct ring_buffer_per_cpu
 | 
			
		||||
 
 | 
			
		||||
 /* Slow path, do not inline */
 | 
			
		||||
 static noinline struct ring_buffer_event *
 | 
			
		||||
@@ -167,7 +167,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		event->time_delta = delta & TS_MASK;
 | 
			
		||||
 		event->array[0] = delta >> TS_SHIFT;
 | 
			
		||||
 	} else {
 | 
			
		||||
@@ -2271,7 +2300,9 @@ rb_update_event(struct ring_buffer_per_c
 | 
			
		||||
@@ -2276,7 +2305,9 @@ rb_update_event(struct ring_buffer_per_c
 | 
			
		||||
 	 * add it to the start of the resevered space.
 | 
			
		||||
 	 */
 | 
			
		||||
 	if (unlikely(info->add_timestamp)) {
 | 
			
		||||
@@ -178,7 +178,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		length -= RB_LEN_TIME_EXTEND;
 | 
			
		||||
 		delta = 0;
 | 
			
		||||
 	}
 | 
			
		||||
@@ -2459,7 +2490,7 @@ static __always_inline void rb_end_commi
 | 
			
		||||
@@ -2464,7 +2495,7 @@ static __always_inline void rb_end_commi
 | 
			
		||||
 
 | 
			
		||||
 static inline void rb_event_discard(struct ring_buffer_event *event)
 | 
			
		||||
 {
 | 
			
		||||
@@ -187,7 +187,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		event = skip_time_extend(event);
 | 
			
		||||
 
 | 
			
		||||
 	/* array[0] holds the actual length for the discarded event */
 | 
			
		||||
@@ -2503,10 +2534,11 @@ rb_update_write_stamp(struct ring_buffer
 | 
			
		||||
@@ -2508,10 +2539,11 @@ rb_update_write_stamp(struct ring_buffer
 | 
			
		||||
 			cpu_buffer->write_stamp =
 | 
			
		||||
 				cpu_buffer->commit_page->page->time_stamp;
 | 
			
		||||
 		else if (event->type_len == RINGBUF_TYPE_TIME_EXTEND) {
 | 
			
		||||
@@ -202,7 +202,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		} else
 | 
			
		||||
 			cpu_buffer->write_stamp += event->time_delta;
 | 
			
		||||
 	}
 | 
			
		||||
@@ -2659,7 +2691,7 @@ static struct ring_buffer_event *
 | 
			
		||||
@@ -2664,7 +2696,7 @@ static struct ring_buffer_event *
 | 
			
		||||
 	 * If this is the first commit on the page, then it has the same
 | 
			
		||||
 	 * timestamp as the page itself.
 | 
			
		||||
 	 */
 | 
			
		||||
@@ -211,7 +211,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		info->delta = 0;
 | 
			
		||||
 
 | 
			
		||||
 	/* See if we shot pass the end of this buffer page */
 | 
			
		||||
@@ -2736,8 +2768,11 @@ rb_reserve_next_event(struct ring_buffer
 | 
			
		||||
@@ -2741,8 +2773,11 @@ rb_reserve_next_event(struct ring_buffer
 | 
			
		||||
 	/* make sure this diff is calculated here */
 | 
			
		||||
 	barrier();
 | 
			
		||||
 
 | 
			
		||||
@@ -225,7 +225,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		info.delta = diff;
 | 
			
		||||
 		if (unlikely(test_time_stamp(info.delta)))
 | 
			
		||||
 			rb_handle_timestamp(cpu_buffer, &info);
 | 
			
		||||
@@ -3419,14 +3454,13 @@ rb_update_read_stamp(struct ring_buffer_
 | 
			
		||||
@@ -3424,14 +3459,13 @@ rb_update_read_stamp(struct ring_buffer_
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
 	case RINGBUF_TYPE_TIME_EXTEND:
 | 
			
		||||
@@ -243,7 +243,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
 	case RINGBUF_TYPE_DATA:
 | 
			
		||||
@@ -3450,14 +3484,13 @@ rb_update_iter_read_stamp(struct ring_bu
 | 
			
		||||
@@ -3455,14 +3489,13 @@ rb_update_iter_read_stamp(struct ring_bu
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
 	case RINGBUF_TYPE_TIME_EXTEND:
 | 
			
		||||
@@ -261,7 +261,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
 	case RINGBUF_TYPE_DATA:
 | 
			
		||||
@@ -3681,6 +3714,8 @@ rb_buffer_peek(struct ring_buffer_per_cp
 | 
			
		||||
@@ -3686,6 +3719,8 @@ rb_buffer_peek(struct ring_buffer_per_cp
 | 
			
		||||
 	struct buffer_page *reader;
 | 
			
		||||
 	int nr_loops = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -270,7 +270,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
  again:
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * We repeat when a time extend is encountered.
 | 
			
		||||
@@ -3717,12 +3752,17 @@ rb_buffer_peek(struct ring_buffer_per_cp
 | 
			
		||||
@@ -3722,12 +3757,17 @@ rb_buffer_peek(struct ring_buffer_per_cp
 | 
			
		||||
 		goto again;
 | 
			
		||||
 
 | 
			
		||||
 	case RINGBUF_TYPE_TIME_STAMP:
 | 
			
		||||
@@ -290,7 +290,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 			*ts = cpu_buffer->read_stamp + event->time_delta;
 | 
			
		||||
 			ring_buffer_normalize_time_stamp(cpu_buffer->buffer,
 | 
			
		||||
 							 cpu_buffer->cpu, ts);
 | 
			
		||||
@@ -3747,6 +3787,9 @@ rb_iter_peek(struct ring_buffer_iter *it
 | 
			
		||||
@@ -3752,6 +3792,9 @@ rb_iter_peek(struct ring_buffer_iter *it
 | 
			
		||||
 	struct ring_buffer_event *event;
 | 
			
		||||
 	int nr_loops = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -300,7 +300,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 	cpu_buffer = iter->cpu_buffer;
 | 
			
		||||
 	buffer = cpu_buffer->buffer;
 | 
			
		||||
 
 | 
			
		||||
@@ -3799,12 +3842,17 @@ rb_iter_peek(struct ring_buffer_iter *it
 | 
			
		||||
@@ -3804,12 +3847,17 @@ rb_iter_peek(struct ring_buffer_iter *it
 | 
			
		||||
 		goto again;
 | 
			
		||||
 
 | 
			
		||||
 	case RINGBUF_TYPE_TIME_STAMP:
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/kernel/trace/ring_buffer.c
 | 
			
		||||
+++ b/kernel/trace/ring_buffer.c
 | 
			
		||||
@@ -2583,29 +2583,59 @@ rb_wakeups(struct ring_buffer *buffer, s
 | 
			
		||||
@@ -2588,29 +2588,59 @@ rb_wakeups(struct ring_buffer *buffer, s
 | 
			
		||||
  * The lock and unlock are done within a preempt disable section.
 | 
			
		||||
  * The current_context per_cpu variable can only be modified
 | 
			
		||||
  * by the current task between lock and unlock. But it can
 | 
			
		||||
@@ -114,7 +114,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
@@ -2613,9 +2643,7 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
@@ -2618,9 +2648,7 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
 static __always_inline void
 | 
			
		||||
 trace_recursive_unlock(struct ring_buffer_per_cpu *cpu_buffer)
 | 
			
		||||
 {
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/kernel/trace/ring_buffer.c
 | 
			
		||||
+++ b/kernel/trace/ring_buffer.c
 | 
			
		||||
@@ -2628,8 +2628,7 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
@@ -2633,8 +2633,7 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
 		bit = RB_CTX_NORMAL;
 | 
			
		||||
 	else
 | 
			
		||||
 		bit = pc & NMI_MASK ? RB_CTX_NMI :
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 	local_t				entries_bytes;
 | 
			
		||||
 	local_t				entries;
 | 
			
		||||
 	local_t				overrun;
 | 
			
		||||
@@ -2630,10 +2631,10 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
@@ -2635,10 +2636,10 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
 		bit = pc & NMI_MASK ? RB_CTX_NMI :
 | 
			
		||||
 			pc & HARDIRQ_MASK ? RB_CTX_IRQ : RB_CTX_SOFTIRQ;
 | 
			
		||||
 
 | 
			
		||||
@@ -58,7 +58,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 	cpu_buffer->current_context = val;
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
@@ -2642,7 +2643,57 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
@@ -2647,7 +2648,57 @@ trace_recursive_lock(struct ring_buffer_
 | 
			
		||||
 static __always_inline void
 | 
			
		||||
 trace_recursive_unlock(struct ring_buffer_per_cpu *cpu_buffer)
 | 
			
		||||
 {
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
 | 
			
		||||
 | 
			
		||||
--- a/block/blk-core.c
 | 
			
		||||
+++ b/block/blk-core.c
 | 
			
		||||
@@ -3305,7 +3305,7 @@ static void queue_unplugged(struct reque
 | 
			
		||||
@@ -3307,7 +3307,7 @@ static void queue_unplugged(struct reque
 | 
			
		||||
 		blk_run_queue_async(q);
 | 
			
		||||
 	else
 | 
			
		||||
 		__blk_run_queue(q);
 | 
			
		||||
@@ -56,7 +56,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void flush_plug_callbacks(struct blk_plug *plug, bool from_schedule)
 | 
			
		||||
@@ -3353,7 +3353,6 @@ EXPORT_SYMBOL(blk_check_plugged);
 | 
			
		||||
@@ -3355,7 +3355,6 @@ EXPORT_SYMBOL(blk_check_plugged);
 | 
			
		||||
 void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
 | 
			
		||||
 {
 | 
			
		||||
 	struct request_queue *q;
 | 
			
		||||
@@ -64,7 +64,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
 | 
			
		||||
 	struct request *rq;
 | 
			
		||||
 	LIST_HEAD(list);
 | 
			
		||||
 	unsigned int depth;
 | 
			
		||||
@@ -3373,11 +3372,6 @@ void blk_flush_plug_list(struct blk_plug
 | 
			
		||||
@@ -3375,11 +3374,6 @@ void blk_flush_plug_list(struct blk_plug
 | 
			
		||||
 	q = NULL;
 | 
			
		||||
 	depth = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
 | 
			
		||||
 	while (!list_empty(&list)) {
 | 
			
		||||
 		rq = list_entry_rq(list.next);
 | 
			
		||||
 		list_del_init(&rq->queuelist);
 | 
			
		||||
@@ -3390,7 +3384,7 @@ void blk_flush_plug_list(struct blk_plug
 | 
			
		||||
@@ -3392,7 +3386,7 @@ void blk_flush_plug_list(struct blk_plug
 | 
			
		||||
 				queue_unplugged(q, depth, from_schedule);
 | 
			
		||||
 			q = rq->q;
 | 
			
		||||
 			depth = 0;
 | 
			
		||||
@@ -85,7 +85,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
 		/*
 | 
			
		||||
@@ -3417,8 +3411,6 @@ void blk_flush_plug_list(struct blk_plug
 | 
			
		||||
@@ -3419,8 +3413,6 @@ void blk_flush_plug_list(struct blk_plug
 | 
			
		||||
 	 */
 | 
			
		||||
 	if (q)
 | 
			
		||||
 		queue_unplugged(q, depth, from_schedule);
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/char/random.c
 | 
			
		||||
+++ b/drivers/char/random.c
 | 
			
		||||
@@ -1016,8 +1016,6 @@ static void add_timer_randomness(struct
 | 
			
		||||
@@ -1122,8 +1122,6 @@ static void add_timer_randomness(struct
 | 
			
		||||
 	} sample;
 | 
			
		||||
 	long delta, delta2, delta3;
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
 | 
			
		||||
 	sample.jiffies = jiffies;
 | 
			
		||||
 	sample.cycles = random_get_entropy();
 | 
			
		||||
 	sample.num = num;
 | 
			
		||||
@@ -1058,7 +1056,6 @@ static void add_timer_randomness(struct
 | 
			
		||||
@@ -1164,7 +1162,6 @@ static void add_timer_randomness(struct
 | 
			
		||||
 		 */
 | 
			
		||||
 		credit_entropy_bits(r, min_t(int, fls(delta>>1), 11));
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/arch/x86/kvm/x86.c
 | 
			
		||||
+++ b/arch/x86/kvm/x86.c
 | 
			
		||||
@@ -6148,6 +6148,13 @@ int kvm_arch_init(void *opaque)
 | 
			
		||||
@@ -6150,6 +6150,13 @@ int kvm_arch_init(void *opaque)
 | 
			
		||||
 		goto out;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/block/blk-mq.c
 | 
			
		||||
+++ b/block/blk-mq.c
 | 
			
		||||
@@ -2827,10 +2827,9 @@ static bool blk_mq_poll_hybrid_sleep(str
 | 
			
		||||
@@ -2845,10 +2845,9 @@ static bool blk_mq_poll_hybrid_sleep(str
 | 
			
		||||
 	kt = nsecs;
 | 
			
		||||
 
 | 
			
		||||
 	mode = HRTIMER_MODE_REL;
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 	timer->function = perf_mux_hrtimer_handler;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -8711,7 +8711,7 @@ static void perf_swevent_init_hrtimer(st
 | 
			
		||||
@@ -8714,7 +8714,7 @@ static void perf_swevent_init_hrtimer(st
 | 
			
		||||
 	if (!is_sampling_event(event))
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
@@ -190,7 +190,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 }
 | 
			
		||||
--- a/kernel/time/tick-sched.c
 | 
			
		||||
+++ b/kernel/time/tick-sched.c
 | 
			
		||||
@@ -1254,7 +1254,7 @@ void tick_setup_sched_timer(void)
 | 
			
		||||
@@ -1255,7 +1255,7 @@ void tick_setup_sched_timer(void)
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * Emulate tick processing via per-CPU hrtimers:
 | 
			
		||||
 	 */
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/kernel/time/alarmtimer.c
 | 
			
		||||
+++ b/kernel/time/alarmtimer.c
 | 
			
		||||
@@ -429,7 +429,7 @@ int alarm_cancel(struct alarm *alarm)
 | 
			
		||||
@@ -436,7 +436,7 @@ int alarm_cancel(struct alarm *alarm)
 | 
			
		||||
 		int ret = alarm_try_to_cancel(alarm);
 | 
			
		||||
 		if (ret >= 0)
 | 
			
		||||
 			return ret;
 | 
			
		||||
 
 | 
			
		||||
@@ -798,7 +798,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
 | 
			
		||||
 	.thread_comm		= "ksoftirqd/%u",
 | 
			
		||||
--- a/kernel/time/tick-sched.c
 | 
			
		||||
+++ b/kernel/time/tick-sched.c
 | 
			
		||||
@@ -910,14 +910,7 @@ static bool can_stop_idle_tick(int cpu,
 | 
			
		||||
@@ -911,14 +911,7 @@ static bool can_stop_idle_tick(int cpu,
 | 
			
		||||
 		return false;
 | 
			
		||||
 
 | 
			
		||||
 	if (unlikely(local_softirq_pending() && cpu_online(cpu))) {
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/tty/serial/8250/8250_port.c
 | 
			
		||||
+++ b/drivers/tty/serial/8250/8250_port.c
 | 
			
		||||
@@ -3250,10 +3250,8 @@ void serial8250_console_write(struct uar
 | 
			
		||||
@@ -3224,10 +3224,8 @@ void serial8250_console_write(struct uar
 | 
			
		||||
 
 | 
			
		||||
 	serial8250_rpm_get(up);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ fold in:
 | 
			
		||||
 #include <linux/jump_label.h>
 | 
			
		||||
 
 | 
			
		||||
 #include <asm/intel-family.h>
 | 
			
		||||
@@ -1355,7 +1356,7 @@ int memory_failure(unsigned long pfn, in
 | 
			
		||||
@@ -1353,7 +1354,7 @@ int memory_failure(unsigned long pfn, in
 | 
			
		||||
 static unsigned long check_interval = INITIAL_CHECK_INTERVAL;
 | 
			
		||||
 
 | 
			
		||||
 static DEFINE_PER_CPU(unsigned long, mce_next_interval); /* in jiffies */
 | 
			
		||||
@@ -43,7 +43,7 @@ fold in:
 | 
			
		||||
 
 | 
			
		||||
 static unsigned long mce_adjust_timer_default(unsigned long interval)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1364,27 +1365,19 @@ static unsigned long mce_adjust_timer_de
 | 
			
		||||
@@ -1362,27 +1363,19 @@ static unsigned long mce_adjust_timer_de
 | 
			
		||||
 
 | 
			
		||||
 static unsigned long (*mce_adjust_timer)(unsigned long interval) = mce_adjust_timer_default;
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ fold in:
 | 
			
		||||
 	iv = __this_cpu_read(mce_next_interval);
 | 
			
		||||
 
 | 
			
		||||
 	if (mce_available(this_cpu_ptr(&cpu_info))) {
 | 
			
		||||
@@ -1407,7 +1400,11 @@ static void mce_timer_fn(unsigned long d
 | 
			
		||||
@@ -1405,7 +1398,11 @@ static void mce_timer_fn(unsigned long d
 | 
			
		||||
 
 | 
			
		||||
 done:
 | 
			
		||||
 	__this_cpu_write(mce_next_interval, iv);
 | 
			
		||||
@@ -90,7 +90,7 @@ fold in:
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -1415,7 +1412,7 @@ static void mce_timer_fn(unsigned long d
 | 
			
		||||
@@ -1413,7 +1410,7 @@ static void mce_timer_fn(unsigned long d
 | 
			
		||||
  */
 | 
			
		||||
 void mce_timer_kick(unsigned long interval)
 | 
			
		||||
 {
 | 
			
		||||
@@ -99,7 +99,7 @@ fold in:
 | 
			
		||||
 	unsigned long iv = __this_cpu_read(mce_next_interval);
 | 
			
		||||
 
 | 
			
		||||
 	__start_timer(t, interval);
 | 
			
		||||
@@ -1430,7 +1427,7 @@ static void mce_timer_delete_all(void)
 | 
			
		||||
@@ -1428,7 +1425,7 @@ static void mce_timer_delete_all(void)
 | 
			
		||||
 	int cpu;
 | 
			
		||||
 
 | 
			
		||||
 	for_each_online_cpu(cpu)
 | 
			
		||||
@@ -108,7 +108,7 @@ fold in:
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -1759,7 +1756,7 @@ static void __mcheck_cpu_clear_vendor(st
 | 
			
		||||
@@ -1757,7 +1754,7 @@ static void __mcheck_cpu_clear_vendor(st
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ fold in:
 | 
			
		||||
 {
 | 
			
		||||
 	unsigned long iv = check_interval * HZ;
 | 
			
		||||
 
 | 
			
		||||
@@ -1772,18 +1769,19 @@ static void mce_start_timer(struct timer
 | 
			
		||||
@@ -1770,18 +1767,19 @@ static void mce_start_timer(struct timer
 | 
			
		||||
 
 | 
			
		||||
 static void __mcheck_cpu_setup_timer(void)
 | 
			
		||||
 {
 | 
			
		||||
@@ -143,7 +143,7 @@ fold in:
 | 
			
		||||
 	mce_start_timer(t);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -2302,7 +2300,7 @@ static int mce_cpu_dead(unsigned int cpu
 | 
			
		||||
@@ -2300,7 +2298,7 @@ static int mce_cpu_dead(unsigned int cpu
 | 
			
		||||
 
 | 
			
		||||
 static int mce_cpu_online(unsigned int cpu)
 | 
			
		||||
 {
 | 
			
		||||
@@ -152,7 +152,7 @@ fold in:
 | 
			
		||||
 	int ret;
 | 
			
		||||
 
 | 
			
		||||
 	mce_device_create(cpu);
 | 
			
		||||
@@ -2319,10 +2317,10 @@ static int mce_cpu_online(unsigned int c
 | 
			
		||||
@@ -2317,10 +2315,10 @@ static int mce_cpu_online(unsigned int c
 | 
			
		||||
 
 | 
			
		||||
 static int mce_cpu_pre_down(unsigned int cpu)
 | 
			
		||||
 {
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
@@ -1201,14 +1201,14 @@ static void __blk_mq_delay_run_hw_queue(
 | 
			
		||||
@@ -1219,14 +1219,14 @@ static void __blk_mq_delay_run_hw_queue(
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
 	if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,229 @@
 | 
			
		||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
Date: Thu, 3 May 2018 17:16:26 +0200
 | 
			
		||||
Subject: [PATCH] rtmutex: annotate sleeping lock context
 | 
			
		||||
 | 
			
		||||
The RCU code complains on schedule() within a rcu_readlock() section.
 | 
			
		||||
The valid scenario on -RT is if a sleeping is held. In order to suppress
 | 
			
		||||
the warning the mirgrate_disable counter was used to identify the
 | 
			
		||||
invocation of schedule() due to lock contention.
 | 
			
		||||
 | 
			
		||||
Grygorii Strashko report that during CPU hotplug we might see the
 | 
			
		||||
warning via
 | 
			
		||||
 rt_spin_lock() -> migrate_disable() -> pin_current_cpu() -> __read_rt_lock()
 | 
			
		||||
 | 
			
		||||
because the counter is not yet set.
 | 
			
		||||
It is also possible to trigger the warning from cpu_chill()
 | 
			
		||||
(seen on a kblockd_mod_delayed_work_on() caller).
 | 
			
		||||
 | 
			
		||||
To address this RCU warning I annotate the sleeping lock context. The
 | 
			
		||||
counter is incremented before migrate_disable() so the warning Grygorii
 | 
			
		||||
should not trigger anymore. Additionally I use that counter in
 | 
			
		||||
cpu_chill() to avoid the RCU warning from there.
 | 
			
		||||
 | 
			
		||||
Reported-by: Grygorii Strashko <grygorii.strashko@ti.com>
 | 
			
		||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
---
 | 
			
		||||
 include/linux/sched.h      |   20 ++++++++++++++++++++
 | 
			
		||||
 kernel/locking/rtmutex.c   |   12 ++++++++++--
 | 
			
		||||
 kernel/locking/rwlock-rt.c |   18 ++++++++++++++----
 | 
			
		||||
 kernel/rcu/tree_plugin.h   |    8 ++++----
 | 
			
		||||
 kernel/time/hrtimer.c      |    2 ++
 | 
			
		||||
 5 files changed, 50 insertions(+), 10 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/include/linux/sched.h
 | 
			
		||||
+++ b/include/linux/sched.h
 | 
			
		||||
@@ -598,6 +598,9 @@ struct task_struct {
 | 
			
		||||
 	int				migrate_disable_atomic;
 | 
			
		||||
 # endif
 | 
			
		||||
 #endif
 | 
			
		||||
+#ifdef CONFIG_PREEMPT_RT_FULL
 | 
			
		||||
+	int				sleeping_lock;
 | 
			
		||||
+#endif
 | 
			
		||||
 
 | 
			
		||||
 #ifdef CONFIG_PREEMPT_RCU
 | 
			
		||||
 	int				rcu_read_lock_nesting;
 | 
			
		||||
@@ -1708,6 +1711,23 @@ static __always_inline bool need_resched
 | 
			
		||||
 	return unlikely(tif_need_resched());
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+#ifdef CONFIG_PREEMPT_RT_FULL
 | 
			
		||||
+static inline void sleeping_lock_inc(void)
 | 
			
		||||
+{
 | 
			
		||||
+	current->sleeping_lock++;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static inline void sleeping_lock_dec(void)
 | 
			
		||||
+{
 | 
			
		||||
+	current->sleeping_lock--;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+#else
 | 
			
		||||
+
 | 
			
		||||
+static inline void sleeping_lock_inc(void) { }
 | 
			
		||||
+static inline void sleeping_lock_dec(void) { }
 | 
			
		||||
+#endif
 | 
			
		||||
+
 | 
			
		||||
 /*
 | 
			
		||||
  * Wrappers for p->thread_info->cpu access. No-op on UP.
 | 
			
		||||
  */
 | 
			
		||||
--- a/kernel/locking/rtmutex.c
 | 
			
		||||
+++ b/kernel/locking/rtmutex.c
 | 
			
		||||
@@ -1141,6 +1141,7 @@ void __sched rt_spin_lock_slowunlock(str
 | 
			
		||||
 
 | 
			
		||||
 void __lockfunc rt_spin_lock(spinlock_t *lock)
 | 
			
		||||
 {
 | 
			
		||||
+	sleeping_lock_inc();
 | 
			
		||||
 	migrate_disable();
 | 
			
		||||
 	spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
 | 
			
		||||
 	rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock);
 | 
			
		||||
@@ -1155,6 +1156,7 @@ void __lockfunc __rt_spin_lock(struct rt
 | 
			
		||||
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 | 
			
		||||
 void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass)
 | 
			
		||||
 {
 | 
			
		||||
+	sleeping_lock_inc();
 | 
			
		||||
 	migrate_disable();
 | 
			
		||||
 	spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
 | 
			
		||||
 	rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock);
 | 
			
		||||
@@ -1168,6 +1170,7 @@ void __lockfunc rt_spin_unlock(spinlock_
 | 
			
		||||
 	spin_release(&lock->dep_map, 1, _RET_IP_);
 | 
			
		||||
 	rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock);
 | 
			
		||||
 	migrate_enable();
 | 
			
		||||
+	sleeping_lock_dec();
 | 
			
		||||
 }
 | 
			
		||||
 EXPORT_SYMBOL(rt_spin_unlock);
 | 
			
		||||
 
 | 
			
		||||
@@ -1193,12 +1196,15 @@ int __lockfunc rt_spin_trylock(spinlock_
 | 
			
		||||
 {
 | 
			
		||||
 	int ret;
 | 
			
		||||
 
 | 
			
		||||
+	sleeping_lock_inc();
 | 
			
		||||
 	migrate_disable();
 | 
			
		||||
 	ret = __rt_mutex_trylock(&lock->lock);
 | 
			
		||||
-	if (ret)
 | 
			
		||||
+	if (ret) {
 | 
			
		||||
 		spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
 | 
			
		||||
-	else
 | 
			
		||||
+	} else {
 | 
			
		||||
 		migrate_enable();
 | 
			
		||||
+		sleeping_lock_dec();
 | 
			
		||||
+	}
 | 
			
		||||
 	return ret;
 | 
			
		||||
 }
 | 
			
		||||
 EXPORT_SYMBOL(rt_spin_trylock);
 | 
			
		||||
@@ -1210,6 +1216,7 @@ int __lockfunc rt_spin_trylock_bh(spinlo
 | 
			
		||||
 	local_bh_disable();
 | 
			
		||||
 	ret = __rt_mutex_trylock(&lock->lock);
 | 
			
		||||
 	if (ret) {
 | 
			
		||||
+		sleeping_lock_inc();
 | 
			
		||||
 		migrate_disable();
 | 
			
		||||
 		spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
 | 
			
		||||
 	} else
 | 
			
		||||
@@ -1225,6 +1232,7 @@ int __lockfunc rt_spin_trylock_irqsave(s
 | 
			
		||||
 	*flags = 0;
 | 
			
		||||
 	ret = __rt_mutex_trylock(&lock->lock);
 | 
			
		||||
 	if (ret) {
 | 
			
		||||
+		sleeping_lock_inc();
 | 
			
		||||
 		migrate_disable();
 | 
			
		||||
 		spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
 | 
			
		||||
 	}
 | 
			
		||||
--- a/kernel/locking/rwlock-rt.c
 | 
			
		||||
+++ b/kernel/locking/rwlock-rt.c
 | 
			
		||||
@@ -305,12 +305,15 @@ int __lockfunc rt_read_trylock(rwlock_t
 | 
			
		||||
 {
 | 
			
		||||
 	int ret;
 | 
			
		||||
 
 | 
			
		||||
+	sleeping_lock_inc();
 | 
			
		||||
 	migrate_disable();
 | 
			
		||||
 	ret = do_read_rt_trylock(rwlock);
 | 
			
		||||
-	if (ret)
 | 
			
		||||
+	if (ret) {
 | 
			
		||||
 		rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_);
 | 
			
		||||
-	else
 | 
			
		||||
+	} else {
 | 
			
		||||
 		migrate_enable();
 | 
			
		||||
+		sleeping_lock_dec();
 | 
			
		||||
+	}
 | 
			
		||||
 	return ret;
 | 
			
		||||
 }
 | 
			
		||||
 EXPORT_SYMBOL(rt_read_trylock);
 | 
			
		||||
@@ -319,18 +322,22 @@ int __lockfunc rt_write_trylock(rwlock_t
 | 
			
		||||
 {
 | 
			
		||||
 	int ret;
 | 
			
		||||
 
 | 
			
		||||
+	sleeping_lock_inc();
 | 
			
		||||
 	migrate_disable();
 | 
			
		||||
 	ret = do_write_rt_trylock(rwlock);
 | 
			
		||||
-	if (ret)
 | 
			
		||||
+	if (ret) {
 | 
			
		||||
 		rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_);
 | 
			
		||||
-	else
 | 
			
		||||
+	} else {
 | 
			
		||||
 		migrate_enable();
 | 
			
		||||
+		sleeping_lock_dec();
 | 
			
		||||
+	}
 | 
			
		||||
 	return ret;
 | 
			
		||||
 }
 | 
			
		||||
 EXPORT_SYMBOL(rt_write_trylock);
 | 
			
		||||
 
 | 
			
		||||
 void __lockfunc rt_read_lock(rwlock_t *rwlock)
 | 
			
		||||
 {
 | 
			
		||||
+	sleeping_lock_inc();
 | 
			
		||||
 	migrate_disable();
 | 
			
		||||
 	rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_);
 | 
			
		||||
 	do_read_rt_lock(rwlock);
 | 
			
		||||
@@ -339,6 +346,7 @@ EXPORT_SYMBOL(rt_read_lock);
 | 
			
		||||
 
 | 
			
		||||
 void __lockfunc rt_write_lock(rwlock_t *rwlock)
 | 
			
		||||
 {
 | 
			
		||||
+	sleeping_lock_inc();
 | 
			
		||||
 	migrate_disable();
 | 
			
		||||
 	rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_);
 | 
			
		||||
 	do_write_rt_lock(rwlock);
 | 
			
		||||
@@ -350,6 +358,7 @@ void __lockfunc rt_read_unlock(rwlock_t
 | 
			
		||||
 	rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
 | 
			
		||||
 	do_read_rt_unlock(rwlock);
 | 
			
		||||
 	migrate_enable();
 | 
			
		||||
+	sleeping_lock_dec();
 | 
			
		||||
 }
 | 
			
		||||
 EXPORT_SYMBOL(rt_read_unlock);
 | 
			
		||||
 
 | 
			
		||||
@@ -358,6 +367,7 @@ void __lockfunc rt_write_unlock(rwlock_t
 | 
			
		||||
 	rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
 | 
			
		||||
 	do_write_rt_unlock(rwlock);
 | 
			
		||||
 	migrate_enable();
 | 
			
		||||
+	sleeping_lock_dec();
 | 
			
		||||
 }
 | 
			
		||||
 EXPORT_SYMBOL(rt_write_unlock);
 | 
			
		||||
 
 | 
			
		||||
--- a/kernel/rcu/tree_plugin.h
 | 
			
		||||
+++ b/kernel/rcu/tree_plugin.h
 | 
			
		||||
@@ -324,13 +324,13 @@ static void rcu_preempt_note_context_swi
 | 
			
		||||
 	struct task_struct *t = current;
 | 
			
		||||
 	struct rcu_data *rdp;
 | 
			
		||||
 	struct rcu_node *rnp;
 | 
			
		||||
-	int mg_counter = 0;
 | 
			
		||||
+	int sleeping_l = 0;
 | 
			
		||||
 
 | 
			
		||||
 	RCU_LOCKDEP_WARN(!irqs_disabled(), "rcu_preempt_note_context_switch() invoked with interrupts enabled!!!\n");
 | 
			
		||||
-#if defined(CONFIG_PREEMPT_RT_BASE)
 | 
			
		||||
-	mg_counter = t->migrate_disable;
 | 
			
		||||
+#if defined(CONFIG_PREEMPT_RT_FULL)
 | 
			
		||||
+	sleeping_l = t->sleeping_lock;
 | 
			
		||||
 #endif
 | 
			
		||||
-	WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0 && !mg_counter);
 | 
			
		||||
+	WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0 && !sleeping_l);
 | 
			
		||||
 	if (t->rcu_read_lock_nesting > 0 &&
 | 
			
		||||
 	    !t->rcu_read_unlock_special.b.blocked) {
 | 
			
		||||
 
 | 
			
		||||
--- a/kernel/time/hrtimer.c
 | 
			
		||||
+++ b/kernel/time/hrtimer.c
 | 
			
		||||
@@ -1870,7 +1870,9 @@ void cpu_chill(void)
 | 
			
		||||
 	chill_time = ktime_set(0, NSEC_PER_MSEC);
 | 
			
		||||
 	set_current_state(TASK_UNINTERRUPTIBLE);
 | 
			
		||||
 	current->flags |= PF_NOFREEZE;
 | 
			
		||||
+	sleeping_lock_inc();
 | 
			
		||||
 	schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD);
 | 
			
		||||
+	sleeping_lock_dec();
 | 
			
		||||
 	if (!freeze_flag)
 | 
			
		||||
 		current->flags &= ~PF_NOFREEZE;
 | 
			
		||||
 }
 | 
			
		||||
@@ -83,7 +83,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * Init percpu_ref in atomic mode so that it's faster to shutdown.
 | 
			
		||||
@@ -3623,6 +3633,8 @@ int __init blk_dev_init(void)
 | 
			
		||||
@@ -3625,6 +3635,8 @@ int __init blk_dev_init(void)
 | 
			
		||||
 	if (!kblockd_workqueue)
 | 
			
		||||
 		panic("Failed to create kblockd\n");
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
 | 
			
		||||
 #include <linux/kmod.h>
 | 
			
		||||
 #include <linux/slab.h>
 | 
			
		||||
 #include <linux/vmalloc.h>
 | 
			
		||||
@@ -700,7 +701,7 @@ static void prb_retire_rx_blk_timer_expi
 | 
			
		||||
@@ -707,7 +708,7 @@ static void prb_retire_rx_blk_timer_expi
 | 
			
		||||
 	if (BLOCK_NUM_PKTS(pbd)) {
 | 
			
		||||
 		while (atomic_read(&pkc->blk_fill_in_prog)) {
 | 
			
		||||
 			/* Waiting for skb_copy_bits to finish... */
 | 
			
		||||
@@ -32,7 +32,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -962,7 +963,7 @@ static void prb_retire_current_block(str
 | 
			
		||||
@@ -969,7 +970,7 @@ static void prb_retire_current_block(str
 | 
			
		||||
 		if (!(status & TP_STATUS_BLK_TMO)) {
 | 
			
		||||
 			while (atomic_read(&pkc->blk_fill_in_prog)) {
 | 
			
		||||
 				/* Waiting for skb_copy_bits to finish... */
 | 
			
		||||
@@ -91,7 +91,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 		/*
 | 
			
		||||
--- a/fs/namei.c
 | 
			
		||||
+++ b/fs/namei.c
 | 
			
		||||
@@ -1626,7 +1626,7 @@ static struct dentry *lookup_slow(const
 | 
			
		||||
@@ -1627,7 +1627,7 @@ static struct dentry *lookup_slow(const
 | 
			
		||||
 {
 | 
			
		||||
 	struct dentry *dentry = ERR_PTR(-ENOENT), *old;
 | 
			
		||||
 	struct inode *inode = dir->d_inode;
 | 
			
		||||
@@ -100,7 +100,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 
 | 
			
		||||
 	inode_lock_shared(inode);
 | 
			
		||||
 	/* Don't go there if it's already dead */
 | 
			
		||||
@@ -3099,7 +3099,7 @@ static int lookup_open(struct nameidata
 | 
			
		||||
@@ -3100,7 +3100,7 @@ static int lookup_open(struct nameidata
 | 
			
		||||
 	struct dentry *dentry;
 | 
			
		||||
 	int error, create_error = 0;
 | 
			
		||||
 	umode_t mode = op->mode;
 | 
			
		||||
@@ -151,7 +151,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 	spin_lock(&dentry->d_lock);
 | 
			
		||||
--- a/fs/proc/base.c
 | 
			
		||||
+++ b/fs/proc/base.c
 | 
			
		||||
@@ -1878,7 +1878,7 @@ bool proc_fill_cache(struct file *file,
 | 
			
		||||
@@ -1880,7 +1880,7 @@ bool proc_fill_cache(struct file *file,
 | 
			
		||||
 
 | 
			
		||||
 	child = d_hash_and_lookup(dir, &qname);
 | 
			
		||||
 	if (!child) {
 | 
			
		||||
@@ -80,7 +80,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex);
 | 
			
		||||
--- a/include/linux/sched.h
 | 
			
		||||
+++ b/include/linux/sched.h
 | 
			
		||||
@@ -1113,6 +1113,9 @@ struct task_struct {
 | 
			
		||||
@@ -1116,6 +1116,9 @@ struct task_struct {
 | 
			
		||||
 #ifdef CONFIG_DEBUG_ATOMIC_SLEEP
 | 
			
		||||
 	unsigned long			task_state_change;
 | 
			
		||||
 #endif
 | 
			
		||||
@@ -22,7 +22,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 | 
			
		||||
--- a/virt/kvm/arm/arm.c
 | 
			
		||||
+++ b/virt/kvm/arm/arm.c
 | 
			
		||||
@@ -646,7 +646,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
 | 
			
		||||
@@ -651,7 +651,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
 | 
			
		||||
 		 * involves poking the GIC, which must be done in a
 | 
			
		||||
 		 * non-preemptible context.
 | 
			
		||||
 		 */
 | 
			
		||||
@@ -31,7 +31,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 
 | 
			
		||||
 		kvm_pmu_flush_hwstate(vcpu);
 | 
			
		||||
 
 | 
			
		||||
@@ -683,7 +683,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
 | 
			
		||||
@@ -688,7 +688,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
 | 
			
		||||
 			kvm_pmu_sync_hwstate(vcpu);
 | 
			
		||||
 			kvm_timer_sync_hwstate(vcpu);
 | 
			
		||||
 			kvm_vgic_sync_hwstate(vcpu);
 | 
			
		||||
@@ -40,7 +40,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | 
			
		||||
 			continue;
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
@@ -738,7 +738,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
 | 
			
		||||
@@ -743,7 +743,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
 | 
			
		||||
 
 | 
			
		||||
 		kvm_vgic_sync_hwstate(vcpu);
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ Jason.
 | 
			
		||||
 #include <linux/uaccess.h>
 | 
			
		||||
 #include <linux/pm_runtime.h>
 | 
			
		||||
 #include <linux/ktime.h>
 | 
			
		||||
@@ -3252,6 +3253,8 @@ void serial8250_console_write(struct uar
 | 
			
		||||
@@ -3226,6 +3227,8 @@ void serial8250_console_write(struct uar
 | 
			
		||||
 
 | 
			
		||||
 	if (port->sysrq || oops_in_progress)
 | 
			
		||||
 		locked = 0;
 | 
			
		||||
@@ -229,7 +229,7 @@ Link: http://lkml.kernel.org/r/1311842631.5890.208.camel@twins
 | 
			
		||||
 
 | 
			
		||||
 /* task_struct member predeclarations (sorted alphabetically): */
 | 
			
		||||
 struct audit_context;
 | 
			
		||||
@@ -1110,6 +1111,12 @@ struct task_struct {
 | 
			
		||||
@@ -1113,6 +1114,12 @@ struct task_struct {
 | 
			
		||||
 	int				softirq_nestcnt;
 | 
			
		||||
 	unsigned int			softirqs_raised;
 | 
			
		||||
 #endif
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user