Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
sunrpc
sched.h
Go to the documentation of this file.
1
/*
2
* linux/include/linux/sunrpc/sched.h
3
*
4
* Scheduling primitives for kernel Sun RPC.
5
*
6
* Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
7
*/
8
9
#ifndef _LINUX_SUNRPC_SCHED_H_
10
#define _LINUX_SUNRPC_SCHED_H_
11
12
#include <
linux/timer.h
>
13
#include <
linux/ktime.h
>
14
#include <
linux/sunrpc/types.h
>
15
#include <
linux/spinlock.h
>
16
#include <linux/wait.h>
17
#include <
linux/workqueue.h
>
18
#include <
linux/sunrpc/xdr.h
>
19
20
/*
21
* This is the actual RPC procedure call info.
22
*/
23
struct
rpc_procinfo
;
24
struct
rpc_message
{
25
struct
rpc_procinfo
*
rpc_proc
;
/* Procedure information */
26
void
*
rpc_argp
;
/* Arguments */
27
void
*
rpc_resp
;
/* Result */
28
struct
rpc_cred
*
rpc_cred
;
/* Credentials */
29
};
30
31
struct
rpc_call_ops
;
32
struct
rpc_wait_queue
;
33
struct
rpc_wait
{
34
struct
list_head
list
;
/* wait queue links */
35
struct
list_head
links
;
/* Links to related tasks */
36
struct
list_head
timer_list
;
/* Timer list */
37
unsigned
long
expires
;
38
};
39
40
/*
41
* This is the RPC task struct
42
*/
43
struct
rpc_task
{
44
atomic_t
tk_count
;
/* Reference count */
45
struct
list_head
tk_task
;
/* global list of tasks */
46
struct
rpc_clnt
*
tk_client
;
/* RPC client */
47
struct
rpc_rqst *
tk_rqstp
;
/* RPC request */
48
49
/*
50
* RPC call state
51
*/
52
struct
rpc_message
tk_msg
;
/* RPC call info */
53
54
/*
55
* callback to be executed after waking up
56
* action next procedure for async tasks
57
* tk_ops caller callbacks
58
*/
59
void
(*
tk_callback
)(
struct
rpc_task
*);
60
void
(*
tk_action
)(
struct
rpc_task
*);
61
const
struct
rpc_call_ops
*
tk_ops
;
62
void
*
tk_calldata
;
63
64
unsigned
long
tk_timeout
;
/* timeout for rpc_sleep() */
65
unsigned
long
tk_runstate
;
/* Task run status */
66
struct
workqueue_struct
*
tk_workqueue
;
/* Normally rpciod, but could
67
* be any workqueue
68
*/
69
struct
rpc_wait_queue
*
tk_waitqueue
;
/* RPC wait queue we're on */
70
union
{
71
struct
work_struct
tk_work
;
/* Async task work queue */
72
struct
rpc_wait
tk_wait
;
/* RPC wait */
73
}
u
;
74
75
ktime_t
tk_start
;
/* RPC task init timestamp */
76
77
pid_t
tk_owner
;
/* Process id for batching tasks */
78
int
tk_status
;
/* result of last operation */
79
unsigned
short
tk_flags
;
/* misc flags */
80
unsigned
short
tk_timeouts
;
/* maj timeouts */
81
82
#ifdef RPC_DEBUG
83
unsigned
short
tk_pid;
/* debugging aid */
84
#endif
85
unsigned
char
tk_priority
: 2,
/* Task priority */
86
tk_garb_retry
: 2,
87
tk_cred_retry
: 2,
88
tk_rebind_retry
: 2;
89
};
90
#define tk_xprt tk_client->cl_xprt
91
92
/* support walking a list of tasks on a wait queue */
93
#define task_for_each(task, pos, head) \
94
list_for_each(pos, head) \
95
if ((task=list_entry(pos, struct rpc_task, u.tk_wait.list)),1)
96
97
#define task_for_first(task, head) \
98
if (!list_empty(head) && \
99
((task=list_entry((head)->next, struct rpc_task, u.tk_wait.list)),1))
100
101
typedef
void
(*
rpc_action
)(
struct
rpc_task
*);
102
103
struct
rpc_call_ops
{
104
void
(*
rpc_call_prepare
)(
struct
rpc_task
*,
void
*);
105
void
(*
rpc_call_done
)(
struct
rpc_task
*,
void
*);
106
void
(*
rpc_count_stats
)(
struct
rpc_task
*,
void
*);
107
void
(*
rpc_release
)(
void
*);
108
};
109
110
struct
rpc_task_setup
{
111
struct
rpc_task
*
task
;
112
struct
rpc_clnt
*
rpc_client
;
113
const
struct
rpc_message
*
rpc_message
;
114
const
struct
rpc_call_ops
*
callback_ops
;
115
void
*
callback_data
;
116
struct
workqueue_struct
*
workqueue
;
117
unsigned
short
flags
;
118
signed
char
priority
;
119
};
120
121
/*
122
* RPC task flags
123
*/
124
#define RPC_TASK_ASYNC 0x0001
/* is an async task */
125
#define RPC_TASK_SWAPPER 0x0002
/* is swapping in/out */
126
#define RPC_CALL_MAJORSEEN 0x0020
/* major timeout seen */
127
#define RPC_TASK_ROOTCREDS 0x0040
/* force root creds */
128
#define RPC_TASK_DYNAMIC 0x0080
/* task was kmalloc'ed */
129
#define RPC_TASK_KILLED 0x0100
/* task was killed */
130
#define RPC_TASK_SOFT 0x0200
/* Use soft timeouts */
131
#define RPC_TASK_SOFTCONN 0x0400
/* Fail if can't connect */
132
#define RPC_TASK_SENT 0x0800
/* message was sent */
133
#define RPC_TASK_TIMEOUT 0x1000
/* fail with ETIMEDOUT on timeout */
134
135
#define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC)
136
#define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER)
137
#define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS)
138
#define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED)
139
#define RPC_IS_SOFT(t) ((t)->tk_flags & (RPC_TASK_SOFT|RPC_TASK_TIMEOUT))
140
#define RPC_IS_SOFTCONN(t) ((t)->tk_flags & RPC_TASK_SOFTCONN)
141
#define RPC_WAS_SENT(t) ((t)->tk_flags & RPC_TASK_SENT)
142
143
#define RPC_TASK_RUNNING 0
144
#define RPC_TASK_QUEUED 1
145
#define RPC_TASK_ACTIVE 2
146
147
#define RPC_IS_RUNNING(t) test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)
148
#define rpc_set_running(t) set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)
149
#define rpc_test_and_set_running(t) \
150
test_and_set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)
151
#define rpc_clear_running(t) \
152
do { \
153
smp_mb__before_clear_bit(); \
154
clear_bit(RPC_TASK_RUNNING, &(t)->tk_runstate); \
155
smp_mb__after_clear_bit(); \
156
} while (0)
157
158
#define RPC_IS_QUEUED(t) test_bit(RPC_TASK_QUEUED, &(t)->tk_runstate)
159
#define rpc_set_queued(t) set_bit(RPC_TASK_QUEUED, &(t)->tk_runstate)
160
#define rpc_clear_queued(t) \
161
do { \
162
smp_mb__before_clear_bit(); \
163
clear_bit(RPC_TASK_QUEUED, &(t)->tk_runstate); \
164
smp_mb__after_clear_bit(); \
165
} while (0)
166
167
#define RPC_IS_ACTIVATED(t) test_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate)
168
169
/*
170
* Task priorities.
171
* Note: if you change these, you must also change
172
* the task initialization definitions below.
173
*/
174
#define RPC_PRIORITY_LOW (-1)
175
#define RPC_PRIORITY_NORMAL (0)
176
#define RPC_PRIORITY_HIGH (1)
177
#define RPC_PRIORITY_PRIVILEGED (2)
178
#define RPC_NR_PRIORITY (1 + RPC_PRIORITY_PRIVILEGED - RPC_PRIORITY_LOW)
179
180
struct
rpc_timer
{
181
struct
timer_list
timer
;
182
struct
list_head
list
;
183
unsigned
long
expires
;
184
};
185
186
/*
187
* RPC synchronization objects
188
*/
189
struct
rpc_wait_queue
{
190
spinlock_t
lock
;
191
struct
list_head
tasks
[
RPC_NR_PRIORITY
];
/* task queue for each priority level */
192
pid_t
owner
;
/* process id of last task serviced */
193
unsigned
char
maxpriority
;
/* maximum priority (0 if queue is not a priority queue) */
194
unsigned
char
priority
;
/* current priority */
195
unsigned
char
count
;
/* # task groups remaining serviced so far */
196
unsigned
char
nr
;
/* # tasks remaining for cookie */
197
unsigned
short
qlen
;
/* total # tasks waiting in queue */
198
struct
rpc_timer
timer_list
;
199
#if defined(RPC_DEBUG) || defined(RPC_TRACEPOINTS)
200
const
char
*
name
;
201
#endif
202
};
203
204
/*
205
* This is the # requests to send consecutively
206
* from a single cookie. The aim is to improve
207
* performance of NFS operations such as read/write.
208
*/
209
#define RPC_BATCH_COUNT 16
210
#define RPC_IS_PRIORITY(q) ((q)->maxpriority > 0)
211
212
/*
213
* Function prototypes
214
*/
215
struct
rpc_task
*
rpc_new_task
(
const
struct
rpc_task_setup
*);
216
struct
rpc_task
*
rpc_run_task
(
const
struct
rpc_task_setup
*);
217
struct
rpc_task
*
rpc_run_bc_task
(
struct
rpc_rqst *
req
,
218
const
struct
rpc_call_ops
*ops);
219
void
rpc_put_task
(
struct
rpc_task
*);
220
void
rpc_put_task_async
(
struct
rpc_task
*);
221
void
rpc_exit_task
(
struct
rpc_task
*);
222
void
rpc_exit
(
struct
rpc_task
*,
int
);
223
void
rpc_release_calldata
(
const
struct
rpc_call_ops
*,
void
*);
224
void
rpc_killall_tasks
(
struct
rpc_clnt
*);
225
void
rpc_execute
(
struct
rpc_task
*);
226
void
rpc_init_priority_wait_queue
(
struct
rpc_wait_queue
*,
const
char
*);
227
void
rpc_init_wait_queue
(
struct
rpc_wait_queue
*,
const
char
*);
228
void
rpc_destroy_wait_queue
(
struct
rpc_wait_queue
*);
229
void
rpc_sleep_on
(
struct
rpc_wait_queue
*,
struct
rpc_task
*,
230
rpc_action
action
);
231
void
rpc_sleep_on_priority
(
struct
rpc_wait_queue
*,
232
struct
rpc_task
*,
233
rpc_action
action
,
234
int
priority
);
235
void
rpc_wake_up_queued_task
(
struct
rpc_wait_queue
*,
236
struct
rpc_task
*);
237
void
rpc_wake_up
(
struct
rpc_wait_queue
*);
238
struct
rpc_task
*
rpc_wake_up_next
(
struct
rpc_wait_queue
*);
239
struct
rpc_task
*
rpc_wake_up_first
(
struct
rpc_wait_queue
*,
240
bool
(*)(
struct
rpc_task
*,
void
*),
241
void
*);
242
void
rpc_wake_up_status
(
struct
rpc_wait_queue
*,
int
);
243
int
rpc_queue_empty
(
struct
rpc_wait_queue
*);
244
void
rpc_delay
(
struct
rpc_task
*,
unsigned
long
);
245
void
*
rpc_malloc
(
struct
rpc_task
*,
size_t
);
246
void
rpc_free
(
void
*);
247
int
rpciod_up
(
void
);
248
void
rpciod_down
(
void
);
249
int
__rpc_wait_for_completion_task
(
struct
rpc_task
*
task
,
int
(*)(
void
*));
250
#ifdef RPC_DEBUG
251
struct
net
;
252
void
rpc_show_tasks(
struct
net
*);
253
#endif
254
int
rpc_init_mempool
(
void
);
255
void
rpc_destroy_mempool
(
void
);
256
extern
struct
workqueue_struct
*
rpciod_workqueue
;
257
void
rpc_prepare_task
(
struct
rpc_task
*task);
258
259
static
inline
int
rpc_wait_for_completion_task(
struct
rpc_task
*task)
260
{
261
return
__rpc_wait_for_completion_task
(task,
NULL
);
262
}
263
264
static
inline
void
rpc_task_set_priority(
struct
rpc_task
*task,
unsigned
char
prio
)
265
{
266
task->
tk_priority
= prio -
RPC_PRIORITY_LOW
;
267
}
268
269
static
inline
int
rpc_task_has_priority(
struct
rpc_task
*task,
unsigned
char
prio
)
270
{
271
return
(task->
tk_priority
+
RPC_PRIORITY_LOW
== prio);
272
}
273
274
#if defined(RPC_DEBUG) || defined (RPC_TRACEPOINTS)
275
static
inline
const
char
* rpc_qname(
const
struct
rpc_wait_queue
*
q
)
276
{
277
return
((q && q->name) ? q->name :
"unknown"
);
278
}
279
280
static
inline
void
rpc_assign_waitqueue_name(
struct
rpc_wait_queue
*q,
281
const
char
*
name
)
282
{
283
q->name =
name
;
284
}
285
#else
286
static
inline
void
rpc_assign_waitqueue_name(
struct
rpc_wait_queue
*q,
287
const
char
*
name
)
288
{
289
}
290
#endif
291
292
#endif
/* _LINUX_SUNRPC_SCHED_H_ */
Generated on Thu Jan 10 2013 14:50:51 for Linux Kernel by
1.8.2