1c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/****************************************************************************
2c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ****************************************************************************
3c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ***
4c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ***   This header was automatically generated from a Linux kernel header
5c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ***   of the same name, to make information necessary for userspace to
6c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ***   call into the kernel available to libc.  It contains only constants,
7c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ***   structures, and macros generated from the original header, and thus,
8c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ***   contains no copyrightable information.
9c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ***
10c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ****************************************************************************
11c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner ****************************************************************************/
12c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#ifndef _LINUX_SUNRPC_SCHED_H_
13c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define _LINUX_SUNRPC_SCHED_H_
14c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
15c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <linux/timer.h>
16c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <linux/sunrpc/types.h>
17c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <linux/spinlock.h>
18c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <linux/wait.h>
19c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <linux/workqueue.h>
20c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <linux/sunrpc/xdr.h>
21c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
22c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_procinfo;
23c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_message {
24c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct rpc_procinfo * rpc_proc;
25c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void * rpc_argp;
26c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void * rpc_resp;
27c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct rpc_cred * rpc_cred;
28c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner};
29c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
30c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_call_ops;
31c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_wait_queue;
32c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_wait {
33c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct list_head list;
34c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct list_head links;
35c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct rpc_wait_queue * rpc_waitq;
36c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner};
37c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
38c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_task {
39c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#ifdef RPC_DEBUG
40c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned long tk_magic;
41c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif
42c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner atomic_t tk_count;
43c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct list_head tk_task;
44c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct rpc_clnt * tk_client;
45c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct rpc_rqst * tk_rqstp;
46c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner int tk_status;
47c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
48c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct rpc_message tk_msg;
49c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __u8 tk_garb_retry;
50c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __u8 tk_cred_retry;
51c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
52c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned long tk_cookie;
53c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
54c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void (*tk_timeout_fn)(struct rpc_task *);
55c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void (*tk_callback)(struct rpc_task *);
56c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void (*tk_action)(struct rpc_task *);
57c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct rpc_call_ops *tk_ops;
58c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void * tk_calldata;
59c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
60c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct timer_list tk_timer;
61c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned long tk_timeout;
62c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned short tk_flags;
63c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned char tk_priority : 2;
64c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned long tk_runstate;
65c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct workqueue_struct *tk_workqueue;
66c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner union {
67c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct work_struct tk_work;
68c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct rpc_wait tk_wait;
69c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner } u;
70c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
71c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned short tk_timeouts;
72c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner size_t tk_bytes_sent;
73c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned long tk_start;
74c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner long tk_rtt;
75c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
76c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#ifdef RPC_DEBUG
77c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned short tk_pid;
78c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif
79c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner};
80c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define tk_auth tk_client->cl_auth
81c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define tk_xprt tk_client->cl_xprt
82c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
83c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define task_for_each(task, pos, head)   list_for_each(pos, head)   if ((task=list_entry(pos, struct rpc_task, u.tk_wait.list)),1)
84c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
85c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define task_for_first(task, head)   if (!list_empty(head) &&   ((task=list_entry((head)->next, struct rpc_task, u.tk_wait.list)),1))
86c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
87c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define alltask_for_each(task, pos, head)   list_for_each(pos, head)   if ((task=list_entry(pos, struct rpc_task, tk_task)),1)
88c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
89c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef void (*rpc_action)(struct rpc_task *);
90c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
91c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_call_ops {
92c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void (*rpc_call_prepare)(struct rpc_task *, void *);
93c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void (*rpc_call_done)(struct rpc_task *, void *);
94c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void (*rpc_release)(void *);
95c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner};
96c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
97c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_ASYNC 0x0001
98c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_SWAPPER 0x0002
99c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_CHILD 0x0008
100c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_CALL_MAJORSEEN 0x0020
101c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_ROOTCREDS 0x0040
102c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_DYNAMIC 0x0080
103c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_KILLED 0x0100
104c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_SOFT 0x0200
105c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_NOINTR 0x0400
106c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
107c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC)
108c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_IS_CHILD(t) ((t)->tk_flags & RPC_TASK_CHILD)
109c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER)
110c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS)
111c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED)
112c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_DO_CALLBACK(t) ((t)->tk_callback != NULL)
113c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT)
114c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_UNINTERRUPTIBLE(t) ((t)->tk_flags & RPC_TASK_NOINTR)
115c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
116c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_RUNNING 0
117c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_QUEUED 1
118c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_WAKEUP 2
119c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_HAS_TIMER 3
120c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_TASK_ACTIVE 4
121c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
122c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_IS_RUNNING(t) (test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate))
123c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_set_running(t) (set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate))
124c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_test_and_set_running(t)   (test_and_set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate))
125c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_clear_running(t)   do {   smp_mb__before_clear_bit();   clear_bit(RPC_TASK_RUNNING, &(t)->tk_runstate);   smp_mb__after_clear_bit();   } while (0)
126c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
127c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_IS_QUEUED(t) (test_bit(RPC_TASK_QUEUED, &(t)->tk_runstate))
128c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_set_queued(t) (set_bit(RPC_TASK_QUEUED, &(t)->tk_runstate))
129c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_clear_queued(t)   do {   smp_mb__before_clear_bit();   clear_bit(RPC_TASK_QUEUED, &(t)->tk_runstate);   smp_mb__after_clear_bit();   } while (0)
130c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
131c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_start_wakeup(t)   (test_and_set_bit(RPC_TASK_WAKEUP, &(t)->tk_runstate) == 0)
132c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_finish_wakeup(t)   do {   smp_mb__before_clear_bit();   clear_bit(RPC_TASK_WAKEUP, &(t)->tk_runstate);   smp_mb__after_clear_bit();   } while (0)
133c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
134c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_IS_ACTIVATED(t) (test_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate))
135c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_set_active(t) (set_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate))
136c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define rpc_clear_active(t)   do {   smp_mb__before_clear_bit();   clear_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate);   smp_mb__after_clear_bit();   } while(0)
137c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
138c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_PRIORITY_LOW 0
139c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_PRIORITY_NORMAL 1
140c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_PRIORITY_HIGH 2
141c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_NR_PRIORITY (RPC_PRIORITY_HIGH+1)
142c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
143c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_wait_queue {
144c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner spinlock_t lock;
145c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct list_head tasks[RPC_NR_PRIORITY];
146c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned long cookie;
147c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned char maxpriority;
148c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned char priority;
149c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned char count;
150c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned char nr;
151c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned short qlen;
152c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#ifdef RPC_DEBUG
153c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const char * name;
154c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif
155c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner};
156c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
157c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_BATCH_COUNT 16
158c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
159c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#ifndef RPC_DEBUG
160c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_WAITQ_INIT(var,qname) {   .lock = SPIN_LOCK_UNLOCKED,   .tasks = {   [0] = LIST_HEAD_INIT(var.tasks[0]),   [1] = LIST_HEAD_INIT(var.tasks[1]),   [2] = LIST_HEAD_INIT(var.tasks[2]),   },   }
161c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#else
162c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_WAITQ_INIT(var,qname) {   .lock = SPIN_LOCK_UNLOCKED,   .tasks = {   [0] = LIST_HEAD_INIT(var.tasks[0]),   [1] = LIST_HEAD_INIT(var.tasks[1]),   [2] = LIST_HEAD_INIT(var.tasks[2]),   },   .name = qname,   }
163c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif
164c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_WAITQ(var,qname) struct rpc_wait_queue var = RPC_WAITQ_INIT(var,qname)
165c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
166c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define RPC_IS_PRIORITY(q) ((q)->maxpriority > 0)
167c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
168c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_task *rpc_new_task(struct rpc_clnt *, int flags,
169c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct rpc_call_ops *ops, void *data);
170c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags,
171c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct rpc_call_ops *ops, void *data);
172c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_task *rpc_new_child(struct rpc_clnt *, struct rpc_task *parent);
173c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
174c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerstruct rpc_task *rpc_wake_up_next(struct rpc_wait_queue *);
175c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
176c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#ifdef RPC_DEBUG
177c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
178c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif
179c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner
180c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#ifdef RPC_DEBUG
181c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif
182c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif
183