summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorNeil Brown <neilb@cse.unsw.edu.au>2002-02-25 22:23:22 -0800
committerLinus Torvalds <torvalds@penguin.transmeta.com>2002-02-25 22:23:22 -0800
commitfac5a35a1ce389ce9ed21458023ce5eb2f076385 (patch)
tree171f6ac850c3f86d2680aa07897d556e9c027fa9 /include
parenta00181e0ec20f202deb980334b85ac9dd94d77a9 (diff)
[PATCH] PATCH 8/16: NFSD: RPC lists tidyup
Change sunrpc to use more list.h lists The sunrpc client code uses home-grown doubly linked lists to group - idle server threads - pending server sockets - waiting rpc tasks - all rpc tasks. This patch converts all of these lists to <linux/list.h> lists and also makes the list of all server sockets for a particular server into a list.h list instead of a single-link list. Possibly the least obvious change is replacing RPC_INIT_WAITQ with RPC_WAITQ and INIT_RPC_WAITQ. These follow the model of LIST_HEAD and INIT_LIST_HEAD defined in list.h and are needed to initialise the list_head in the rpc_waitq properly.
Diffstat (limited to 'include')
-rw-r--r--include/linux/sunrpc/sched.h34
-rw-r--r--include/linux/sunrpc/svc.h9
-rw-r--r--include/linux/sunrpc/svcsock.h6
-rw-r--r--include/linux/sunrpc/types.h55
4 files changed, 34 insertions, 70 deletions
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h
index eee6756b842a..892565ca4721 100644
--- a/include/linux/sunrpc/sched.h
+++ b/include/linux/sunrpc/sched.h
@@ -34,13 +34,11 @@ struct rpc_message {
* This is the RPC task struct
*/
struct rpc_task {
- struct rpc_task * tk_prev; /* wait queue links */
- struct rpc_task * tk_next;
+ struct list_head tk_list; /* wait queue links */
#ifdef RPC_DEBUG
unsigned long tk_magic; /* 0xf00baa */
#endif
- struct rpc_task * tk_next_task; /* global list of tasks */
- struct rpc_task * tk_prev_task; /* global list of tasks */
+ struct list_head tk_task; /* global list of tasks */
struct rpc_clnt * tk_client; /* RPC client */
struct rpc_rqst * tk_rqstp; /* RPC request */
int tk_status; /* result of last operation */
@@ -88,6 +86,20 @@ struct rpc_task {
#define tk_auth tk_client->cl_auth
#define tk_xprt tk_client->cl_xprt
+/* support walking a list of tasks on a wait queue */
+#define task_for_each(task, pos, head) \
+ list_for_each(pos, head) \
+ if ((task=list_entry(pos, struct rpc_task, tk_list)),1)
+
+#define task_for_first(task, head) \
+ if (!list_empty(head) && \
+ ((task=list_entry((head)->next, struct rpc_task, tk_list)),1))
+
+/* .. and walking list of all tasks */
+#define alltask_for_each(task, pos, head) \
+ list_for_each(pos, head) \
+ if ((task=list_entry(pos, struct rpc_task, tk_task)),1)
+
typedef void (*rpc_action)(struct rpc_task *);
/*
@@ -133,16 +145,24 @@ typedef void (*rpc_action)(struct rpc_task *);
* RPC synchronization objects
*/
struct rpc_wait_queue {
- struct rpc_task * task;
+ struct list_head tasks;
#ifdef RPC_DEBUG
char * name;
#endif
};
#ifndef RPC_DEBUG
-# define RPC_INIT_WAITQ(name) ((struct rpc_wait_queue) { NULL })
+# define RPC_WAITQ_INIT(var,qname) ((struct rpc_wait_queue) {LIST_HEAD_INIT(var)})
+# define RPC_WAITQ(var,qname) struct rpc_wait_queue var = RPC_WAITQ_INIT(var.tasks,qname)
+# define INIT_RPC_WAITQ(ptr,qname) do { \
+ INIT_LIST_HEAD(&(ptr)->tasks); \
+ } while(0)
#else
-# define RPC_INIT_WAITQ(name) ((struct rpc_wait_queue) { NULL, name })
+# define RPC_WAITQ_INIT(var,qname) ((struct rpc_wait_queue) {LIST_HEAD_INIT(var.tasks), qname})
+# define RPC_WAITQ(var,qname) struct rpc_wait_queue var = RPC_WAITQ_INIT(var,qname)
+# define INIT_RPC_WAITQ(ptr,qname) do { \
+ INIT_LIST_HEAD(&(ptr)->tasks); (ptr)->name = qname; \
+ } while(0)
#endif
/*
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index f6439cb4facf..003b89a68852 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -27,8 +27,8 @@
* We currently do not support more than one RPC program per daemon.
*/
struct svc_serv {
- struct svc_rqst * sv_threads; /* idle server threads */
- struct svc_sock * sv_sockets; /* pending sockets */
+ struct list_head sv_threads; /* idle server threads */
+ struct list_head sv_sockets; /* pending sockets */
struct svc_program * sv_program; /* RPC program */
struct svc_stat * sv_stats; /* RPC statistics */
spinlock_t sv_lock;
@@ -36,7 +36,7 @@ struct svc_serv {
unsigned int sv_bufsz; /* datagram buffer size */
unsigned int sv_xdrsize; /* XDR buffer size */
- struct svc_sock * sv_allsocks; /* all sockets */
+ struct list_head sv_allsocks; /* all sockets */
char * sv_name; /* service name */
};
@@ -89,8 +89,7 @@ struct svc_buf {
* NOTE: First two items must be prev/next.
*/
struct svc_rqst {
- struct svc_rqst * rq_prev; /* idle list */
- struct svc_rqst * rq_next;
+ struct list_head rq_list; /* idle list */
struct svc_sock * rq_sock; /* socket */
struct sockaddr_in rq_addr; /* peer address */
int rq_addrlen;
diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h
index 82d9678d4905..0c565502e272 100644
--- a/include/linux/sunrpc/svcsock.h
+++ b/include/linux/sunrpc/svcsock.h
@@ -13,12 +13,10 @@
/*
* RPC server socket.
- * NOTE: First two items must be prev/next.
*/
struct svc_sock {
- struct svc_sock * sk_prev; /* list of ready sockets */
- struct svc_sock * sk_next;
- struct svc_sock * sk_list; /* list of all sockets */
+ struct list_head sk_ready; /* list of ready sockets */
+ struct list_head sk_list; /* list of all sockets */
struct socket * sk_sock; /* berkeley socket layer */
struct sock * sk_sk; /* INET layer */
spinlock_t sk_lock;
diff --git a/include/linux/sunrpc/types.h b/include/linux/sunrpc/types.h
index 232ac45c725e..d524016fb4ba 100644
--- a/include/linux/sunrpc/types.h
+++ b/include/linux/sunrpc/types.h
@@ -12,60 +12,7 @@
#include <linux/timer.h>
#include <linux/tqueue.h>
#include <linux/sunrpc/debug.h>
-
-/*
- * These are the RPC list manipulation primitives used everywhere.
- */
-struct rpc_listitem {
- struct rpc_listitem * prev;
- struct rpc_listitem * next;
-};
-
-static __inline__ void
-__rpc_append_list(struct rpc_listitem **q, struct rpc_listitem *item)
-{
- struct rpc_listitem *next, *prev;
-
- if (!(next = *q)) {
- *q = item->next = item->prev = item;
- } else {
- prev = next->prev;
- prev->next = item;
- next->prev = item;
- item->next = next;
- item->prev = prev;
- }
-}
-
-static __inline__ void
-__rpc_insert_list(struct rpc_listitem **q, struct rpc_listitem *item)
-{
- __rpc_append_list(q, item);
- *q = item;
-}
-
-static __inline__ void
-__rpc_remove_list(struct rpc_listitem **q, struct rpc_listitem *item)
-{
- struct rpc_listitem *prev = item->prev,
- *next = item->next;
-
- if (item != prev) {
- next->prev = prev;
- prev->next = next;
- } else {
- next = NULL;
- }
- if (*q == item)
- *q = next;
-}
-
-#define rpc_insert_list(q, i) \
- __rpc_insert_list((struct rpc_listitem **) q, (struct rpc_listitem *) i)
-#define rpc_append_list(q, i) \
- __rpc_append_list((struct rpc_listitem **) q, (struct rpc_listitem *) i)
-#define rpc_remove_list(q, i) \
- __rpc_remove_list((struct rpc_listitem **) q, (struct rpc_listitem *) i)
+#include <linux/list.h>
/*
* Shorthands