Skip to content

Commit

Permalink
regmap: async: Add tracepoints for async I/O
Browse files Browse the repository at this point in the history
Trace when we start and complete async writes, and when we start and
finish blocking for their completion. This is useful for performance
analysis of the resulting I/O patterns.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Mark Brown committed Mar 4, 2013
1 parent 6dbe51c commit fe7d4cc
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
8 changes: 8 additions & 0 deletions drivers/base/regmap/regmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -999,6 +999,8 @@ static int _regmap_raw_write(struct regmap *map, unsigned int reg,
if (!async)
return -ENOMEM;

trace_regmap_async_write_start(map->dev, reg, val_len);

async->work_buf = kzalloc(map->format.buf_size,
GFP_KERNEL | GFP_DMA);
if (!async->work_buf) {
Expand Down Expand Up @@ -1640,6 +1642,8 @@ 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);

spin_lock(&map->async_lock);

list_del(&async->list);
Expand Down Expand Up @@ -1686,13 +1690,17 @@ int regmap_async_complete(struct regmap *map)
if (!map->bus->async_write)
return 0;

trace_regmap_async_complete_start(map->dev);

wait_event(map->async_waitq, regmap_async_is_done(map));

spin_lock_irqsave(&map->async_lock, flags);
ret = map->async_ret;
map->async_ret = 0;
spin_unlock_irqrestore(&map->async_lock, flags);

trace_regmap_async_complete_done(map->dev);

return ret;
}
EXPORT_SYMBOL_GPL(regmap_async_complete);
Expand Down
48 changes: 48 additions & 0 deletions include/trace/events/regmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,54 @@ DEFINE_EVENT(regmap_bool, regmap_cache_bypass,

);

DECLARE_EVENT_CLASS(regmap_async,

TP_PROTO(struct device *dev),

TP_ARGS(dev),

TP_STRUCT__entry(
__string( name, dev_name(dev) )
),

TP_fast_assign(
__assign_str(name, dev_name(dev));
),

TP_printk("%s", __get_str(name))
);

DEFINE_EVENT(regmap_block, regmap_async_write_start,

TP_PROTO(struct device *dev, unsigned int reg, int count),

TP_ARGS(dev, reg, count)
);

DEFINE_EVENT(regmap_async, regmap_async_io_complete,

TP_PROTO(struct device *dev),

TP_ARGS(dev)

);

DEFINE_EVENT(regmap_async, regmap_async_complete_start,

TP_PROTO(struct device *dev),

TP_ARGS(dev)

);

DEFINE_EVENT(regmap_async, regmap_async_complete_done,

TP_PROTO(struct device *dev),

TP_ARGS(dev)

);

#endif /* _TRACE_REGMAP_H */

/* This part must be outside protection */
Expand Down

0 comments on commit fe7d4cc

Please sign in to comment.