diff options
Diffstat (limited to 'include/linux/sunrpc/svc.h')
| -rw-r--r-- | include/linux/sunrpc/svc.h | 79 | 
1 files changed, 39 insertions, 40 deletions
| diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 0ae28ae6caf2..f35c22b3355f 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -64,10 +64,9 @@ struct svc_serv_ops {  	/* queue up a transport for servicing */  	void		(*svo_enqueue_xprt)(struct svc_xprt *); -	/* set up thread (or whatever) execution context */ -	int		(*svo_setup)(struct svc_serv *, struct svc_pool *, int); - -	/* optional module to count when adding threads (pooled svcs only) */ +	/* optional module to count when adding threads. +	 * Thread function must call module_put_and_kthread_exit() to exit. +	 */  	struct module	*svo_module;  }; @@ -85,6 +84,7 @@ struct svc_serv {  	struct svc_program *	sv_program;	/* RPC program */  	struct svc_stat *	sv_stats;	/* RPC statistics */  	spinlock_t		sv_lock; +	struct kref		sv_refcnt;  	unsigned int		sv_nrthreads;	/* # of server threads */  	unsigned int		sv_maxconn;	/* max connections allowed or  						 * '0' causing max to be based @@ -114,15 +114,43 @@ struct svc_serv {  #endif /* CONFIG_SUNRPC_BACKCHANNEL */  }; -/* - * We use sv_nrthreads as a reference count.  svc_destroy() drops - * this refcount, so we need to bump it up around operations that - * change the number of threads.  Horrible, but there it is. - * Should be called with the "service mutex" held. +/** + * svc_get() - increment reference count on a SUNRPC serv + * @serv:  the svc_serv to have count incremented + * + * Returns: the svc_serv that was passed in. + */ +static inline struct svc_serv *svc_get(struct svc_serv *serv) +{ +	kref_get(&serv->sv_refcnt); +	return serv; +} + +void svc_destroy(struct kref *); + +/** + * svc_put - decrement reference count on a SUNRPC serv + * @serv:  the svc_serv to have count decremented + * + * When the reference count reaches zero, svc_destroy() + * is called to clean up and free the serv. + */ +static inline void svc_put(struct svc_serv *serv) +{ +	kref_put(&serv->sv_refcnt, svc_destroy); +} + +/** + * svc_put_not_last - decrement non-final reference count on SUNRPC serv + * @serv:  the svc_serv to have count decremented + * + * Returns: %true is refcount was decremented. + * + * If the refcount is 1, it is not decremented and instead failure is reported.   */ -static inline void svc_get(struct svc_serv *serv) +static inline bool svc_put_not_last(struct svc_serv *serv)  { -	serv->sv_nrthreads++; +	return refcount_dec_not_one(&serv->sv_refcnt.refcount);  }  /* @@ -469,29 +497,6 @@ struct svc_procedure {  };  /* - * Mode for mapping cpus to pools. - */ -enum { -	SVC_POOL_AUTO = -1,	/* choose one of the others */ -	SVC_POOL_GLOBAL,	/* no mapping, just a single global pool -				 * (legacy & UP mode) */ -	SVC_POOL_PERCPU,	/* one pool per cpu */ -	SVC_POOL_PERNODE	/* one pool per numa node */ -}; - -struct svc_pool_map { -	int count;			/* How many svc_servs use us */ -	int mode;			/* Note: int not enum to avoid -					 * warnings about "enumeration value -					 * not handled in switch" */ -	unsigned int npools; -	unsigned int *pool_to;		/* maps pool id to cpu or node */ -	unsigned int *to_pool;		/* maps cpu or node to pool id */ -}; - -extern struct svc_pool_map svc_pool_map; - -/*   * Function prototypes.   */  int svc_rpcb_setup(struct svc_serv *serv, struct net *net); @@ -501,20 +506,14 @@ struct svc_serv *svc_create(struct svc_program *, unsigned int,  			    const struct svc_serv_ops *);  struct svc_rqst *svc_rqst_alloc(struct svc_serv *serv,  					struct svc_pool *pool, int node); -struct svc_rqst *svc_prepare_thread(struct svc_serv *serv, -					struct svc_pool *pool, int node);  void		   svc_rqst_replace_page(struct svc_rqst *rqstp,  					 struct page *page);  void		   svc_rqst_free(struct svc_rqst *);  void		   svc_exit_thread(struct svc_rqst *); -unsigned int	   svc_pool_map_get(void); -void		   svc_pool_map_put(void);  struct svc_serv *  svc_create_pooled(struct svc_program *, unsigned int,  			const struct svc_serv_ops *);  int		   svc_set_num_threads(struct svc_serv *, struct svc_pool *, int); -int		   svc_set_num_threads_sync(struct svc_serv *, struct svc_pool *, int);  int		   svc_pool_stats_open(struct svc_serv *serv, struct file *file); -void		   svc_destroy(struct svc_serv *);  void		   svc_shutdown_net(struct svc_serv *, struct net *);  int		   svc_process(struct svc_rqst *);  int		   bc_svc_process(struct svc_serv *, struct rpc_rqst *, |