Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[firefly-linux-kernel-4.4.55.git] / include / linux / sunrpc / svc.h
index 2e682f636b1370e608018b31da2dedca537ab509..cc0fc712bb8238e27446dc92899906e55cff4de7 100644 (file)
 #include <linux/wait.h>
 #include <linux/mm.h>
 
-/*
- * This is the RPC server thread function prototype
- */
-typedef int            (*svc_thread_fn)(void *);
-
 /* statistics for svc_pool structures */
 struct svc_pool_stats {
        atomic_long_t   packets;
@@ -58,7 +53,19 @@ struct svc_serv;
 
 struct svc_serv_ops {
        /* Callback to use when last thread exits. */
-       void    (*svo_shutdown)(struct svc_serv *serv, struct net *net);
+       void            (*svo_shutdown)(struct svc_serv *, struct net *);
+
+       /* function for service threads to run */
+       int             (*svo_function)(void *);
+
+       /* 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) */
+       struct module   *svo_module;
 };
 
 /*
@@ -93,9 +100,6 @@ struct svc_serv {
        unsigned int            sv_nrpools;     /* number of thread pools */
        struct svc_pool *       sv_pools;       /* array of thread pools */
        struct svc_serv_ops     *sv_ops;        /* server operations */
-       struct module *         sv_module;      /* optional module to count when
-                                                * adding threads */
-       svc_thread_fn           sv_function;    /* main function for threads */
 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
        struct list_head        sv_cb_list;     /* queue for callback requests
                                                 * that arrive over the same
@@ -423,6 +427,29 @@ struct svc_procedure {
        unsigned int            pc_xdrressize;  /* maximum size of XDR reply */
 };
 
+/*
+ * 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.
  */
@@ -431,11 +458,16 @@ void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net);
 int svc_bind(struct svc_serv *serv, struct net *net);
 struct svc_serv *svc_create(struct svc_program *, unsigned int,
                            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_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,
-                       struct svc_serv_ops *, svc_thread_fn, struct module *);
+                       struct svc_serv_ops *);
 int               svc_set_num_threads(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 *);