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