cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sched.h (9883B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * linux/include/linux/sunrpc/sched.h
      4 *
      5 * Scheduling primitives for kernel Sun RPC.
      6 *
      7 * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
      8 */
      9
     10#ifndef _LINUX_SUNRPC_SCHED_H_
     11#define _LINUX_SUNRPC_SCHED_H_
     12
     13#include <linux/timer.h>
     14#include <linux/ktime.h>
     15#include <linux/sunrpc/types.h>
     16#include <linux/spinlock.h>
     17#include <linux/wait_bit.h>
     18#include <linux/workqueue.h>
     19#include <linux/sunrpc/xdr.h>
     20
     21/*
     22 * This is the actual RPC procedure call info.
     23 */
     24struct rpc_procinfo;
     25struct rpc_message {
     26	const struct rpc_procinfo *rpc_proc;	/* Procedure information */
     27	void *			rpc_argp;	/* Arguments */
     28	void *			rpc_resp;	/* Result */
     29	const struct cred *	rpc_cred;	/* Credentials */
     30};
     31
     32struct rpc_call_ops;
     33struct rpc_wait_queue;
     34struct rpc_wait {
     35	struct list_head	list;		/* wait queue links */
     36	struct list_head	links;		/* Links to related tasks */
     37	struct list_head	timer_list;	/* Timer list */
     38};
     39
     40/*
     41 * This is the RPC task struct
     42 */
     43struct rpc_task {
     44	atomic_t		tk_count;	/* Reference count */
     45	int			tk_status;	/* result of last operation */
     46	struct list_head	tk_task;	/* global list of tasks */
     47
     48	/*
     49	 * callback	to be executed after waking up
     50	 * action	next procedure for async tasks
     51	 */
     52	void			(*tk_callback)(struct rpc_task *);
     53	void			(*tk_action)(struct rpc_task *);
     54
     55	unsigned long		tk_timeout;	/* timeout for rpc_sleep() */
     56	unsigned long		tk_runstate;	/* Task run status */
     57
     58	struct rpc_wait_queue 	*tk_waitqueue;	/* RPC wait queue we're on */
     59	union {
     60		struct work_struct	tk_work;	/* Async task work queue */
     61		struct rpc_wait		tk_wait;	/* RPC wait */
     62	} u;
     63
     64	int			tk_rpc_status;	/* Result of last RPC operation */
     65
     66	/*
     67	 * RPC call state
     68	 */
     69	struct rpc_message	tk_msg;		/* RPC call info */
     70	void *			tk_calldata;	/* Caller private data */
     71	const struct rpc_call_ops *tk_ops;	/* Caller callbacks */
     72
     73	struct rpc_clnt *	tk_client;	/* RPC client */
     74	struct rpc_xprt *	tk_xprt;	/* Transport */
     75	struct rpc_cred *	tk_op_cred;	/* cred being operated on */
     76
     77	struct rpc_rqst *	tk_rqstp;	/* RPC request */
     78
     79	struct workqueue_struct	*tk_workqueue;	/* Normally rpciod, but could
     80						 * be any workqueue
     81						 */
     82	ktime_t			tk_start;	/* RPC task init timestamp */
     83
     84	pid_t			tk_owner;	/* Process id for batching tasks */
     85	unsigned short		tk_flags;	/* misc flags */
     86	unsigned short		tk_timeouts;	/* maj timeouts */
     87
     88#if IS_ENABLED(CONFIG_SUNRPC_DEBUG) || IS_ENABLED(CONFIG_TRACEPOINTS)
     89	unsigned short		tk_pid;		/* debugging aid */
     90#endif
     91	unsigned char		tk_priority : 2,/* Task priority */
     92				tk_garb_retry : 2,
     93				tk_cred_retry : 2,
     94				tk_rebind_retry : 2;
     95};
     96
     97typedef void			(*rpc_action)(struct rpc_task *);
     98
     99struct rpc_call_ops {
    100	void (*rpc_call_prepare)(struct rpc_task *, void *);
    101	void (*rpc_call_done)(struct rpc_task *, void *);
    102	void (*rpc_count_stats)(struct rpc_task *, void *);
    103	void (*rpc_release)(void *);
    104};
    105
    106struct rpc_task_setup {
    107	struct rpc_task *task;
    108	struct rpc_clnt *rpc_client;
    109	struct rpc_xprt *rpc_xprt;
    110	struct rpc_cred *rpc_op_cred;	/* credential being operated on */
    111	const struct rpc_message *rpc_message;
    112	const struct rpc_call_ops *callback_ops;
    113	void *callback_data;
    114	struct workqueue_struct *workqueue;
    115	unsigned short flags;
    116	signed char priority;
    117};
    118
    119/*
    120 * RPC task flags
    121 */
    122#define RPC_TASK_ASYNC		0x0001		/* is an async task */
    123#define RPC_TASK_SWAPPER	0x0002		/* is swapping in/out */
    124#define RPC_TASK_MOVEABLE	0x0004		/* nfs4.1+ rpc tasks */
    125#define RPC_TASK_NULLCREDS	0x0010		/* Use AUTH_NULL credential */
    126#define RPC_CALL_MAJORSEEN	0x0020		/* major timeout seen */
    127#define RPC_TASK_DYNAMIC	0x0080		/* task was kmalloc'ed */
    128#define	RPC_TASK_NO_ROUND_ROBIN	0x0100		/* send requests on "main" xprt */
    129#define RPC_TASK_SOFT		0x0200		/* Use soft timeouts */
    130#define RPC_TASK_SOFTCONN	0x0400		/* Fail if can't connect */
    131#define RPC_TASK_SENT		0x0800		/* message was sent */
    132#define RPC_TASK_TIMEOUT	0x1000		/* fail with ETIMEDOUT on timeout */
    133#define RPC_TASK_NOCONNECT	0x2000		/* return ENOTCONN if not connected */
    134#define RPC_TASK_NO_RETRANS_TIMEOUT	0x4000		/* wait forever for a reply */
    135#define RPC_TASK_CRED_NOREF	0x8000		/* No refcount on the credential */
    136
    137#define RPC_IS_ASYNC(t)		((t)->tk_flags & RPC_TASK_ASYNC)
    138#define RPC_IS_SWAPPER(t)	((t)->tk_flags & RPC_TASK_SWAPPER)
    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#define RPC_IS_MOVEABLE(t)	((t)->tk_flags & RPC_TASK_MOVEABLE)
    143
    144#define RPC_TASK_RUNNING	0
    145#define RPC_TASK_QUEUED		1
    146#define RPC_TASK_ACTIVE		2
    147#define RPC_TASK_NEED_XMIT	3
    148#define RPC_TASK_NEED_RECV	4
    149#define RPC_TASK_MSG_PIN_WAIT	5
    150#define RPC_TASK_SIGNALLED	6
    151
    152#define rpc_test_and_set_running(t) \
    153				test_and_set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)
    154#define rpc_clear_running(t)	clear_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)
    155
    156#define RPC_IS_QUEUED(t)	test_bit(RPC_TASK_QUEUED, &(t)->tk_runstate)
    157#define rpc_set_queued(t)	set_bit(RPC_TASK_QUEUED, &(t)->tk_runstate)
    158#define rpc_clear_queued(t)	clear_bit(RPC_TASK_QUEUED, &(t)->tk_runstate)
    159
    160#define RPC_IS_ACTIVATED(t)	test_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate)
    161
    162#define RPC_SIGNALLED(t)	test_bit(RPC_TASK_SIGNALLED, &(t)->tk_runstate)
    163
    164/*
    165 * Task priorities.
    166 * Note: if you change these, you must also change
    167 * the task initialization definitions below.
    168 */
    169#define RPC_PRIORITY_LOW	(-1)
    170#define RPC_PRIORITY_NORMAL	(0)
    171#define RPC_PRIORITY_HIGH	(1)
    172#define RPC_PRIORITY_PRIVILEGED	(2)
    173#define RPC_NR_PRIORITY		(1 + RPC_PRIORITY_PRIVILEGED - RPC_PRIORITY_LOW)
    174
    175struct rpc_timer {
    176	struct list_head list;
    177	unsigned long expires;
    178	struct delayed_work dwork;
    179};
    180
    181/*
    182 * RPC synchronization objects
    183 */
    184struct rpc_wait_queue {
    185	spinlock_t		lock;
    186	struct list_head	tasks[RPC_NR_PRIORITY];	/* task queue for each priority level */
    187	unsigned char		maxpriority;		/* maximum priority (0 if queue is not a priority queue) */
    188	unsigned char		priority;		/* current priority */
    189	unsigned char		nr;			/* # tasks remaining for cookie */
    190	unsigned short		qlen;			/* total # tasks waiting in queue */
    191	struct rpc_timer	timer_list;
    192#if IS_ENABLED(CONFIG_SUNRPC_DEBUG) || IS_ENABLED(CONFIG_TRACEPOINTS)
    193	const char *		name;
    194#endif
    195};
    196
    197/*
    198 * This is the # requests to send consecutively
    199 * from a single cookie.  The aim is to improve
    200 * performance of NFS operations such as read/write.
    201 */
    202#define RPC_IS_PRIORITY(q)		((q)->maxpriority > 0)
    203
    204/*
    205 * Function prototypes
    206 */
    207struct rpc_task *rpc_new_task(const struct rpc_task_setup *);
    208struct rpc_task *rpc_run_task(const struct rpc_task_setup *);
    209struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req);
    210void		rpc_put_task(struct rpc_task *);
    211void		rpc_put_task_async(struct rpc_task *);
    212void		rpc_signal_task(struct rpc_task *);
    213void		rpc_exit_task(struct rpc_task *);
    214void		rpc_exit(struct rpc_task *, int);
    215void		rpc_release_calldata(const struct rpc_call_ops *, void *);
    216void		rpc_killall_tasks(struct rpc_clnt *);
    217void		rpc_execute(struct rpc_task *);
    218void		rpc_init_priority_wait_queue(struct rpc_wait_queue *, const char *);
    219void		rpc_init_wait_queue(struct rpc_wait_queue *, const char *);
    220void		rpc_destroy_wait_queue(struct rpc_wait_queue *);
    221unsigned long	rpc_task_timeout(const struct rpc_task *task);
    222void		rpc_sleep_on_timeout(struct rpc_wait_queue *queue,
    223					struct rpc_task *task,
    224					rpc_action action,
    225					unsigned long timeout);
    226void		rpc_sleep_on(struct rpc_wait_queue *, struct rpc_task *,
    227					rpc_action action);
    228void		rpc_sleep_on_priority_timeout(struct rpc_wait_queue *queue,
    229					struct rpc_task *task,
    230					unsigned long timeout,
    231					int priority);
    232void		rpc_sleep_on_priority(struct rpc_wait_queue *,
    233					struct rpc_task *,
    234					int priority);
    235void		rpc_wake_up_queued_task(struct rpc_wait_queue *,
    236					struct rpc_task *);
    237void		rpc_wake_up_queued_task_set_status(struct rpc_wait_queue *,
    238						   struct rpc_task *,
    239						   int);
    240void		rpc_wake_up(struct rpc_wait_queue *);
    241struct rpc_task *rpc_wake_up_next(struct rpc_wait_queue *);
    242struct rpc_task *rpc_wake_up_first_on_wq(struct workqueue_struct *wq,
    243					struct rpc_wait_queue *,
    244					bool (*)(struct rpc_task *, void *),
    245					void *);
    246struct rpc_task *rpc_wake_up_first(struct rpc_wait_queue *,
    247					bool (*)(struct rpc_task *, void *),
    248					void *);
    249void		rpc_wake_up_status(struct rpc_wait_queue *, int);
    250void		rpc_delay(struct rpc_task *, unsigned long);
    251int		rpc_malloc(struct rpc_task *);
    252void		rpc_free(struct rpc_task *);
    253int		rpciod_up(void);
    254void		rpciod_down(void);
    255int		__rpc_wait_for_completion_task(struct rpc_task *task, wait_bit_action_f *);
    256#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
    257struct net;
    258void		rpc_show_tasks(struct net *);
    259#endif
    260int		rpc_init_mempool(void);
    261void		rpc_destroy_mempool(void);
    262extern struct workqueue_struct *rpciod_workqueue;
    263extern struct workqueue_struct *xprtiod_workqueue;
    264void		rpc_prepare_task(struct rpc_task *task);
    265gfp_t		rpc_task_gfp_mask(void);
    266
    267static inline int rpc_wait_for_completion_task(struct rpc_task *task)
    268{
    269	return __rpc_wait_for_completion_task(task, NULL);
    270}
    271
    272#if IS_ENABLED(CONFIG_SUNRPC_DEBUG) || IS_ENABLED(CONFIG_TRACEPOINTS)
    273static inline const char * rpc_qname(const struct rpc_wait_queue *q)
    274{
    275	return ((q && q->name) ? q->name : "unknown");
    276}
    277
    278static inline void rpc_assign_waitqueue_name(struct rpc_wait_queue *q,
    279		const char *name)
    280{
    281	q->name = name;
    282}
    283#else
    284static inline void rpc_assign_waitqueue_name(struct rpc_wait_queue *q,
    285		const char *name)
    286{
    287}
    288#endif
    289
    290#if IS_ENABLED(CONFIG_SUNRPC_SWAP)
    291int rpc_clnt_swap_activate(struct rpc_clnt *clnt);
    292void rpc_clnt_swap_deactivate(struct rpc_clnt *clnt);
    293#else
    294static inline int
    295rpc_clnt_swap_activate(struct rpc_clnt *clnt)
    296{
    297	return -EINVAL;
    298}
    299
    300static inline void
    301rpc_clnt_swap_deactivate(struct rpc_clnt *clnt)
    302{
    303}
    304#endif /* CONFIG_SUNRPC_SWAP */
    305
    306#endif /* _LINUX_SUNRPC_SCHED_H_ */