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 <
[email protected]
>
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