Browse Source

SUNRPC: Ensure that we can trace waitqueues when !defined(CONFIG_SYSCTL)

The tracepoint code relies on the queue->name being defined in order to
be able to display the name of the waitqueue on which an RPC task is
sleeping.

Reported-by: Randy Dunlap <rdunlap@xenotime.net>
Reported-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Randy Dunlap <rdunlap@xenotime.net>
Trond Myklebust 13 years ago
parent
commit
2f09c24216
3 changed files with 17 additions and 5 deletions
  1. 3 0
      include/linux/sunrpc/debug.h
  2. 13 2
      include/linux/sunrpc/sched.h
  3. 1 3
      net/sunrpc/sched.c

+ 3 - 0
include/linux/sunrpc/debug.h

@@ -34,6 +34,9 @@
 #ifdef CONFIG_SYSCTL
 #ifdef CONFIG_SYSCTL
 #define  RPC_DEBUG
 #define  RPC_DEBUG
 #endif
 #endif
+#ifdef CONFIG_TRACEPOINTS
+#define RPC_TRACEPOINTS
+#endif
 /* #define  RPC_PROFILE */
 /* #define  RPC_PROFILE */
 
 
 /*
 /*

+ 13 - 2
include/linux/sunrpc/sched.h

@@ -195,7 +195,7 @@ struct rpc_wait_queue {
 	unsigned char		nr;			/* # tasks remaining for cookie */
 	unsigned char		nr;			/* # tasks remaining for cookie */
 	unsigned short		qlen;			/* total # tasks waiting in queue */
 	unsigned short		qlen;			/* total # tasks waiting in queue */
 	struct rpc_timer	timer_list;
 	struct rpc_timer	timer_list;
-#ifdef RPC_DEBUG
+#if defined(RPC_DEBUG) || defined(RPC_TRACEPOINTS)
 	const char *		name;
 	const char *		name;
 #endif
 #endif
 };
 };
@@ -270,11 +270,22 @@ static inline int rpc_task_has_priority(struct rpc_task *task, unsigned char pri
 	return (task->tk_priority + RPC_PRIORITY_LOW == prio);
 	return (task->tk_priority + RPC_PRIORITY_LOW == prio);
 }
 }
 
 
-#ifdef RPC_DEBUG
+#if defined(RPC_DEBUG) || defined (RPC_TRACEPOINTS)
 static inline const char * rpc_qname(const struct rpc_wait_queue *q)
 static inline const char * rpc_qname(const struct rpc_wait_queue *q)
 {
 {
 	return ((q && q->name) ? q->name : "unknown");
 	return ((q && q->name) ? q->name : "unknown");
 }
 }
+
+static inline void rpc_assign_waitqueue_name(struct rpc_wait_queue *q,
+		const char *name)
+{
+	q->name = name;
+}
+#else
+static inline void rpc_assign_waitqueue_name(struct rpc_wait_queue *q,
+		const char *name)
+{
+}
 #endif
 #endif
 
 
 #endif /* _LINUX_SUNRPC_SCHED_H_ */
 #endif /* _LINUX_SUNRPC_SCHED_H_ */

+ 1 - 3
net/sunrpc/sched.c

@@ -208,9 +208,7 @@ static void __rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const c
 	queue->qlen = 0;
 	queue->qlen = 0;
 	setup_timer(&queue->timer_list.timer, __rpc_queue_timer_fn, (unsigned long)queue);
 	setup_timer(&queue->timer_list.timer, __rpc_queue_timer_fn, (unsigned long)queue);
 	INIT_LIST_HEAD(&queue->timer_list.list);
 	INIT_LIST_HEAD(&queue->timer_list.list);
-#ifdef RPC_DEBUG
-	queue->name = qname;
-#endif
+	rpc_assign_waitqueue_name(queue, qname);
 }
 }
 
 
 void rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const char *qname)
 void rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const char *qname)