1951a39d68df598db08dfced8b4707755864a0492Ying Wang/****************************************************************************
2951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************
3951a39d68df598db08dfced8b4707755864a0492Ying Wang ***
4951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   This header was automatically generated from a Linux kernel header
5951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   of the same name, to make information necessary for userspace to
6951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   call into the kernel available to libc.  It contains only constants,
7951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   structures, and macros generated from the original header, and thus,
8951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   contains no copyrightable information.
9951a39d68df598db08dfced8b4707755864a0492Ying Wang ***
10951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************
11951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************/
12951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef _LINUX_SUNRPC_SCHED_H_
13951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _LINUX_SUNRPC_SCHED_H_
14951a39d68df598db08dfced8b4707755864a0492Ying Wang
15951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/timer.h>
16951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/sunrpc/types.h>
17951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/spinlock.h>
18951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/wait.h>
19951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/workqueue.h>
20951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/sunrpc/xdr.h>
21951a39d68df598db08dfced8b4707755864a0492Ying Wang
22951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_procinfo;
23951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_message {
24951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rpc_procinfo * rpc_proc;
25951a39d68df598db08dfced8b4707755864a0492Ying Wang void * rpc_argp;
26951a39d68df598db08dfced8b4707755864a0492Ying Wang void * rpc_resp;
27951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rpc_cred * rpc_cred;
28951a39d68df598db08dfced8b4707755864a0492Ying Wang};
29951a39d68df598db08dfced8b4707755864a0492Ying Wang
30951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_call_ops;
31951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_wait_queue;
32951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_wait {
33951a39d68df598db08dfced8b4707755864a0492Ying Wang struct list_head list;
34951a39d68df598db08dfced8b4707755864a0492Ying Wang struct list_head links;
35951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rpc_wait_queue * rpc_waitq;
36951a39d68df598db08dfced8b4707755864a0492Ying Wang};
37951a39d68df598db08dfced8b4707755864a0492Ying Wang
38951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_task {
39951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef RPC_DEBUG
40951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned long tk_magic;
41951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
42951a39d68df598db08dfced8b4707755864a0492Ying Wang atomic_t tk_count;
43951a39d68df598db08dfced8b4707755864a0492Ying Wang struct list_head tk_task;
44951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rpc_clnt * tk_client;
45951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rpc_rqst * tk_rqstp;
46951a39d68df598db08dfced8b4707755864a0492Ying Wang int tk_status;
47951a39d68df598db08dfced8b4707755864a0492Ying Wang
48951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rpc_message tk_msg;
49951a39d68df598db08dfced8b4707755864a0492Ying Wang __u8 tk_garb_retry;
50951a39d68df598db08dfced8b4707755864a0492Ying Wang __u8 tk_cred_retry;
51951a39d68df598db08dfced8b4707755864a0492Ying Wang
52951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned long tk_cookie;
53951a39d68df598db08dfced8b4707755864a0492Ying Wang
54951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*tk_timeout_fn)(struct rpc_task *);
55951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*tk_callback)(struct rpc_task *);
56951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*tk_action)(struct rpc_task *);
57951a39d68df598db08dfced8b4707755864a0492Ying Wang const struct rpc_call_ops *tk_ops;
58951a39d68df598db08dfced8b4707755864a0492Ying Wang void * tk_calldata;
59951a39d68df598db08dfced8b4707755864a0492Ying Wang
60951a39d68df598db08dfced8b4707755864a0492Ying Wang struct timer_list tk_timer;
61951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned long tk_timeout;
62951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned short tk_flags;
63951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned char tk_priority : 2;
64951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned long tk_runstate;
65951a39d68df598db08dfced8b4707755864a0492Ying Wang struct workqueue_struct *tk_workqueue;
66951a39d68df598db08dfced8b4707755864a0492Ying Wang union {
67951a39d68df598db08dfced8b4707755864a0492Ying Wang struct work_struct tk_work;
68951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rpc_wait tk_wait;
69951a39d68df598db08dfced8b4707755864a0492Ying Wang } u;
70951a39d68df598db08dfced8b4707755864a0492Ying Wang
71951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned short tk_timeouts;
72951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t tk_bytes_sent;
73951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned long tk_start;
74951a39d68df598db08dfced8b4707755864a0492Ying Wang long tk_rtt;
75951a39d68df598db08dfced8b4707755864a0492Ying Wang
76951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef RPC_DEBUG
77951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned short tk_pid;
78951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
79951a39d68df598db08dfced8b4707755864a0492Ying Wang};
80951a39d68df598db08dfced8b4707755864a0492Ying Wang#define tk_auth tk_client->cl_auth
81951a39d68df598db08dfced8b4707755864a0492Ying Wang#define tk_xprt tk_client->cl_xprt
82951a39d68df598db08dfced8b4707755864a0492Ying Wang
83951a39d68df598db08dfced8b4707755864a0492Ying Wang#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)
84951a39d68df598db08dfced8b4707755864a0492Ying Wang
85951a39d68df598db08dfced8b4707755864a0492Ying Wang#define task_for_first(task, head)   if (!list_empty(head) &&   ((task=list_entry((head)->next, struct rpc_task, u.tk_wait.list)),1))
86951a39d68df598db08dfced8b4707755864a0492Ying Wang
87951a39d68df598db08dfced8b4707755864a0492Ying Wang#define alltask_for_each(task, pos, head)   list_for_each(pos, head)   if ((task=list_entry(pos, struct rpc_task, tk_task)),1)
88951a39d68df598db08dfced8b4707755864a0492Ying Wang
89951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef void (*rpc_action)(struct rpc_task *);
90951a39d68df598db08dfced8b4707755864a0492Ying Wang
91951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_call_ops {
92951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*rpc_call_prepare)(struct rpc_task *, void *);
93951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*rpc_call_done)(struct rpc_task *, void *);
94951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*rpc_release)(void *);
95951a39d68df598db08dfced8b4707755864a0492Ying Wang};
96951a39d68df598db08dfced8b4707755864a0492Ying Wang
97951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_ASYNC 0x0001
98951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_SWAPPER 0x0002
99951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_CHILD 0x0008
100951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_CALL_MAJORSEEN 0x0020
101951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_ROOTCREDS 0x0040
102951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_DYNAMIC 0x0080
103951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_KILLED 0x0100
104951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_SOFT 0x0200
105951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_NOINTR 0x0400
106951a39d68df598db08dfced8b4707755864a0492Ying Wang
107951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC)
108951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_IS_CHILD(t) ((t)->tk_flags & RPC_TASK_CHILD)
109951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER)
110951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS)
111951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED)
112951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_DO_CALLBACK(t) ((t)->tk_callback != NULL)
113951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT)
114951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_UNINTERRUPTIBLE(t) ((t)->tk_flags & RPC_TASK_NOINTR)
115951a39d68df598db08dfced8b4707755864a0492Ying Wang
116951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_RUNNING 0
117951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_QUEUED 1
118951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_WAKEUP 2
119951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_HAS_TIMER 3
120951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_TASK_ACTIVE 4
121951a39d68df598db08dfced8b4707755864a0492Ying Wang
122951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_IS_RUNNING(t) (test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate))
123951a39d68df598db08dfced8b4707755864a0492Ying Wang#define rpc_set_running(t) (set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate))
124951a39d68df598db08dfced8b4707755864a0492Ying Wang#define rpc_test_and_set_running(t)   (test_and_set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate))
125951a39d68df598db08dfced8b4707755864a0492Ying Wang#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)
126951a39d68df598db08dfced8b4707755864a0492Ying Wang
127951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_IS_QUEUED(t) (test_bit(RPC_TASK_QUEUED, &(t)->tk_runstate))
128951a39d68df598db08dfced8b4707755864a0492Ying Wang#define rpc_set_queued(t) (set_bit(RPC_TASK_QUEUED, &(t)->tk_runstate))
129951a39d68df598db08dfced8b4707755864a0492Ying Wang#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)
130951a39d68df598db08dfced8b4707755864a0492Ying Wang
131951a39d68df598db08dfced8b4707755864a0492Ying Wang#define rpc_start_wakeup(t)   (test_and_set_bit(RPC_TASK_WAKEUP, &(t)->tk_runstate) == 0)
132951a39d68df598db08dfced8b4707755864a0492Ying Wang#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)
133951a39d68df598db08dfced8b4707755864a0492Ying Wang
134951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_IS_ACTIVATED(t) (test_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate))
135951a39d68df598db08dfced8b4707755864a0492Ying Wang#define rpc_set_active(t) (set_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate))
136951a39d68df598db08dfced8b4707755864a0492Ying Wang#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)
137951a39d68df598db08dfced8b4707755864a0492Ying Wang
138951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_PRIORITY_LOW 0
139951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_PRIORITY_NORMAL 1
140951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_PRIORITY_HIGH 2
141951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_NR_PRIORITY (RPC_PRIORITY_HIGH+1)
142951a39d68df598db08dfced8b4707755864a0492Ying Wang
143951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_wait_queue {
144951a39d68df598db08dfced8b4707755864a0492Ying Wang spinlock_t lock;
145951a39d68df598db08dfced8b4707755864a0492Ying Wang struct list_head tasks[RPC_NR_PRIORITY];
146951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned long cookie;
147951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned char maxpriority;
148951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned char priority;
149951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned char count;
150951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned char nr;
151951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned short qlen;
152951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef RPC_DEBUG
153951a39d68df598db08dfced8b4707755864a0492Ying Wang const char * name;
154951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
155951a39d68df598db08dfced8b4707755864a0492Ying Wang};
156951a39d68df598db08dfced8b4707755864a0492Ying Wang
157951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_BATCH_COUNT 16
158951a39d68df598db08dfced8b4707755864a0492Ying Wang
159951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef RPC_DEBUG
160951a39d68df598db08dfced8b4707755864a0492Ying Wang#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]),   },   }
161951a39d68df598db08dfced8b4707755864a0492Ying Wang#else
162951a39d68df598db08dfced8b4707755864a0492Ying Wang#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,   }
163951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
164951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_WAITQ(var,qname) struct rpc_wait_queue var = RPC_WAITQ_INIT(var,qname)
165951a39d68df598db08dfced8b4707755864a0492Ying Wang
166951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RPC_IS_PRIORITY(q) ((q)->maxpriority > 0)
167951a39d68df598db08dfced8b4707755864a0492Ying Wang
168951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_task *rpc_new_task(struct rpc_clnt *, int flags,
169951a39d68df598db08dfced8b4707755864a0492Ying Wang const struct rpc_call_ops *ops, void *data);
170951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags,
171951a39d68df598db08dfced8b4707755864a0492Ying Wang const struct rpc_call_ops *ops, void *data);
172951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_task *rpc_new_child(struct rpc_clnt *, struct rpc_task *parent);
173951a39d68df598db08dfced8b4707755864a0492Ying Wang
174951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rpc_task *rpc_wake_up_next(struct rpc_wait_queue *);
175951a39d68df598db08dfced8b4707755864a0492Ying Wang
176951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef RPC_DEBUG
177951a39d68df598db08dfced8b4707755864a0492Ying Wang
178951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
179951a39d68df598db08dfced8b4707755864a0492Ying Wang
180951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef RPC_DEBUG
181951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
182951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
183