Commit 4862fd60 authored by Theodore Ts'o's avatar Theodore Ts'o
Browse files

jbd2: remove jbd2_dev_to_name() from jbd2 tracepoints



Using function calls in TP_printk causes perf heartburn, so print the
MAJOR/MINOR device numbers instead.

Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 575a1d4b
Loading
Loading
Loading
Loading
+0 −67
Original line number Diff line number Diff line
@@ -2390,73 +2390,6 @@ static void __exit journal_exit(void)
	jbd2_journal_destroy_caches();
}

/* 
 * jbd2_dev_to_name is a utility function used by the jbd2 and ext4 
 * tracing infrastructure to map a dev_t to a device name.
 *
 * The caller should use rcu_read_lock() in order to make sure the
 * device name stays valid until its done with it.  We use
 * rcu_read_lock() as well to make sure we're safe in case the caller
 * gets sloppy, and because rcu_read_lock() is cheap and can be safely
 * nested.
 */
struct devname_cache {
	struct rcu_head	rcu;
	dev_t		device;
	char		devname[BDEVNAME_SIZE];
};
#define CACHE_SIZE_BITS 6
static struct devname_cache *devcache[1 << CACHE_SIZE_BITS];
static DEFINE_SPINLOCK(devname_cache_lock);

static void free_devcache(struct rcu_head *rcu)
{
	kfree(rcu);
}

const char *jbd2_dev_to_name(dev_t device)
{
	int	i = hash_32(device, CACHE_SIZE_BITS);
	char	*ret;
	struct block_device *bd;
	static struct devname_cache *new_dev;

	rcu_read_lock();
	if (devcache[i] && devcache[i]->device == device) {
		ret = devcache[i]->devname;
		rcu_read_unlock();
		return ret;
	}
	rcu_read_unlock();

	new_dev = kmalloc(sizeof(struct devname_cache), GFP_KERNEL);
	if (!new_dev)
		return "NODEV-ALLOCFAILURE"; /* Something non-NULL */
	bd = bdget(device);
	spin_lock(&devname_cache_lock);
	if (devcache[i]) {
		if (devcache[i]->device == device) {
			kfree(new_dev);
			bdput(bd);
			ret = devcache[i]->devname;
			spin_unlock(&devname_cache_lock);
			return ret;
		}
		call_rcu(&devcache[i]->rcu, free_devcache);
	}
	devcache[i] = new_dev;
	devcache[i]->device = device;
	if (bd) {
		bdevname(bd, devcache[i]->devname);
		bdput(bd);
	} else
		__bdevname(device, devcache[i]->devname);
	ret = devcache[i]->devname;
	spin_unlock(&devname_cache_lock);
	return ret;
}
EXPORT_SYMBOL(jbd2_dev_to_name);

MODULE_LICENSE("GPL");
module_init(journal_init);
module_exit(journal_exit);
+0 −6
Original line number Diff line number Diff line
@@ -1329,12 +1329,6 @@ extern int jbd_blocks_per_page(struct inode *inode);
#define BUFFER_TRACE2(bh, bh2, info)	do {} while (0)
#define JBUFFER_TRACE(jh, info)	do {} while (0)

/* 
 * jbd2_dev_to_name is a utility function used by the jbd2 and ext4 
 * tracing infrastructure to map a dev_t to a device name.
 */
extern const char *jbd2_dev_to_name(dev_t device);

#endif	/* __KERNEL__ */

#endif	/* _LINUX_JBD2_H */
+19 −17
Original line number Diff line number Diff line
@@ -26,8 +26,8 @@ TRACE_EVENT(jbd2_checkpoint,
		__entry->result		= result;
	),

	TP_printk("dev %s result %d",
		  jbd2_dev_to_name(__entry->dev), __entry->result)
	TP_printk("dev %d,%d result %d",
		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->result)
);

DECLARE_EVENT_CLASS(jbd2_commit,
@@ -48,9 +48,9 @@ DECLARE_EVENT_CLASS(jbd2_commit,
		__entry->transaction	= commit_transaction->t_tid;
	),

	TP_printk("dev %s transaction %d sync %d",
		  jbd2_dev_to_name(__entry->dev), __entry->transaction,
		  __entry->sync_commit)
	TP_printk("dev %d,%d transaction %d sync %d",
		  MAJOR(__entry->dev), MINOR(__entry->dev),
		  __entry->transaction, __entry->sync_commit)
);

DEFINE_EVENT(jbd2_commit, jbd2_start_commit,
@@ -100,9 +100,9 @@ TRACE_EVENT(jbd2_end_commit,
		__entry->head		= journal->j_tail_sequence;
	),

	TP_printk("dev %s transaction %d sync %d head %d",
		  jbd2_dev_to_name(__entry->dev), __entry->transaction,
		  __entry->sync_commit, __entry->head)
	TP_printk("dev %d,%d transaction %d sync %d head %d",
		  MAJOR(__entry->dev), MINOR(__entry->dev),
		  __entry->transaction, __entry->sync_commit, __entry->head)
);

TRACE_EVENT(jbd2_submit_inode_data,
@@ -120,8 +120,9 @@ TRACE_EVENT(jbd2_submit_inode_data,
		__entry->ino	= inode->i_ino;
	),

	TP_printk("dev %s ino %lu",
		  jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino)
	TP_printk("dev %d,%d ino %lu",
		  MAJOR(__entry->dev), MINOR(__entry->dev),
		  (unsigned long) __entry->ino)
);

TRACE_EVENT(jbd2_run_stats,
@@ -156,9 +157,9 @@ TRACE_EVENT(jbd2_run_stats,
		__entry->blocks_logged	= stats->rs_blocks_logged;
	),

	TP_printk("dev %s tid %lu wait %u running %u locked %u flushing %u "
	TP_printk("dev %d,%d tid %lu wait %u running %u locked %u flushing %u "
		  "logging %u handle_count %u blocks %u blocks_logged %u",
		  jbd2_dev_to_name(__entry->dev), __entry->tid,
		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid,
		  jiffies_to_msecs(__entry->wait),
		  jiffies_to_msecs(__entry->running),
		  jiffies_to_msecs(__entry->locked),
@@ -192,9 +193,9 @@ TRACE_EVENT(jbd2_checkpoint_stats,
		__entry->dropped	= stats->cs_dropped;
	),

	TP_printk("dev %s tid %lu chp_time %u forced_to_close %u "
	TP_printk("dev %d,%d tid %lu chp_time %u forced_to_close %u "
		  "written %u dropped %u",
		  jbd2_dev_to_name(__entry->dev), __entry->tid,
		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid,
		  jiffies_to_msecs(__entry->chp_time),
		  __entry->forced_to_close, __entry->written, __entry->dropped)
);
@@ -222,9 +223,10 @@ TRACE_EVENT(jbd2_cleanup_journal_tail,
		__entry->freed		= freed;
	),

	TP_printk("dev %s from %u to %u offset %lu freed %lu",
		  jbd2_dev_to_name(__entry->dev), __entry->tail_sequence,
		  __entry->first_tid, __entry->block_nr, __entry->freed)
	TP_printk("dev %d,%d from %u to %u offset %lu freed %lu",
		  MAJOR(__entry->dev), MINOR(__entry->dev),
		  __entry->tail_sequence, __entry->first_tid,
		  __entry->block_nr, __entry->freed)
);

#endif /* _TRACE_JBD2_H */