linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ben Hutchings <ben@decadent.org.uk>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: akpm@linux-foundation.org, "Jiri Olsa" <jolsa@redhat.com>,
	"Linus Torvalds" <torvalds@linux-foundation.org>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	"Ingo Molnar" <mingo@kernel.org>,
	"Arnaldo Carvalho de Melo" <acme@kernel.org>,
	"Peter Zijlstra" <peterz@infradead.org>
Subject: [PATCH 3.2 112/126] perf: Fix event->ctx locking
Date: Wed, 15 Feb 2017 22:41:34 +0000	[thread overview]
Message-ID: <lsq.1487198494.492710234@decadent.org.uk> (raw)
In-Reply-To: <lsq.1487198490.691915840@decadent.org.uk>

3.2.85-rc1 review patch.  If anyone has any objections, please let me know.

------------------

From: Peter Zijlstra <peterz@infradead.org>

commit f63a8daa5812afef4f06c962351687e1ff9ccb2b upstream.

There have been a few reported issues wrt. the lack of locking around
changing event->ctx. This patch tries to address those.

It avoids the whole rwsem thing; and while it appears to work, please
give it some thought in review.

What I did fail at is sensible runtime checks on the use of
event->ctx, the RCU use makes it very hard.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/20150123125834.209535886@infradead.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
[bwh: Backported to 3.2:
 - We don't have perf_pmu_migrate_context()
 - Adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -665,6 +665,76 @@ static void put_ctx(struct perf_event_co
 	}
 }
 
+/*
+ * Because of perf_event::ctx migration in sys_perf_event_open::move_group we
+ * need some magic.
+ *
+ * Those places that change perf_event::ctx will hold both
+ * perf_event_ctx::mutex of the 'old' and 'new' ctx value.
+ *
+ * Lock ordering is by mutex address. There is one other site where
+ * perf_event_context::mutex nests and that is put_event(). But remember that
+ * that is a parent<->child context relation, and migration does not affect
+ * children, therefore these two orderings should not interact.
+ *
+ * The change in perf_event::ctx does not affect children (as claimed above)
+ * because the sys_perf_event_open() case will install a new event and break
+ * the ctx parent<->child relation.
+ *
+ * The places that change perf_event::ctx will issue:
+ *
+ *   perf_remove_from_context();
+ *   synchronize_rcu();
+ *   perf_install_in_context();
+ *
+ * to affect the change. The remove_from_context() + synchronize_rcu() should
+ * quiesce the event, after which we can install it in the new location. This
+ * means that only external vectors (perf_fops, prctl) can perturb the event
+ * while in transit. Therefore all such accessors should also acquire
+ * perf_event_context::mutex to serialize against this.
+ *
+ * However; because event->ctx can change while we're waiting to acquire
+ * ctx->mutex we must be careful and use the below perf_event_ctx_lock()
+ * function.
+ *
+ * Lock order:
+ *	task_struct::perf_event_mutex
+ *	  perf_event_context::mutex
+ *	    perf_event_context::lock
+ *	    perf_event::child_mutex;
+ *	    perf_event::mmap_mutex
+ *	    mmap_sem
+ */
+static struct perf_event_context *perf_event_ctx_lock(struct perf_event *event)
+{
+	struct perf_event_context *ctx;
+
+again:
+	rcu_read_lock();
+	ctx = ACCESS_ONCE(event->ctx);
+	if (!atomic_inc_not_zero(&ctx->refcount)) {
+		rcu_read_unlock();
+		goto again;
+	}
+	rcu_read_unlock();
+
+	mutex_lock(&ctx->mutex);
+	if (event->ctx != ctx) {
+		mutex_unlock(&ctx->mutex);
+		put_ctx(ctx);
+		goto again;
+	}
+
+	return ctx;
+}
+
+static void perf_event_ctx_unlock(struct perf_event *event,
+				  struct perf_event_context *ctx)
+{
+	mutex_unlock(&ctx->mutex);
+	put_ctx(ctx);
+}
+
 static void unclone_ctx(struct perf_event_context *ctx)
 {
 	if (ctx->parent_ctx) {
@@ -1325,7 +1395,7 @@ static int __perf_event_disable(void *in
  * is the current context on this CPU and preemption is disabled,
  * hence we can't get into perf_event_task_sched_out for this context.
  */
-void perf_event_disable(struct perf_event *event)
+static void _perf_event_disable(struct perf_event *event)
 {
 	struct perf_event_context *ctx = event->ctx;
 	struct task_struct *task = ctx->task;
@@ -1367,6 +1437,19 @@ retry:
 	raw_spin_unlock_irq(&ctx->lock);
 }
 
+/*
+ * Strictly speaking kernel users cannot create groups and therefore this
+ * interface does not need the perf_event_ctx_lock() magic.
+ */
+void perf_event_disable(struct perf_event *event)
+{
+	struct perf_event_context *ctx;
+
+	ctx = perf_event_ctx_lock(event);
+	_perf_event_disable(event);
+	perf_event_ctx_unlock(event, ctx);
+}
+
 static void perf_set_shadow_time(struct perf_event *event,
 				 struct perf_event_context *ctx,
 				 u64 tstamp)
@@ -1813,7 +1896,7 @@ unlock:
  * perf_event_for_each_child or perf_event_for_each as described
  * for perf_event_disable.
  */
-void perf_event_enable(struct perf_event *event)
+static void _perf_event_enable(struct perf_event *event)
 {
 	struct perf_event_context *ctx = event->ctx;
 	struct task_struct *task = ctx->task;
@@ -1870,7 +1953,19 @@ out:
 	raw_spin_unlock_irq(&ctx->lock);
 }
 
-int perf_event_refresh(struct perf_event *event, int refresh)
+/*
+ * See perf_event_disable();
+ */
+void perf_event_enable(struct perf_event *event)
+{
+	struct perf_event_context *ctx;
+
+	ctx = perf_event_ctx_lock(event);
+	_perf_event_enable(event);
+	perf_event_ctx_unlock(event, ctx);
+}
+
+static int _perf_event_refresh(struct perf_event *event, int refresh)
 {
 	/*
 	 * not supported on inherited events
@@ -1879,10 +1974,25 @@ int perf_event_refresh(struct perf_event
 		return -EINVAL;
 
 	atomic_add(refresh, &event->event_limit);
-	perf_event_enable(event);
+	_perf_event_enable(event);
 
 	return 0;
 }
+
+/*
+ * See perf_event_disable()
+ */
+int perf_event_refresh(struct perf_event *event, int refresh)
+{
+	struct perf_event_context *ctx;
+	int ret;
+
+	ctx = perf_event_ctx_lock(event);
+	ret = _perf_event_refresh(event, refresh);
+	perf_event_ctx_unlock(event, ctx);
+
+	return ret;
+}
 EXPORT_SYMBOL_GPL(perf_event_refresh);
 
 static void ctx_sched_out(struct perf_event_context *ctx,
@@ -3110,7 +3220,16 @@ static void put_event(struct perf_event
 	rcu_read_unlock();
 
 	if (owner) {
-		mutex_lock(&owner->perf_event_mutex);
+		/*
+		 * If we're here through perf_event_exit_task() we're already
+		 * holding ctx->mutex which would be an inversion wrt. the
+		 * normal lock order.
+		 *
+		 * However we can safely take this lock because its the child
+		 * ctx->mutex.
+		 */
+		mutex_lock_nested(&owner->perf_event_mutex, SINGLE_DEPTH_NESTING);
+
 		/*
 		 * We have to re-check the event->owner field, if it is cleared
 		 * we raced with perf_event_exit_task(), acquiring the mutex
@@ -3162,12 +3281,13 @@ static int perf_event_read_group(struct
 				   u64 read_format, char __user *buf)
 {
 	struct perf_event *leader = event->group_leader, *sub;
-	int n = 0, size = 0, ret = -EFAULT;
 	struct perf_event_context *ctx = leader->ctx;
-	u64 values[5];
+	int n = 0, size = 0, ret;
 	u64 count, enabled, running;
+	u64 values[5];
+
+	lockdep_assert_held(&ctx->mutex);
 
-	mutex_lock(&ctx->mutex);
 	count = perf_event_read_value(leader, &enabled, &running);
 
 	values[n++] = 1 + leader->nr_siblings;
@@ -3182,7 +3302,7 @@ static int perf_event_read_group(struct
 	size = n * sizeof(u64);
 
 	if (copy_to_user(buf, values, size))
-		goto unlock;
+		return -EFAULT;
 
 	ret = size;
 
@@ -3196,14 +3316,11 @@ static int perf_event_read_group(struct
 		size = n * sizeof(u64);
 
 		if (copy_to_user(buf + ret, values, size)) {
-			ret = -EFAULT;
-			goto unlock;
+			return -EFAULT;
 		}
 
 		ret += size;
 	}
-unlock:
-	mutex_unlock(&ctx->mutex);
 
 	return ret;
 }
@@ -3262,8 +3379,14 @@ static ssize_t
 perf_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 {
 	struct perf_event *event = file->private_data;
+	struct perf_event_context *ctx;
+	int ret;
 
-	return perf_read_hw(event, buf, count);
+	ctx = perf_event_ctx_lock(event);
+	ret = perf_read_hw(event, buf, count);
+	perf_event_ctx_unlock(event, ctx);
+
+	return ret;
 }
 
 static unsigned int perf_poll(struct file *file, poll_table *wait)
@@ -3287,7 +3410,7 @@ static unsigned int perf_poll(struct fil
 	return events;
 }
 
-static void perf_event_reset(struct perf_event *event)
+static void _perf_event_reset(struct perf_event *event)
 {
 	(void)perf_event_read(event);
 	local64_set(&event->count, 0);
@@ -3306,6 +3429,7 @@ static void perf_event_for_each_child(st
 	struct perf_event *child;
 
 	WARN_ON_ONCE(event->ctx->parent_ctx);
+
 	mutex_lock(&event->child_mutex);
 	func(event);
 	list_for_each_entry(child, &event->child_list, child_list)
@@ -3319,15 +3443,14 @@ static void perf_event_for_each(struct p
 	struct perf_event_context *ctx = event->ctx;
 	struct perf_event *sibling;
 
-	WARN_ON_ONCE(ctx->parent_ctx);
-	mutex_lock(&ctx->mutex);
+	lockdep_assert_held(&ctx->mutex);
+
 	event = event->group_leader;
 
 	perf_event_for_each_child(event, func);
 	func(event);
 	list_for_each_entry(sibling, &event->sibling_list, group_entry)
 		perf_event_for_each_child(sibling, func);
-	mutex_unlock(&ctx->mutex);
 }
 
 static int perf_event_period(struct perf_event *event, u64 __user *arg)
@@ -3386,25 +3509,24 @@ static int perf_event_set_output(struct
 				 struct perf_event *output_event);
 static int perf_event_set_filter(struct perf_event *event, void __user *arg);
 
-static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned long arg)
 {
-	struct perf_event *event = file->private_data;
 	void (*func)(struct perf_event *);
 	u32 flags = arg;
 
 	switch (cmd) {
 	case PERF_EVENT_IOC_ENABLE:
-		func = perf_event_enable;
+		func = _perf_event_enable;
 		break;
 	case PERF_EVENT_IOC_DISABLE:
-		func = perf_event_disable;
+		func = _perf_event_disable;
 		break;
 	case PERF_EVENT_IOC_RESET:
-		func = perf_event_reset;
+		func = _perf_event_reset;
 		break;
 
 	case PERF_EVENT_IOC_REFRESH:
-		return perf_event_refresh(event, arg);
+		return _perf_event_refresh(event, arg);
 
 	case PERF_EVENT_IOC_PERIOD:
 		return perf_event_period(event, (u64 __user *)arg);
@@ -3445,6 +3567,19 @@ static long perf_ioctl(struct file *file
 	return 0;
 }
 
+static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+	struct perf_event *event = file->private_data;
+	struct perf_event_context *ctx;
+	long ret;
+
+	ctx = perf_event_ctx_lock(event);
+	ret = _perf_ioctl(event, cmd, arg);
+	perf_event_ctx_unlock(event, ctx);
+
+	return ret;
+}
+
 #ifdef CONFIG_COMPAT
 static long perf_compat_ioctl(struct file *file, unsigned int cmd,
 				unsigned long arg)
@@ -3466,11 +3601,15 @@ static long perf_compat_ioctl(struct fil
 
 int perf_event_task_enable(void)
 {
+	struct perf_event_context *ctx;
 	struct perf_event *event;
 
 	mutex_lock(&current->perf_event_mutex);
-	list_for_each_entry(event, &current->perf_event_list, owner_entry)
-		perf_event_for_each_child(event, perf_event_enable);
+	list_for_each_entry(event, &current->perf_event_list, owner_entry) {
+		ctx = perf_event_ctx_lock(event);
+		perf_event_for_each_child(event, _perf_event_enable);
+		perf_event_ctx_unlock(event, ctx);
+	}
 	mutex_unlock(&current->perf_event_mutex);
 
 	return 0;
@@ -3478,11 +3617,15 @@ int perf_event_task_enable(void)
 
 int perf_event_task_disable(void)
 {
+	struct perf_event_context *ctx;
 	struct perf_event *event;
 
 	mutex_lock(&current->perf_event_mutex);
-	list_for_each_entry(event, &current->perf_event_list, owner_entry)
-		perf_event_for_each_child(event, perf_event_disable);
+	list_for_each_entry(event, &current->perf_event_list, owner_entry) {
+		ctx = perf_event_ctx_lock(event);
+		perf_event_for_each_child(event, _perf_event_disable);
+		perf_event_ctx_unlock(event, ctx);
+	}
 	mutex_unlock(&current->perf_event_mutex);
 
 	return 0;
@@ -6322,6 +6465,15 @@ out:
 	return ret;
 }
 
+static void mutex_lock_double(struct mutex *a, struct mutex *b)
+{
+	if (b < a)
+		swap(a, b);
+
+	mutex_lock(a);
+	mutex_lock_nested(b, SINGLE_DEPTH_NESTING);
+}
+
 /**
  * sys_perf_event_open - open a performance event, associate it to a task/cpu
  *
@@ -6337,7 +6489,7 @@ SYSCALL_DEFINE5(perf_event_open,
 	struct perf_event *group_leader = NULL, *output_event = NULL;
 	struct perf_event *event, *sibling;
 	struct perf_event_attr attr;
-	struct perf_event_context *ctx;
+	struct perf_event_context *ctx, *uninitialized_var(gctx);
 	struct file *event_file = NULL;
 	struct file *group_file = NULL;
 	struct task_struct *task = NULL;
@@ -6509,9 +6661,14 @@ SYSCALL_DEFINE5(perf_event_open,
 	}
 
 	if (move_group) {
-		struct perf_event_context *gctx = group_leader->ctx;
+		gctx = group_leader->ctx;
+
+		/*
+		 * See perf_event_ctx_lock() for comments on the details
+		 * of swizzling perf_event::ctx.
+		 */
+		mutex_lock_double(&gctx->mutex, &ctx->mutex);
 
-		mutex_lock(&gctx->mutex);
 		perf_remove_from_context(group_leader, false);
 
 		/*
@@ -6526,14 +6683,19 @@ SYSCALL_DEFINE5(perf_event_open,
 			perf_event__state_init(sibling);
 			put_ctx(gctx);
 		}
-		mutex_unlock(&gctx->mutex);
-		put_ctx(gctx);
+	} else {
+		mutex_lock(&ctx->mutex);
 	}
 
 	WARN_ON_ONCE(ctx->parent_ctx);
-	mutex_lock(&ctx->mutex);
 
 	if (move_group) {
+		/*
+		 * Wait for everybody to stop referencing the events through
+		 * the old lists, before installing it on new lists.
+		 */
+		synchronize_rcu();
+
 		perf_install_in_context(ctx, group_leader, cpu);
 		get_ctx(ctx);
 		list_for_each_entry(sibling, &group_leader->sibling_list,
@@ -6546,6 +6708,11 @@ SYSCALL_DEFINE5(perf_event_open,
 	perf_install_in_context(ctx, event, cpu);
 	++ctx->generation;
 	perf_unpin_context(ctx);
+
+	if (move_group) {
+		mutex_unlock(&gctx->mutex);
+		put_ctx(gctx);
+	}
 	mutex_unlock(&ctx->mutex);
 
 	event->owner = current;

  parent reply	other threads:[~2017-02-15 23:40 UTC|newest]

Thread overview: 136+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-15 22:41 [PATCH 3.2 000/126] 3.2.85-rc1 review Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 013/126] rtlwifi: Update regulatory database Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 061/126] vt: clear selection before resizing Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 085/126] Fix USB CB/CBI storage devices with CONFIG_VMAP_STACK=y Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 003/126] zfcp: fix ELS/GS request&response length for hardware data router Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 081/126] rtnl: reset calcit fptr in rtnl_unregister() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 006/126] zfcp: restore: Dont use 0 to indicate invalid LUN in rec trace Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 107/126] perf: Fix race in swevent hash Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 122/126] Fix potential infoleak in older kernels Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 069/126] usb: gadget: u_ether: remove interrupt throttling Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 016/126] [media] cx231xx: don't return error on success Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 054/126] hv: do not lose pending heartbeat vmbus packets Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 053/126] scsi: megaraid_sas: Fix data integrity failure for JBOD (passthrough) devices Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 062/126] netfilter: nf_conntrack_sip: extend request line validation Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 119/126] rose: limit sk_filter trim to payload Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 113/126] perf: Do not double free Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 102/126] ser_gigaset: return -ENOMEM on error instead of success Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 124/126] sg_write()/bsg_write() is not fit to be called under KERNEL_DS Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 050/126] powerpc: Convert cmp to cmpd in idle enter sequence Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 097/126] tipc: check minimum bearer MTU Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 083/126] coredump: fix unfreezable coredumping task Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 026/126] net/mlx4_core: Fix deadlock when switching between polling and event fw commands Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 091/126] mwifiex: printk() overflow with 32-byte SSIDs Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 104/126] ARM: dma-mapping: don't allow DMA mappings to be marked executable Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 101/126] can: raw: raw_setsockopt: limit number of can_filter that can be set Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 030/126] USB: serial: cp210x: Add ID for a Juniper console Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 040/126] powerpc/64: Fix incorrect return value from __copy_tofrom_user Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 007/126] zfcp: trace on request for open and close of WKA port Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 100/126] fuse: fix clearing suid, sgid for chown() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 035/126] s390/con3270: fix insufficient space padding Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 109/126] tty: Prevent ldisc drivers from re-using stale tty fields Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 066/126] net/mlx4_en: Process all completions in RX rings after port goes up Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 037/126] fuse: fix killing s[ug]id in setattr Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 021/126] iommu/amd: Free domain id when free a domain of struct dma_ops_domain Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 043/126] scsi: zfcp: spin_lock_irqsave() is not nestable Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 098/126] net: ping: check minimum size on ICMP header length Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 080/126] scsi: megaraid_sas: fix macro MEGASAS_IS_LOGICAL to avoid regression Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 056/126] scsi: scsi_debug: Fix memory leak if LBP enabled and module is unloaded Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 126/126] ALSA: pcm : Call kill_fasync() in stream lock Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 024/126] ALSA: ali5451: Fix out-of-bound position reporting Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 084/126] dib0700: fix nec repeat handling Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 117/126] fbdev: color map copying bounds checking Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 036/126] fuse: invalidate dir dentry after chmod Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 017/126] [media] cx231xx: fix GPIOs for Pixelview SBTVD hybrid Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 051/126] ACPI / APEI: Fix incorrect return value of ghes_proc() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 060/126] tty: limit terminal size to 4M chars Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 005/126] zfcp: retain trace level for SCSI and HBA FSF response records Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 048/126] xhci: add restart quirk for Intel Wildcatpoint PCH Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 041/126] scsi: Fix use-after-free Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 052/126] dm table: fix missing dm_put_target_type() in dm_table_add_target() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 063/126] lib/genalloc.c: start search from start of chunk Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 123/126] sctp: validate chunk len before actually using it Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 023/126] powerpc/nvram: Fix an incorrect partition merge Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 078/126] USB: serial: ftdi_sio: add support for TI CC3200 LaunchPad Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 045/126] Input: i8042 - add XMG C504 to keyboard reset table Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 059/126] tty: vt, fix bogus division in csi_J Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 031/126] NFSv4: Open state recovery must account for file permission changes Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 073/126] firewire: net: fix fragmented datagram_size off-by-one Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 049/126] batman-adv: fix splat on disabling an interface Ben Hutchings
2017-02-16  6:56   ` Linus Lüssing
2017-02-16 16:05     ` Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 103/126] net: cleanups in sock_setsockopt() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 018/126] ext4: reinforce check of i_dtime when clearing high fields of uid and gid Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 094/126] KVM: x86: drop error recovery in em_jmp_far and em_ret_far Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 034/126] s390/con3270: fix use of uninitialised data Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 033/126] ext4: release bh in make_indexed_dir Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 027/126] ALSA: usb-audio: Extend DragonFly dB scale quirk to cover other variants Ben Hutchings
2017-02-15 22:41 ` Ben Hutchings [this message]
2017-02-15 22:41 ` [PATCH 3.2 001/126] fbdev/efifb: Fix 16 color palette entry calculation Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 032/126] powerpc/vdso64: Use double word compare on pointers Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 009/126] zfcp: fix D_ID field with actual value on tracing SAN responses Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 002/126] zfcp: fix fc_host port_type with NPIV Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 064/126] KVM: x86: fix wbinvd_dirty_mask use-after-free Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 116/126] HID: core: prevent out-of-bound readings Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 075/126] HID: usbhid: add ATEN CS962 to list of quirky devices Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 076/126] ipv6: dccp: add missing bind_conflict to dccp_ipv6_mapped Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 058/126] ALSA: usb-audio: Add quirk for Syntek STK1160 Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 095/126] locking/rtmutex: Prevent dequeue vs. unlock race Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 120/126] dccp: limit sk_filter trim to payload Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 118/126] net: Add __sock_queue_rcv_skb() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 096/126] packet: fix race condition in packet_set_ring Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 105/126] [media] media: info leak in __media_device_enum_links() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 108/126] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 029/126] mmc: block: don't use CMD23 with very old MMC cards Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 125/126] net: avoid signed overflows for SO_{SND|RCV}BUFFORCE Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 019/126] reiserfs: Unlock superblock before calling reiserfs_quota_on_mount() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 093/126] ext4: sanity check the block and cluster size at mount time Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 071/126] ip6_tunnel: Clear IP6CB in ip6tunnel_xmit() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 077/126] i2c: core: fix NULL pointer dereference under race condition Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 010/126] zfcp: fix payload trace length for SAN request&response Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 086/126] igmp: do not remove igmp souce list info when set link down Ben Hutchings
2017-02-16  1:42   ` Hangbin Liu
2017-02-16 16:03     ` Ben Hutchings
2017-03-06 19:00     ` Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 028/126] regulator: tps65910: Work around silicon erratum SWCZ010 Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 079/126] mmc: mxs: Initialize the spinlock prior to using it Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 055/126] staging: iio: ad5933: avoid uninitialized variable in error case Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 110/126] perf: Fix perf_event_for_each() to use sibling Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 092/126] KVM: Disable irq while unregistering user notifier Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 067/126] ipv6: Don't use ufo handling on later transformed packets Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 044/126] isofs: Do not return EACCES for unknown filesystems Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 014/126] rtlwifi: Fix missing country code for Great Britain Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 046/126] ubifs: Fix xattr_names length in exit paths Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 065/126] ubifs: Fix regression in ubifs_readdir() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 011/126] zfcp: trace full payload of all SAN records (req,resp,iels) Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 020/126] sctp: do not return the transmit err back to sctp_sendmsg Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 106/126] sg: Fix double-free when drives detach during SG_IO Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 111/126] lockdep: Silence warning if CONFIG_LOCKDEP isn't set Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 004/126] zfcp: close window with unblocked rport during rport gone Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 070/126] uwb: fix device reference leaks Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 088/126] USB: serial: cp210x: add ID for the Zone DPMX Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 087/126] mfd: core: Fix device reference leak in mfd_clone_cell Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 042/126] mac80211: discard multicast and 4-addr A-MSDUs Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 068/126] can: bcm: fix warning in bcm_connect/proc_register Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 074/126] HID: usbhid: Add HID_QUIRK_NOGET for Aten DVI KVM switch Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 039/126] crypto: gcm - Fix IV buffer size in crypto_gcm_setkey Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 114/126] perf/core: Fix concurrent sys_perf_event_open() vs. 'move_group' race Ben Hutchings
2017-02-21  0:46   ` Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 047/126] ubifs: Abort readdir upon error Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 008/126] zfcp: restore tracing of handle for port and LUN with HBA records Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 115/126] block: fix use-after-free in sys_ioprio_get() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 082/126] swapfile: fix memory corruption via malformed swapfile Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 090/126] IB/mlx4: Fix create CQ error flow Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 057/126] scsi: arcmsr: Send SYNCHRONIZE_CACHE command to firmware Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 022/126] scsi: ibmvfc: Fix I/O hang when port is not mapped Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 121/126] tcp: take care of truncations done by sk_filter() Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 015/126] [media] mb86a20s: fix the locking logic Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 089/126] IB/uverbs: Fix leak of XRC target QPs Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 038/126] fuse: listxattr: verify xattr list Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 072/126] parisc: Ensure consistent state when switching to kernel stack at syscall entry Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 025/126] usb: misc: legousbtower: Fix NULL pointer deference Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 099/126] net: ep93xx_eth: Do not crash unloading module Ben Hutchings
2017-02-15 22:41 ` [PATCH 3.2 012/126] netfilter: restart search if moved to other chain Ben Hutchings
2017-02-16  0:06 ` [PATCH 3.2 000/126] 3.2.85-rc1 review Ben Hutchings
2017-02-16  5:59 ` Guenter Roeck
2017-02-16 15:56   ` Ben Hutchings

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=lsq.1487198494.492710234@decadent.org.uk \
    --to=ben@decadent.org.uk \
    --cc=acme@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).