LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events
@ 2015-03-09 11:20 Philipp Zabel
  2015-03-09 18:13 ` Mark Brown
  2015-03-19 19:18 ` Steven Rostedt
  0 siblings, 2 replies; 7+ messages in thread
From: Philipp Zabel @ 2015-03-09 11:20 UTC (permalink / raw)
  To: Mark Brown
  Cc: Pankaj Dubey, Steven Rostedt, Ingo Molnar, linux-kernel, kernel,
	Philipp Zabel

This patch fixes a NULL pointer dereference when enabling regmap event
tracing in the presence of a syscon regmap, introduced by commit bdb0066df96e
("mfd: syscon: Decouple syscon interface from platform devices").
That patch introduced syscon regmaps that have their dev field set to NULL.
The regmap trace events expect it to point to a valid struct device and feed
it to dev_name():

  $ echo 1 > /sys/kernel/debug/tracing/events/regmap/enable

  Unable to handle kernel NULL pointer dereference at virtual address 0000002c
  pgd = 80004000
  [0000002c] *pgd=00000000
  Internal error: Oops: 17 [#1] SMP ARM
  Modules linked in: coda videobuf2_vmalloc
  CPU: 0 PID: 304 Comm: kworker/0:2 Not tainted 4.0.0-rc2+ #9197
  Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
  Workqueue: events_freezable thermal_zone_device_check
  task: 9f25a200 ti: 9f1ee000 task.ti: 9f1ee000
  PC is at ftrace_raw_event_regmap_block+0x3c/0xe4
  LR is at _regmap_raw_read+0x1bc/0x1cc
  pc : [<803636e8>]    lr : [<80365f2c>]    psr: 600f0093
  sp : 9f1efd78  ip : 9f1efdb8  fp : 9f1efdb4
  r10: 00000004  r9 : 00000001  r8 : 00000001
  r7 : 00000180  r6 : 00000000  r5 : 9f00e3c0  r4 : 00000003
  r3 : 00000001  r2 : 00000180  r1 : 00000000  r0 : 9f00e3c0
  Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
  Control: 10c5387d  Table: 2d91004a  DAC: 00000015
  Process kworker/0:2 (pid: 304, stack limit = 0x9f1ee210)
  Stack: (0x9f1efd78 to 0x9f1f0000)
  fd60:                                                       9f1efda4 9f1efd88
  fd80: 800708c0 805f9510 80927140 800f0013 9f1fc800 9eb2f490 00000000 00000180
  fda0: 808e3840 00000001 9f1efdfc 9f1efdb8 80365f2c 803636b8 805f8958 800708e0
  fdc0: a00f0013 803636ac 9f16de00 00000180 80927140 9f1fc800 9f1fc800 9f1efe6c
  fde0: 9f1efe6c 9f732400 00000000 00000000 9f1efe1c 9f1efe00 80365f70 80365d7c
  fe00: 80365f3c 9f1fc800 9f1fc800 00000180 9f1efe44 9f1efe20 803656a4 80365f48
  fe20: 9f1fc800 00000180 9f1efe6c 9f1efe6c 9f732400 00000000 9f1efe64 9f1efe48
  fe40: 803657bc 80365634 00000001 9e95f910 9f1fc800 9f1efeb4 9f1efe8c 9f1efe68
  fe60: 80452ac0 80365778 9f1efe8c 9f1efe78 9e93d400 9e93d5e8 9f1efeb4 9f72ef40
  fe80: 9f1efeac 9f1efe90 8044e11c 80452998 8045298c 9e93d608 9e93d400 808e1978
  fea0: 9f1efecc 9f1efeb0 8044fd14 8044e0d0 ffffffff 9f25a200 9e93d608 9e481380
  fec0: 9f1efedc 9f1efed0 8044fde8 8044fcec 9f1eff1c 9f1efee0 80038d50 8044fdd8
  fee0: 9f1ee020 9f72ef40 9e481398 00000000 00000008 9f72ef54 9f1ee020 9f72ef40
  ff00: 9e481398 9e481380 00000008 9f72ef40 9f1eff5c 9f1eff20 80039754 80038bfc
  ff20: 00000000 9e481380 80894100 808e1662 00000000 9e4f2ec0 00000000 9e481380
  ff40: 800396f8 00000000 00000000 00000000 9f1effac 9f1eff60 8003e020 80039704
  ff60: ffffffff 00000000 ffffffff 9e481380 00000000 00000000 9f1eff78 9f1eff78
  ff80: 00000000 00000000 9f1eff88 9f1eff88 9e4f2ec0 8003df30 00000000 00000000
  ffa0: 00000000 9f1effb0 8000eb60 8003df3c 00000000 00000000 00000000 00000000
  ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  ffe0: 00000000 00000000 00000000 00000000 00000013 00000000 ffffffff ffffffff
  Backtrace:
  [<803636ac>] (ftrace_raw_event_regmap_block) from [<80365f2c>] (_regmap_raw_read+0x1bc/0x1cc)
   r9:00000001 r8:808e3840 r7:00000180 r6:00000000 r5:9eb2f490 r4:9f1fc800
  [<80365d70>] (_regmap_raw_read) from [<80365f70>] (_regmap_bus_read+0x34/0x6c)
   r10:00000000 r9:00000000 r8:9f732400 r7:9f1efe6c r6:9f1efe6c r5:9f1fc800
   r4:9f1fc800
  [<80365f3c>] (_regmap_bus_read) from [<803656a4>] (_regmap_read+0x7c/0x144)
   r6:00000180 r5:9f1fc800 r4:9f1fc800 r3:80365f3c
  [<80365628>] (_regmap_read) from [<803657bc>] (regmap_read+0x50/0x70)
   r9:00000000 r8:9f732400 r7:9f1efe6c r6:9f1efe6c r5:00000180 r4:9f1fc800
  [<8036576c>] (regmap_read) from [<80452ac0>] (imx_get_temp+0x134/0x1a4)
   r6:9f1efeb4 r5:9f1fc800 r4:9e95f910 r3:00000001
  [<8045298c>] (imx_get_temp) from [<8044e11c>] (thermal_zone_get_temp+0x58/0x74)
   r7:9f72ef40 r6:9f1efeb4 r5:9e93d5e8 r4:9e93d400
  [<8044e0c4>] (thermal_zone_get_temp) from [<8044fd14>] (thermal_zone_device_update+0x34/0xec)
   r6:808e1978 r5:9e93d400 r4:9e93d608 r3:8045298c
  [<8044fce0>] (thermal_zone_device_update) from [<8044fde8>] (thermal_zone_device_check+0x1c/0x20)
   r5:9e481380 r4:9e93d608
  [<8044fdcc>] (thermal_zone_device_check) from [<80038d50>] (process_one_work+0x160/0x3d4)
  [<80038bf0>] (process_one_work) from [<80039754>] (worker_thread+0x5c/0x4f4)
   r10:9f72ef40 r9:00000008 r8:9e481380 r7:9e481398 r6:9f72ef40 r5:9f1ee020
   r4:9f72ef54
  [<800396f8>] (worker_thread) from [<8003e020>] (kthread+0xf0/0x108)
   r10:00000000 r9:00000000 r8:00000000 r7:800396f8 r6:9e481380 r5:00000000
   r4:9e4f2ec0
  [<8003df30>] (kthread) from [<8000eb60>] (ret_from_fork+0x14/0x34)
   r7:00000000 r6:00000000 r5:8003df30 r4:9e4f2ec0
  Code: e3140040 1a00001a e3140020 1a000016 (e596002c)
  ---[ end trace 193c15c2494ec960 ]---

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
Changes since v1:
 - Include drivers/base/regmap/internal.h in include/trace/events/regmap.h
   instead of relying on regmap.c and regcache.c to include "internal.h"
   before <trace/events/regmap.h>.
---
 drivers/base/regmap/internal.h |   8 +++
 drivers/base/regmap/regcache.c |  16 +++---
 drivers/base/regmap/regmap.c   |  32 +++++------
 include/trace/events/regmap.h  | 123 ++++++++++++++++++++---------------------
 4 files changed, 91 insertions(+), 88 deletions(-)

diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h
index beb8b27..a13587b 100644
--- a/drivers/base/regmap/internal.h
+++ b/drivers/base/regmap/internal.h
@@ -243,4 +243,12 @@ extern struct regcache_ops regcache_rbtree_ops;
 extern struct regcache_ops regcache_lzo_ops;
 extern struct regcache_ops regcache_flat_ops;
 
+static inline const char *regmap_name(const struct regmap *map)
+{
+	if (map->dev)
+		return dev_name(map->dev);
+
+	return map->name;
+}
+
 #endif
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c
index f373c35..f5db662 100644
--- a/drivers/base/regmap/regcache.c
+++ b/drivers/base/regmap/regcache.c
@@ -218,7 +218,7 @@ int regcache_read(struct regmap *map,
 		ret = map->cache_ops->read(map, reg, value);
 
 		if (ret == 0)
-			trace_regmap_reg_read_cache(map->dev, reg, *value);
+			trace_regmap_reg_read_cache(map, reg, *value);
 
 		return ret;
 	}
@@ -311,7 +311,7 @@ int regcache_sync(struct regmap *map)
 	dev_dbg(map->dev, "Syncing %s cache\n",
 		map->cache_ops->name);
 	name = map->cache_ops->name;
-	trace_regcache_sync(map->dev, name, "start");
+	trace_regcache_sync(map, name, "start");
 
 	if (!map->cache_dirty)
 		goto out;
@@ -346,7 +346,7 @@ out:
 
 	regmap_async_complete(map);
 
-	trace_regcache_sync(map->dev, name, "stop");
+	trace_regcache_sync(map, name, "stop");
 
 	return ret;
 }
@@ -381,7 +381,7 @@ int regcache_sync_region(struct regmap *map, unsigned int min,
 	name = map->cache_ops->name;
 	dev_dbg(map->dev, "Syncing %s cache from %d-%d\n", name, min, max);
 
-	trace_regcache_sync(map->dev, name, "start region");
+	trace_regcache_sync(map, name, "start region");
 
 	if (!map->cache_dirty)
 		goto out;
@@ -401,7 +401,7 @@ out:
 
 	regmap_async_complete(map);
 
-	trace_regcache_sync(map->dev, name, "stop region");
+	trace_regcache_sync(map, name, "stop region");
 
 	return ret;
 }
@@ -428,7 +428,7 @@ int regcache_drop_region(struct regmap *map, unsigned int min,
 
 	map->lock(map->lock_arg);
 
-	trace_regcache_drop_region(map->dev, min, max);
+	trace_regcache_drop_region(map, min, max);
 
 	ret = map->cache_ops->drop(map, min, max);
 
@@ -455,7 +455,7 @@ void regcache_cache_only(struct regmap *map, bool enable)
 	map->lock(map->lock_arg);
 	WARN_ON(map->cache_bypass && enable);
 	map->cache_only = enable;
-	trace_regmap_cache_only(map->dev, enable);
+	trace_regmap_cache_only(map, enable);
 	map->unlock(map->lock_arg);
 }
 EXPORT_SYMBOL_GPL(regcache_cache_only);
@@ -493,7 +493,7 @@ void regcache_cache_bypass(struct regmap *map, bool enable)
 	map->lock(map->lock_arg);
 	WARN_ON(map->cache_only && enable);
 	map->cache_bypass = enable;
-	trace_regmap_cache_bypass(map->dev, enable);
+	trace_regmap_cache_bypass(map, enable);
 	map->unlock(map->lock_arg);
 }
 EXPORT_SYMBOL_GPL(regcache_cache_bypass);
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index f99b098..dbfe6a6 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -1281,7 +1281,7 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
 	if (map->async && map->bus->async_write) {
 		struct regmap_async *async;
 
-		trace_regmap_async_write_start(map->dev, reg, val_len);
+		trace_regmap_async_write_start(map, reg, val_len);
 
 		spin_lock_irqsave(&map->async_lock, flags);
 		async = list_first_entry_or_null(&map->async_free,
@@ -1339,8 +1339,7 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
 		return ret;
 	}
 
-	trace_regmap_hw_write_start(map->dev, reg,
-				    val_len / map->format.val_bytes);
+	trace_regmap_hw_write_start(map, reg, val_len / map->format.val_bytes);
 
 	/* If we're doing a single register write we can probably just
 	 * send the work_buf directly, otherwise try to do a gather
@@ -1372,8 +1371,7 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
 		kfree(buf);
 	}
 
-	trace_regmap_hw_write_done(map->dev, reg,
-				   val_len / map->format.val_bytes);
+	trace_regmap_hw_write_done(map, reg, val_len / map->format.val_bytes);
 
 	return ret;
 }
@@ -1407,12 +1405,12 @@ static int _regmap_bus_formatted_write(void *context, unsigned int reg,
 
 	map->format.format_write(map, reg, val);
 
-	trace_regmap_hw_write_start(map->dev, reg, 1);
+	trace_regmap_hw_write_start(map, reg, 1);
 
 	ret = map->bus->write(map->bus_context, map->work_buf,
 			      map->format.buf_size);
 
-	trace_regmap_hw_write_done(map->dev, reg, 1);
+	trace_regmap_hw_write_done(map, reg, 1);
 
 	return ret;
 }
@@ -1470,7 +1468,7 @@ int _regmap_write(struct regmap *map, unsigned int reg,
 		dev_info(map->dev, "%x <= %x\n", reg, val);
 #endif
 
-	trace_regmap_reg_write(map->dev, reg, val);
+	trace_regmap_reg_write(map, reg, val);
 
 	return map->reg_write(context, reg, val);
 }
@@ -1773,7 +1771,7 @@ static int _regmap_raw_multi_reg_write(struct regmap *map,
 	for (i = 0; i < num_regs; i++) {
 		int reg = regs[i].reg;
 		int val = regs[i].def;
-		trace_regmap_hw_write_start(map->dev, reg, 1);
+		trace_regmap_hw_write_start(map, reg, 1);
 		map->format.format_reg(u8, reg, map->reg_shift);
 		u8 += reg_bytes + pad_bytes;
 		map->format.format_val(u8, val, 0);
@@ -1788,7 +1786,7 @@ static int _regmap_raw_multi_reg_write(struct regmap *map,
 
 	for (i = 0; i < num_regs; i++) {
 		int reg = regs[i].reg;
-		trace_regmap_hw_write_done(map->dev, reg, 1);
+		trace_regmap_hw_write_done(map, reg, 1);
 	}
 	return ret;
 }
@@ -2059,15 +2057,13 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
 	 */
 	u8[0] |= map->read_flag_mask;
 
-	trace_regmap_hw_read_start(map->dev, reg,
-				   val_len / map->format.val_bytes);
+	trace_regmap_hw_read_start(map, reg, val_len / map->format.val_bytes);
 
 	ret = map->bus->read(map->bus_context, map->work_buf,
 			     map->format.reg_bytes + map->format.pad_bytes,
 			     val, val_len);
 
-	trace_regmap_hw_read_done(map->dev, reg,
-				  val_len / map->format.val_bytes);
+	trace_regmap_hw_read_done(map, reg, val_len / map->format.val_bytes);
 
 	return ret;
 }
@@ -2123,7 +2119,7 @@ static int _regmap_read(struct regmap *map, unsigned int reg,
 			dev_info(map->dev, "%x => %x\n", reg, *val);
 #endif
 
-		trace_regmap_reg_read(map->dev, reg, *val);
+		trace_regmap_reg_read(map, reg, *val);
 
 		if (!map->cache_bypass)
 			regcache_write(map, reg, *val);
@@ -2480,7 +2476,7 @@ void regmap_async_complete_cb(struct regmap_async *async, int ret)
 	struct regmap *map = async->map;
 	bool wake;
 
-	trace_regmap_async_io_complete(map->dev);
+	trace_regmap_async_io_complete(map);
 
 	spin_lock(&map->async_lock);
 	list_move(&async->list, &map->async_free);
@@ -2525,7 +2521,7 @@ int regmap_async_complete(struct regmap *map)
 	if (!map->bus || !map->bus->async_write)
 		return 0;
 
-	trace_regmap_async_complete_start(map->dev);
+	trace_regmap_async_complete_start(map);
 
 	wait_event(map->async_waitq, regmap_async_is_done(map));
 
@@ -2534,7 +2530,7 @@ int regmap_async_complete(struct regmap *map)
 	map->async_ret = 0;
 	spin_unlock_irqrestore(&map->async_lock, flags);
 
-	trace_regmap_async_complete_done(map->dev);
+	trace_regmap_async_complete_done(map);
 
 	return ret;
 }
diff --git a/include/trace/events/regmap.h b/include/trace/events/regmap.h
index 23d5615..22317d2 100644
--- a/include/trace/events/regmap.h
+++ b/include/trace/events/regmap.h
@@ -7,27 +7,26 @@
 #include <linux/ktime.h>
 #include <linux/tracepoint.h>
 
-struct device;
-struct regmap;
+#include "../../../drivers/base/regmap/internal.h"
 
 /*
  * Log register events
  */
 DECLARE_EVENT_CLASS(regmap_reg,
 
-	TP_PROTO(struct device *dev, unsigned int reg,
+	TP_PROTO(struct regmap *map, unsigned int reg,
 		 unsigned int val),
 
-	TP_ARGS(dev, reg, val),
+	TP_ARGS(map, reg, val),
 
 	TP_STRUCT__entry(
-		__string(	name,		dev_name(dev)	)
-		__field(	unsigned int,	reg		)
-		__field(	unsigned int,	val		)
+		__string(	name,		regmap_name(map)	)
+		__field(	unsigned int,	reg			)
+		__field(	unsigned int,	val			)
 	),
 
 	TP_fast_assign(
-		__assign_str(name, dev_name(dev));
+		__assign_str(name, regmap_name(map));
 		__entry->reg = reg;
 		__entry->val = val;
 	),
@@ -39,45 +38,45 @@ DECLARE_EVENT_CLASS(regmap_reg,
 
 DEFINE_EVENT(regmap_reg, regmap_reg_write,
 
-	TP_PROTO(struct device *dev, unsigned int reg,
+	TP_PROTO(struct regmap *map, unsigned int reg,
 		 unsigned int val),
 
-	TP_ARGS(dev, reg, val)
+	TP_ARGS(map, reg, val)
 
 );
 
 DEFINE_EVENT(regmap_reg, regmap_reg_read,
 
-	TP_PROTO(struct device *dev, unsigned int reg,
+	TP_PROTO(struct regmap *map, unsigned int reg,
 		 unsigned int val),
 
-	TP_ARGS(dev, reg, val)
+	TP_ARGS(map, reg, val)
 
 );
 
 DEFINE_EVENT(regmap_reg, regmap_reg_read_cache,
 
-	TP_PROTO(struct device *dev, unsigned int reg,
+	TP_PROTO(struct regmap *map, unsigned int reg,
 		 unsigned int val),
 
-	TP_ARGS(dev, reg, val)
+	TP_ARGS(map, reg, val)
 
 );
 
 DECLARE_EVENT_CLASS(regmap_block,
 
-	TP_PROTO(struct device *dev, unsigned int reg, int count),
+	TP_PROTO(struct regmap *map, unsigned int reg, int count),
 
-	TP_ARGS(dev, reg, count),
+	TP_ARGS(map, reg, count),
 
 	TP_STRUCT__entry(
-		__string(	name,		dev_name(dev)	)
-		__field(	unsigned int,	reg		)
-		__field(	int,		count		)
+		__string(	name,		regmap_name(map)	)
+		__field(	unsigned int,	reg			)
+		__field(	int,		count			)
 	),
 
 	TP_fast_assign(
-		__assign_str(name, dev_name(dev));
+		__assign_str(name, regmap_name(map));
 		__entry->reg = reg;
 		__entry->count = count;
 	),
@@ -89,48 +88,48 @@ DECLARE_EVENT_CLASS(regmap_block,
 
 DEFINE_EVENT(regmap_block, regmap_hw_read_start,
 
-	TP_PROTO(struct device *dev, unsigned int reg, int count),
+	TP_PROTO(struct regmap *map, unsigned int reg, int count),
 
-	TP_ARGS(dev, reg, count)
+	TP_ARGS(map, reg, count)
 );
 
 DEFINE_EVENT(regmap_block, regmap_hw_read_done,
 
-	TP_PROTO(struct device *dev, unsigned int reg, int count),
+	TP_PROTO(struct regmap *map, unsigned int reg, int count),
 
-	TP_ARGS(dev, reg, count)
+	TP_ARGS(map, reg, count)
 );
 
 DEFINE_EVENT(regmap_block, regmap_hw_write_start,
 
-	TP_PROTO(struct device *dev, unsigned int reg, int count),
+	TP_PROTO(struct regmap *map, unsigned int reg, int count),
 
-	TP_ARGS(dev, reg, count)
+	TP_ARGS(map, reg, count)
 );
 
 DEFINE_EVENT(regmap_block, regmap_hw_write_done,
 
-	TP_PROTO(struct device *dev, unsigned int reg, int count),
+	TP_PROTO(struct regmap *map, unsigned int reg, int count),
 
-	TP_ARGS(dev, reg, count)
+	TP_ARGS(map, reg, count)
 );
 
 TRACE_EVENT(regcache_sync,
 
-	TP_PROTO(struct device *dev, const char *type,
+	TP_PROTO(struct regmap *map, const char *type,
 		 const char *status),
 
-	TP_ARGS(dev, type, status),
+	TP_ARGS(map, type, status),
 
 	TP_STRUCT__entry(
-		__string(       name,           dev_name(dev)   )
-		__string(	status,		status		)
-		__string(	type,		type		)
-		__field(	int,		type		)
+		__string(       name,           regmap_name(map)	)
+		__string(	status,		status			)
+		__string(	type,		type			)
+		__field(	int,		type			)
 	),
 
 	TP_fast_assign(
-		__assign_str(name, dev_name(dev));
+		__assign_str(name, regmap_name(map));
 		__assign_str(status, status);
 		__assign_str(type, type);
 	),
@@ -141,17 +140,17 @@ TRACE_EVENT(regcache_sync,
 
 DECLARE_EVENT_CLASS(regmap_bool,
 
-	TP_PROTO(struct device *dev, bool flag),
+	TP_PROTO(struct regmap *map, bool flag),
 
-	TP_ARGS(dev, flag),
+	TP_ARGS(map, flag),
 
 	TP_STRUCT__entry(
-		__string(	name,		dev_name(dev)	)
-		__field(	int,		flag		)
+		__string(	name,		regmap_name(map)	)
+		__field(	int,		flag			)
 	),
 
 	TP_fast_assign(
-		__assign_str(name, dev_name(dev));
+		__assign_str(name, regmap_name(map));
 		__entry->flag = flag;
 	),
 
@@ -161,32 +160,32 @@ DECLARE_EVENT_CLASS(regmap_bool,
 
 DEFINE_EVENT(regmap_bool, regmap_cache_only,
 
-	TP_PROTO(struct device *dev, bool flag),
+	TP_PROTO(struct regmap *map, bool flag),
 
-	TP_ARGS(dev, flag)
+	TP_ARGS(map, flag)
 
 );
 
 DEFINE_EVENT(regmap_bool, regmap_cache_bypass,
 
-	TP_PROTO(struct device *dev, bool flag),
+	TP_PROTO(struct regmap *map, bool flag),
 
-	TP_ARGS(dev, flag)
+	TP_ARGS(map, flag)
 
 );
 
 DECLARE_EVENT_CLASS(regmap_async,
 
-	TP_PROTO(struct device *dev),
+	TP_PROTO(struct regmap *map),
 
-	TP_ARGS(dev),
+	TP_ARGS(map),
 
 	TP_STRUCT__entry(
-		__string(	name,		dev_name(dev)	)
+		__string(	name,		regmap_name(map)	)
 	),
 
 	TP_fast_assign(
-		__assign_str(name, dev_name(dev));
+		__assign_str(name, regmap_name(map));
 	),
 
 	TP_printk("%s", __get_str(name))
@@ -194,50 +193,50 @@ DECLARE_EVENT_CLASS(regmap_async,
 
 DEFINE_EVENT(regmap_block, regmap_async_write_start,
 
-	TP_PROTO(struct device *dev, unsigned int reg, int count),
+	TP_PROTO(struct regmap *map, unsigned int reg, int count),
 
-	TP_ARGS(dev, reg, count)
+	TP_ARGS(map, reg, count)
 );
 
 DEFINE_EVENT(regmap_async, regmap_async_io_complete,
 
-	TP_PROTO(struct device *dev),
+	TP_PROTO(struct regmap *map),
 
-	TP_ARGS(dev)
+	TP_ARGS(map)
 
 );
 
 DEFINE_EVENT(regmap_async, regmap_async_complete_start,
 
-	TP_PROTO(struct device *dev),
+	TP_PROTO(struct regmap *map),
 
-	TP_ARGS(dev)
+	TP_ARGS(map)
 
 );
 
 DEFINE_EVENT(regmap_async, regmap_async_complete_done,
 
-	TP_PROTO(struct device *dev),
+	TP_PROTO(struct regmap *map),
 
-	TP_ARGS(dev)
+	TP_ARGS(map)
 
 );
 
 TRACE_EVENT(regcache_drop_region,
 
-	TP_PROTO(struct device *dev, unsigned int from,
+	TP_PROTO(struct regmap *map, unsigned int from,
 		 unsigned int to),
 
-	TP_ARGS(dev, from, to),
+	TP_ARGS(map, from, to),
 
 	TP_STRUCT__entry(
-		__string(       name,           dev_name(dev)   )
-		__field(	unsigned int,	from		)
-		__field(	unsigned int,	to		)
+		__string(       name,           regmap_name(map)	)
+		__field(	unsigned int,	from			)
+		__field(	unsigned int,	to			)
 	),
 
 	TP_fast_assign(
-		__assign_str(name, dev_name(dev));
+		__assign_str(name, regmap_name(map));
 		__entry->from = from;
 		__entry->to = to;
 	),
-- 
2.1.4


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events
  2015-03-09 11:20 [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events Philipp Zabel
@ 2015-03-09 18:13 ` Mark Brown
  2015-03-19 19:22   ` Steven Rostedt
  2015-03-19 19:18 ` Steven Rostedt
  1 sibling, 1 reply; 7+ messages in thread
From: Mark Brown @ 2015-03-09 18:13 UTC (permalink / raw)
  To: Philipp Zabel
  Cc: Pankaj Dubey, Steven Rostedt, Ingo Molnar, linux-kernel, kernel

[-- Attachment #1: Type: text/plain, Size: 479 bytes --]

On Mon, Mar 09, 2015 at 12:20:13PM +0100, Philipp Zabel wrote:
> This patch fixes a NULL pointer dereference when enabling regmap event
> tracing in the presence of a syscon regmap, introduced by commit bdb0066df96e
> ("mfd: syscon: Decouple syscon interface from platform devices").
> That patch introduced syscon regmaps that have their dev field set to NULL.
> The regmap trace events expect it to point to a valid struct device and feed
> it to dev_name():

Applied, thanks.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events
  2015-03-09 11:20 [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events Philipp Zabel
  2015-03-09 18:13 ` Mark Brown
@ 2015-03-19 19:18 ` Steven Rostedt
  1 sibling, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2015-03-19 19:18 UTC (permalink / raw)
  To: Philipp Zabel; +Cc: Mark Brown, Pankaj Dubey, Ingo Molnar, linux-kernel, kernel

On Mon,  9 Mar 2015 12:20:13 +0100
Philipp Zabel <p.zabel@pengutronix.de> wrote:

Sorry for the late repy, I just noticed this email.

> diff --git a/include/trace/events/regmap.h b/include/trace/events/regmap.h
> index 23d5615..22317d2 100644
> --- a/include/trace/events/regmap.h
> +++ b/include/trace/events/regmap.h
> @@ -7,27 +7,26 @@
>  #include <linux/ktime.h>
>  #include <linux/tracepoint.h>
>  
> -struct device;
> -struct regmap;
> +#include "../../../drivers/base/regmap/internal.h"

Ouch, that is nasty!

Can we move this regmap.h file into drivers/base/regmap/ directory.
The trace_event sample code in samples/trace_events/ explains how to do
that, but for those that are too lazy to read that, I'll explain it here
too ;-)

In drivers/base/regmap/Makefile, add:

CFLAGS_regmap.o = -I$(src)

Then in this header file add at the bottom just before the include of
trace/define_trace.h:

#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .

Note, if you want to rename this file to something like regmap_trace.h,
then you also need to add:

#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE regmap_trace

And it should all work out. Then you don't need that ugly include and
you can just add:

#include "internal.h"

-- Steve



>  
>  /*
>   * Log register events
>   */
>  DECLARE_EVENT_CLASS(regmap_reg,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg,
> +	TP_PROTO(struct regmap *map, unsigned int reg,
>  		 unsigned int val),
>  
> -	TP_ARGS(dev, reg, val),
> +	TP_ARGS(map, reg, val),
>  
>  	TP_STRUCT__entry(
> -		__string(	name,		dev_name(dev)	)
> -		__field(	unsigned int,	reg		)
> -		__field(	unsigned int,	val		)
> +		__string(	name,		regmap_name(map)	)
> +		__field(	unsigned int,	reg			)
> +		__field(	unsigned int,	val			)
>  	),
>  
>  	TP_fast_assign(
> -		__assign_str(name, dev_name(dev));
> +		__assign_str(name, regmap_name(map));
>  		__entry->reg = reg;
>  		__entry->val = val;
>  	),
> @@ -39,45 +38,45 @@ DECLARE_EVENT_CLASS(regmap_reg,
>  
>  DEFINE_EVENT(regmap_reg, regmap_reg_write,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg,
> +	TP_PROTO(struct regmap *map, unsigned int reg,
>  		 unsigned int val),
>  
> -	TP_ARGS(dev, reg, val)
> +	TP_ARGS(map, reg, val)
>  
>  );
>  
>  DEFINE_EVENT(regmap_reg, regmap_reg_read,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg,
> +	TP_PROTO(struct regmap *map, unsigned int reg,
>  		 unsigned int val),
>  
> -	TP_ARGS(dev, reg, val)
> +	TP_ARGS(map, reg, val)
>  
>  );
>  
>  DEFINE_EVENT(regmap_reg, regmap_reg_read_cache,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg,
> +	TP_PROTO(struct regmap *map, unsigned int reg,
>  		 unsigned int val),
>  
> -	TP_ARGS(dev, reg, val)
> +	TP_ARGS(map, reg, val)
>  
>  );
>  
>  DECLARE_EVENT_CLASS(regmap_block,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg, int count),
> +	TP_PROTO(struct regmap *map, unsigned int reg, int count),
>  
> -	TP_ARGS(dev, reg, count),
> +	TP_ARGS(map, reg, count),
>  
>  	TP_STRUCT__entry(
> -		__string(	name,		dev_name(dev)	)
> -		__field(	unsigned int,	reg		)
> -		__field(	int,		count		)
> +		__string(	name,		regmap_name(map)	)
> +		__field(	unsigned int,	reg			)
> +		__field(	int,		count			)
>  	),
>  
>  	TP_fast_assign(
> -		__assign_str(name, dev_name(dev));
> +		__assign_str(name, regmap_name(map));
>  		__entry->reg = reg;
>  		__entry->count = count;
>  	),
> @@ -89,48 +88,48 @@ DECLARE_EVENT_CLASS(regmap_block,
>  
>  DEFINE_EVENT(regmap_block, regmap_hw_read_start,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg, int count),
> +	TP_PROTO(struct regmap *map, unsigned int reg, int count),
>  
> -	TP_ARGS(dev, reg, count)
> +	TP_ARGS(map, reg, count)
>  );
>  
>  DEFINE_EVENT(regmap_block, regmap_hw_read_done,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg, int count),
> +	TP_PROTO(struct regmap *map, unsigned int reg, int count),
>  
> -	TP_ARGS(dev, reg, count)
> +	TP_ARGS(map, reg, count)
>  );
>  
>  DEFINE_EVENT(regmap_block, regmap_hw_write_start,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg, int count),
> +	TP_PROTO(struct regmap *map, unsigned int reg, int count),
>  
> -	TP_ARGS(dev, reg, count)
> +	TP_ARGS(map, reg, count)
>  );
>  
>  DEFINE_EVENT(regmap_block, regmap_hw_write_done,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg, int count),
> +	TP_PROTO(struct regmap *map, unsigned int reg, int count),
>  
> -	TP_ARGS(dev, reg, count)
> +	TP_ARGS(map, reg, count)
>  );
>  
>  TRACE_EVENT(regcache_sync,
>  
> -	TP_PROTO(struct device *dev, const char *type,
> +	TP_PROTO(struct regmap *map, const char *type,
>  		 const char *status),
>  
> -	TP_ARGS(dev, type, status),
> +	TP_ARGS(map, type, status),
>  
>  	TP_STRUCT__entry(
> -		__string(       name,           dev_name(dev)   )
> -		__string(	status,		status		)
> -		__string(	type,		type		)
> -		__field(	int,		type		)
> +		__string(       name,           regmap_name(map)	)
> +		__string(	status,		status			)
> +		__string(	type,		type			)
> +		__field(	int,		type			)
>  	),
>  
>  	TP_fast_assign(
> -		__assign_str(name, dev_name(dev));
> +		__assign_str(name, regmap_name(map));
>  		__assign_str(status, status);
>  		__assign_str(type, type);
>  	),
> @@ -141,17 +140,17 @@ TRACE_EVENT(regcache_sync,
>  
>  DECLARE_EVENT_CLASS(regmap_bool,
>  
> -	TP_PROTO(struct device *dev, bool flag),
> +	TP_PROTO(struct regmap *map, bool flag),
>  
> -	TP_ARGS(dev, flag),
> +	TP_ARGS(map, flag),
>  
>  	TP_STRUCT__entry(
> -		__string(	name,		dev_name(dev)	)
> -		__field(	int,		flag		)
> +		__string(	name,		regmap_name(map)	)
> +		__field(	int,		flag			)
>  	),
>  
>  	TP_fast_assign(
> -		__assign_str(name, dev_name(dev));
> +		__assign_str(name, regmap_name(map));
>  		__entry->flag = flag;
>  	),
>  
> @@ -161,32 +160,32 @@ DECLARE_EVENT_CLASS(regmap_bool,
>  
>  DEFINE_EVENT(regmap_bool, regmap_cache_only,
>  
> -	TP_PROTO(struct device *dev, bool flag),
> +	TP_PROTO(struct regmap *map, bool flag),
>  
> -	TP_ARGS(dev, flag)
> +	TP_ARGS(map, flag)
>  
>  );
>  
>  DEFINE_EVENT(regmap_bool, regmap_cache_bypass,
>  
> -	TP_PROTO(struct device *dev, bool flag),
> +	TP_PROTO(struct regmap *map, bool flag),
>  
> -	TP_ARGS(dev, flag)
> +	TP_ARGS(map, flag)
>  
>  );
>  
>  DECLARE_EVENT_CLASS(regmap_async,
>  
> -	TP_PROTO(struct device *dev),
> +	TP_PROTO(struct regmap *map),
>  
> -	TP_ARGS(dev),
> +	TP_ARGS(map),
>  
>  	TP_STRUCT__entry(
> -		__string(	name,		dev_name(dev)	)
> +		__string(	name,		regmap_name(map)	)
>  	),
>  
>  	TP_fast_assign(
> -		__assign_str(name, dev_name(dev));
> +		__assign_str(name, regmap_name(map));
>  	),
>  
>  	TP_printk("%s", __get_str(name))
> @@ -194,50 +193,50 @@ DECLARE_EVENT_CLASS(regmap_async,
>  
>  DEFINE_EVENT(regmap_block, regmap_async_write_start,
>  
> -	TP_PROTO(struct device *dev, unsigned int reg, int count),
> +	TP_PROTO(struct regmap *map, unsigned int reg, int count),
>  
> -	TP_ARGS(dev, reg, count)
> +	TP_ARGS(map, reg, count)
>  );
>  
>  DEFINE_EVENT(regmap_async, regmap_async_io_complete,
>  
> -	TP_PROTO(struct device *dev),
> +	TP_PROTO(struct regmap *map),
>  
> -	TP_ARGS(dev)
> +	TP_ARGS(map)
>  
>  );
>  
>  DEFINE_EVENT(regmap_async, regmap_async_complete_start,
>  
> -	TP_PROTO(struct device *dev),
> +	TP_PROTO(struct regmap *map),
>  
> -	TP_ARGS(dev)
> +	TP_ARGS(map)
>  
>  );
>  
>  DEFINE_EVENT(regmap_async, regmap_async_complete_done,
>  
> -	TP_PROTO(struct device *dev),
> +	TP_PROTO(struct regmap *map),
>  
> -	TP_ARGS(dev)
> +	TP_ARGS(map)
>  
>  );
>  
>  TRACE_EVENT(regcache_drop_region,
>  
> -	TP_PROTO(struct device *dev, unsigned int from,
> +	TP_PROTO(struct regmap *map, unsigned int from,
>  		 unsigned int to),
>  
> -	TP_ARGS(dev, from, to),
> +	TP_ARGS(map, from, to),
>  
>  	TP_STRUCT__entry(
> -		__string(       name,           dev_name(dev)   )
> -		__field(	unsigned int,	from		)
> -		__field(	unsigned int,	to		)
> +		__string(       name,           regmap_name(map)	)
> +		__field(	unsigned int,	from			)
> +		__field(	unsigned int,	to			)
>  	),
>  
>  	TP_fast_assign(
> -		__assign_str(name, dev_name(dev));
> +		__assign_str(name, regmap_name(map));
>  		__entry->from = from;
>  		__entry->to = to;
>  	),


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events
  2015-03-09 18:13 ` Mark Brown
@ 2015-03-19 19:22   ` Steven Rostedt
  2015-03-19 19:26     ` Mark Brown
  0 siblings, 1 reply; 7+ messages in thread
From: Steven Rostedt @ 2015-03-19 19:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Philipp Zabel, Pankaj Dubey, Ingo Molnar, linux-kernel, kernel

On Mon, 9 Mar 2015 18:13:54 +0000
Mark Brown <broonie@kernel.org> wrote:

> On Mon, Mar 09, 2015 at 12:20:13PM +0100, Philipp Zabel wrote:
> > This patch fixes a NULL pointer dereference when enabling regmap event
> > tracing in the presence of a syscon regmap, introduced by commit bdb0066df96e
> > ("mfd: syscon: Decouple syscon interface from platform devices").
> > That patch introduced syscon regmaps that have their dev field set to NULL.
> > The regmap trace events expect it to point to a valid struct device and feed
> > it to dev_name():
> 
> Applied, thanks.

Would you mind me sending you a patch that moves the trace file?

-- Steve

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events
  2015-03-19 19:22   ` Steven Rostedt
@ 2015-03-19 19:26     ` Mark Brown
  2015-03-19 19:58       ` Steven Rostedt
  0 siblings, 1 reply; 7+ messages in thread
From: Mark Brown @ 2015-03-19 19:26 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Philipp Zabel, Pankaj Dubey, Ingo Molnar, linux-kernel, kernel

[-- Attachment #1: Type: text/plain, Size: 325 bytes --]

On Thu, Mar 19, 2015 at 03:22:27PM -0400, Steven Rostedt wrote:
> Mark Brown <broonie@kernel.org> wrote:

> > > The regmap trace events expect it to point to a valid struct device and feed
> > > it to dev_name():

> > Applied, thanks.

> Would you mind me sending you a patch that moves the trace file?

No, please go ahead!

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events
  2015-03-19 19:26     ` Mark Brown
@ 2015-03-19 19:58       ` Steven Rostedt
  2015-03-19 20:08         ` Mark Brown
  0 siblings, 1 reply; 7+ messages in thread
From: Steven Rostedt @ 2015-03-19 19:58 UTC (permalink / raw)
  To: Mark Brown; +Cc: Philipp Zabel, Pankaj Dubey, Ingo Molnar, linux-kernel, kernel

On Thu, 19 Mar 2015 19:26:12 +0000
Mark Brown <broonie@kernel.org> wrote:

> On Thu, Mar 19, 2015 at 03:22:27PM -0400, Steven Rostedt wrote:
> > Mark Brown <broonie@kernel.org> wrote:
> 
> > > > The regmap trace events expect it to point to a valid struct device and feed
> > > > it to dev_name():
> 
> > > Applied, thanks.
> 
> > Would you mind me sending you a patch that moves the trace file?
> 
> No, please go ahead!

OK.

I pulled your regmap tree:

 git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git

And looked at each of the branches, and I don't see this applied. Is
there another tree I should look at?

-- Steve

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events
  2015-03-19 19:58       ` Steven Rostedt
@ 2015-03-19 20:08         ` Mark Brown
  0 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2015-03-19 20:08 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Philipp Zabel, Pankaj Dubey, Ingo Molnar, linux-kernel, kernel

[-- Attachment #1: Type: text/plain, Size: 434 bytes --]

On Thu, Mar 19, 2015 at 03:58:45PM -0400, Steven Rostedt wrote:

> I pulled your regmap tree:

>  git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git

> And looked at each of the branches, and I don't see this applied. Is
> there another tree I should look at?

Huh, my push script seems to have missed pushing it (there's some issue
with spotty connectivity been causing problems).  Anyway, it's there now
after a kick.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-03-19 20:08 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-09 11:20 [PATCH v2] regmap: introduce regmap_name to fix syscon regmap trace events Philipp Zabel
2015-03-09 18:13 ` Mark Brown
2015-03-19 19:22   ` Steven Rostedt
2015-03-19 19:26     ` Mark Brown
2015-03-19 19:58       ` Steven Rostedt
2015-03-19 20:08         ` Mark Brown
2015-03-19 19:18 ` Steven Rostedt

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).