These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / linux / sunrpc / svc.h
index fae6fb9..cc0fc71 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;
@@ -54,6 +49,25 @@ struct svc_pool {
        unsigned long           sp_flags;
 } ____cacheline_aligned_in_smp;
 
+struct svc_serv;
+
+struct svc_serv_ops {
+       /* Callback to use when last thread exits. */
+       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;
+};
+
 /*
  * RPC service.
  *
@@ -85,16 +99,7 @@ struct svc_serv {
 
        unsigned int            sv_nrpools;     /* number of thread pools */
        struct svc_pool *       sv_pools;       /* array of thread pools */
-
-       void                    (*sv_shutdown)(struct svc_serv *serv,
-                                              struct net *net);
-                                               /* Callback to use when last thread
-                                                * exits.
-                                                */
-
-       struct module *         sv_module;      /* optional module to count when
-                                                * adding threads */
-       svc_thread_fn           sv_function;    /* main function for threads */
+       struct svc_serv_ops     *sv_ops;        /* server operations */
 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
        struct list_head        sv_cb_list;     /* queue for callback requests
                                                 * that arrive over the same
@@ -422,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.
  */
@@ -429,13 +457,17 @@ int svc_rpcb_setup(struct svc_serv *serv, struct net *net);
 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,
-                           void (*shutdown)(struct svc_serv *, struct net *net));
+                           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,
-                       void (*shutdown)(struct svc_serv *, struct net *net),
-                       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 *);