4.14.172-rt78
Subsystems (8)
Hello RT Folks!
I'm pleased to announce the 4.14.172-rt78 stable release.
You can get this release via the git tree at:
git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git
branch: v4.14-rt
Head SHA1: 5c41599ad817e04c88d08a46941fbeafdf778e3d
Or to build 4.14.172-rt78 directly, the following patches should be applied:
https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.xz
https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.14.172.xz
https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/patch-4.14.172-rt78.patch.xz
You can also build from 4.14.172-rt77 by applying the incremental patch:
https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/incr/patch-4.14.172-rt77-rt78.patch.xz
Enjoy!
Tom
Changes from v4.14.172-rt77:
---
Matt Fleming (1):
mm/memcontrol: Move misplaced local_unlock_irqrestore()
Scott Wood (2):
sched: migrate_enable: Use per-cpu cpu_stop_work
sched: migrate_enable: Remove __schedule() call
Sebastian Andrzej Siewior (4):
userfaultfd: Use a seqlock instead of seqcount
locallock: Include header for the `current' macro drm/vmwgfx: Drop preempt_disable() in vmw_fifo_ping_host()
tracing: make preempt_lazy and migrate_disable counter smaller
Tom Zanussi (1):
Linux 4.14.172-rt78 --- drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | 2 -- fs/userfaultfd.c | 12 ++++++------ include/linux/locallock.h | 1 + include/linux/trace_events.h | 3 +-- kernel/sched/core.c | 23 ++++++++++++++--------- kernel/trace/trace_events.c | 4 ++-- localversion-rt | 2 +- mm/memcontrol.c | 2 +- 8 files changed, 26 insertions(+), 23 deletions(-)
---
drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +0 -2
@@ -167,10 +167,8 @@ void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason) {u32 *fifo_mem = dev_priv->mmio_virt; -preempt_disable ();if (cmpxchg (fifo_mem +SVGA_FIFO_BUSY ,0 ,1 ) ==0 )vmw_write (dev_priv,SVGA_REG_SYNC , reason); -preempt_enable (); }void vmw_fifo_release (struct vmw_private *dev_priv,struct vmw_fifo_state *fifo)
fs/userfaultfd.c +6 -6
@@ -51,7 +51,7 @@ struct userfaultfd_ctx {/* waitqueue head for events */ wait_queue_head_t event_wqh;/* a refile sequence protected by fault_pending_wqh lock */ -struct seqcount refile_seq; +seqlock_t refile_seq;/* pseudo fd refcounting */ atomic_t refcount;/* userfaultfd syscall flags */
@@ -1047,7 +1047,7 @@ static ssize_t userfaultfd_ctx_read(struct userfaultfd_ctx *ctx, int no_wait,* waitqueue could become empty if this is the * only userfault. */ -write_seqcount_begin (&ctx->refile_seq); +write_seqlock (&ctx->refile_seq);/* * The fault_pending_wqh.lock prevents the uwq
@@ -1073,7 +1073,7 @@ static ssize_t userfaultfd_ctx_read(struct userfaultfd_ctx *ctx, int no_wait,list_del (&uwq->wq.entry);__add_wait_queue (&ctx->fault_wqh, &uwq->wq); -write_seqcount_end (&ctx->refile_seq); +write_sequnlock (&ctx->refile_seq);/* careful to always initialize msg if ret == 0 */ *msg = uwq->msg;
@@ -1246,11 +1246,11 @@ static __always_inline void wake_userfault(struct userfaultfd_ctx *ctx,* sure we've userfaults to wake. */ do { - seq =read_seqcount_begin (&ctx->refile_seq); + seq =read_seqbegin (&ctx->refile_seq); need_wakeup =waitqueue_active (&ctx->fault_pending_wqh) ||waitqueue_active (&ctx->fault_wqh);cond_resched (); - }while (read_seqcount_retry (&ctx->refile_seq, seq)); + }while (read_seqretry (&ctx->refile_seq, seq));if (need_wakeup)__wake_userfault (ctx, range); }
@@ -1915,7 +1915,7 @@ static void init_once_userfaultfd_ctx(void *mem)init_waitqueue_head (&ctx->fault_wqh);init_waitqueue_head (&ctx->event_wqh);init_waitqueue_head (&ctx->fd_wqh); -seqcount_init (&ctx->refile_seq); +seqlock_init (&ctx->refile_seq); }/**
include/linux/locallock.h +1 -0
@@ -3,6 +3,7 @@#include <linux/percpu.h> #include <linux/spinlock.h> +#include <asm/current.h> #ifdef CONFIG_PREEMPT_RT_BASE
include/linux/trace_events.h +1 -2
@@ -62,8 +62,7 @@ struct trace_entry {unsigned char flags;unsigned char preempt_count;int pid; -unsigned short migrate_disable; -unsigned short padding; +unsigned char migrate_disable;unsigned char preempt_lazy_count; };
kernel/sched/core.c +14 -9
@@ -6964,6 +6964,9 @@ static void migrate_disabled_sched(struct task_struct *p) p->migrate_disable_scheduled =1 ; } +static DEFINE_PER_CPU(struct cpu_stop_work, migrate_work); +static DEFINE_PER_CPU(struct migration_arg, migrate_arg); +void migrate_enable (void ) {struct task_struct *p = current;
@@ -7002,23 +7005,25 @@ void migrate_enable(void)WARN_ON (smp_processor_id () != cpu);if (!is_cpu_allowed (p, cpu)) { -struct migration_arg arg = { .task = p }; -struct cpu_stop_work work; +struct migration_arg __percpu *arg; +struct cpu_stop_work __percpu *work;struct rq_flags rf; + work =this_cpu_ptr (&migrate_work); + arg =this_cpu_ptr (&migrate_arg); +WARN_ON_ONCE (!arg->done && !work->disabled && work->arg); + + arg->task = p; + arg->done = false; + rq =task_rq_lock (p, &rf);update_rq_clock (rq); - arg.dest_cpu =select_fallback_rq (cpu, p); + arg->dest_cpu =select_fallback_rq (cpu, p);task_rq_unlock (rq, p, &rf);stop_one_cpu_nowait (task_cpu (p), migration_cpu_stop, - &arg, &work); + arg, work);tlb_migrate_finish (p->mm); -__schedule (true); -if (!work.disabled) { -while (!arg.done) -cpu_relax (); - } } out:
kernel/trace/trace_events.c +2 -2
@@ -187,8 +187,8 @@ static int trace_define_common_fields(void) __common_field(unsigned char, flags); __common_field(unsigned char, preempt_count);__common_field (int, pid); - __common_field(unsigned short, migrate_disable); - __common_field(unsigned short, padding); + __common_field(unsigned char, migrate_disable); + __common_field(unsigned char, preempt_lazy_count);return ret; }
localversion-rt +1 -1
@@ -1 +1 @@ --rt77 +-rt78
mm/memcontrol.c +1 -1
@@ -6102,10 +6102,10 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry)mem_cgroup_charge_statistics (memcg, page,PageTransHuge (page), -nr_entries);memcg_check_events (memcg, page); +local_unlock_irqrestore (event_lock, flags);if (!mem_cgroup_is_root (memcg))css_put_many (&memcg->css, nr_entries); -local_unlock_irqrestore (event_lock, flags); }/**