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