LCOV - code coverage report
Current view: top level - net/sunrpc - svc.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 404 0.0 %
Date: 2014-04-07 Functions: 0 32 0.0 %
Branches: 0 288 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * linux/net/sunrpc/svc.c
       3                 :            :  *
       4                 :            :  * High-level RPC service routines
       5                 :            :  *
       6                 :            :  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
       7                 :            :  *
       8                 :            :  * Multiple threads pools and NUMAisation
       9                 :            :  * Copyright (c) 2006 Silicon Graphics, Inc.
      10                 :            :  * by Greg Banks <gnb@melbourne.sgi.com>
      11                 :            :  */
      12                 :            : 
      13                 :            : #include <linux/linkage.h>
      14                 :            : #include <linux/sched.h>
      15                 :            : #include <linux/errno.h>
      16                 :            : #include <linux/net.h>
      17                 :            : #include <linux/in.h>
      18                 :            : #include <linux/mm.h>
      19                 :            : #include <linux/interrupt.h>
      20                 :            : #include <linux/module.h>
      21                 :            : #include <linux/kthread.h>
      22                 :            : #include <linux/slab.h>
      23                 :            : 
      24                 :            : #include <linux/sunrpc/types.h>
      25                 :            : #include <linux/sunrpc/xdr.h>
      26                 :            : #include <linux/sunrpc/stats.h>
      27                 :            : #include <linux/sunrpc/svcsock.h>
      28                 :            : #include <linux/sunrpc/clnt.h>
      29                 :            : #include <linux/sunrpc/bc_xprt.h>
      30                 :            : 
      31                 :            : #define RPCDBG_FACILITY RPCDBG_SVCDSP
      32                 :            : 
      33                 :            : static void svc_unregister(const struct svc_serv *serv, struct net *net);
      34                 :            : 
      35                 :            : #define svc_serv_is_pooled(serv)    ((serv)->sv_function)
      36                 :            : 
      37                 :            : /*
      38                 :            :  * Mode for mapping cpus to pools.
      39                 :            :  */
      40                 :            : enum {
      41                 :            :         SVC_POOL_AUTO = -1,     /* choose one of the others */
      42                 :            :         SVC_POOL_GLOBAL,        /* no mapping, just a single global pool
      43                 :            :                                  * (legacy & UP mode) */
      44                 :            :         SVC_POOL_PERCPU,        /* one pool per cpu */
      45                 :            :         SVC_POOL_PERNODE        /* one pool per numa node */
      46                 :            : };
      47                 :            : #define SVC_POOL_DEFAULT        SVC_POOL_GLOBAL
      48                 :            : 
      49                 :            : /*
      50                 :            :  * Structure for mapping cpus to pools and vice versa.
      51                 :            :  * Setup once during sunrpc initialisation.
      52                 :            :  */
      53                 :            : static struct svc_pool_map {
      54                 :            :         int count;                      /* How many svc_servs use us */
      55                 :            :         int mode;                       /* Note: int not enum to avoid
      56                 :            :                                          * warnings about "enumeration value
      57                 :            :                                          * not handled in switch" */
      58                 :            :         unsigned int npools;
      59                 :            :         unsigned int *pool_to;          /* maps pool id to cpu or node */
      60                 :            :         unsigned int *to_pool;          /* maps cpu or node to pool id */
      61                 :            : } svc_pool_map = {
      62                 :            :         .count = 0,
      63                 :            :         .mode = SVC_POOL_DEFAULT
      64                 :            : };
      65                 :            : static DEFINE_MUTEX(svc_pool_map_mutex);/* protects svc_pool_map.count only */
      66                 :            : 
      67                 :            : static int
      68                 :          0 : param_set_pool_mode(const char *val, struct kernel_param *kp)
      69                 :            : {
      70                 :          0 :         int *ip = (int *)kp->arg;
      71                 :            :         struct svc_pool_map *m = &svc_pool_map;
      72                 :            :         int err;
      73                 :            : 
      74                 :          0 :         mutex_lock(&svc_pool_map_mutex);
      75                 :            : 
      76                 :            :         err = -EBUSY;
      77         [ #  # ]:          0 :         if (m->count)
      78                 :            :                 goto out;
      79                 :            : 
      80                 :            :         err = 0;
      81         [ #  # ]:          0 :         if (!strncmp(val, "auto", 4))
      82                 :          0 :                 *ip = SVC_POOL_AUTO;
      83         [ #  # ]:          0 :         else if (!strncmp(val, "global", 6))
      84                 :          0 :                 *ip = SVC_POOL_GLOBAL;
      85         [ #  # ]:          0 :         else if (!strncmp(val, "percpu", 6))
      86                 :          0 :                 *ip = SVC_POOL_PERCPU;
      87         [ #  # ]:          0 :         else if (!strncmp(val, "pernode", 7))
      88                 :          0 :                 *ip = SVC_POOL_PERNODE;
      89                 :            :         else
      90                 :            :                 err = -EINVAL;
      91                 :            : 
      92                 :            : out:
      93                 :          0 :         mutex_unlock(&svc_pool_map_mutex);
      94                 :          0 :         return err;
      95                 :            : }
      96                 :            : 
      97                 :            : static int
      98                 :          0 : param_get_pool_mode(char *buf, struct kernel_param *kp)
      99                 :            : {
     100                 :          0 :         int *ip = (int *)kp->arg;
     101                 :            : 
     102   [ #  #  #  #  :          0 :         switch (*ip)
                      # ]
     103                 :            :         {
     104                 :            :         case SVC_POOL_AUTO:
     105                 :          0 :                 return strlcpy(buf, "auto", 20);
     106                 :            :         case SVC_POOL_GLOBAL:
     107                 :          0 :                 return strlcpy(buf, "global", 20);
     108                 :            :         case SVC_POOL_PERCPU:
     109                 :          0 :                 return strlcpy(buf, "percpu", 20);
     110                 :            :         case SVC_POOL_PERNODE:
     111                 :          0 :                 return strlcpy(buf, "pernode", 20);
     112                 :            :         default:
     113                 :          0 :                 return sprintf(buf, "%d", *ip);
     114                 :            :         }
     115                 :            : }
     116                 :            : 
     117                 :            : module_param_call(pool_mode, param_set_pool_mode, param_get_pool_mode,
     118                 :            :                  &svc_pool_map.mode, 0644);
     119                 :            : 
     120                 :            : /*
     121                 :            :  * Detect best pool mapping mode heuristically,
     122                 :            :  * according to the machine's topology.
     123                 :            :  */
     124                 :            : static int
     125                 :          0 : svc_pool_map_choose_mode(void)
     126                 :            : {
     127                 :            :         unsigned int node;
     128                 :            : 
     129                 :            :         if (nr_online_nodes > 1) {
     130                 :            :                 /*
     131                 :            :                  * Actually have multiple NUMA nodes,
     132                 :            :                  * so split pools on NUMA node boundaries
     133                 :            :                  */
     134                 :            :                 return SVC_POOL_PERNODE;
     135                 :            :         }
     136                 :            : 
     137                 :            :         node = first_online_node;
     138         [ #  # ]:          0 :         if (nr_cpus_node(node) > 2) {
     139                 :            :                 /*
     140                 :            :                  * Non-trivial SMP, or CONFIG_NUMA on
     141                 :            :                  * non-NUMA hardware, e.g. with a generic
     142                 :            :                  * x86_64 kernel on Xeons.  In this case we
     143                 :            :                  * want to divide the pools on cpu boundaries.
     144                 :            :                  */
     145                 :            :                 return SVC_POOL_PERCPU;
     146                 :            :         }
     147                 :            : 
     148                 :            :         /* default: one global pool */
     149                 :          0 :         return SVC_POOL_GLOBAL;
     150                 :            : }
     151                 :            : 
     152                 :            : /*
     153                 :            :  * Allocate the to_pool[] and pool_to[] arrays.
     154                 :            :  * Returns 0 on success or an errno.
     155                 :            :  */
     156                 :            : static int
     157                 :          0 : svc_pool_map_alloc_arrays(struct svc_pool_map *m, unsigned int maxpools)
     158                 :            : {
     159                 :          0 :         m->to_pool = kcalloc(maxpools, sizeof(unsigned int), GFP_KERNEL);
     160         [ #  # ]:          0 :         if (!m->to_pool)
     161                 :            :                 goto fail;
     162                 :          0 :         m->pool_to = kcalloc(maxpools, sizeof(unsigned int), GFP_KERNEL);
     163         [ #  # ]:          0 :         if (!m->pool_to)
     164                 :            :                 goto fail_free;
     165                 :            : 
     166                 :            :         return 0;
     167                 :            : 
     168                 :            : fail_free:
     169                 :          0 :         kfree(m->to_pool);
     170                 :          0 :         m->to_pool = NULL;
     171                 :            : fail:
     172                 :            :         return -ENOMEM;
     173                 :            : }
     174                 :            : 
     175                 :            : /*
     176                 :            :  * Initialise the pool map for SVC_POOL_PERCPU mode.
     177                 :            :  * Returns number of pools or <0 on error.
     178                 :            :  */
     179                 :            : static int
     180                 :          0 : svc_pool_map_init_percpu(struct svc_pool_map *m)
     181                 :            : {
     182                 :          0 :         unsigned int maxpools = nr_cpu_ids;
     183                 :            :         unsigned int pidx = 0;
     184                 :            :         unsigned int cpu;
     185                 :            :         int err;
     186                 :            : 
     187                 :          0 :         err = svc_pool_map_alloc_arrays(m, maxpools);
     188         [ #  # ]:          0 :         if (err)
     189                 :            :                 return err;
     190                 :            : 
     191         [ #  # ]:          0 :         for_each_online_cpu(cpu) {
     192         [ #  # ]:          0 :                 BUG_ON(pidx > maxpools);
     193                 :          0 :                 m->to_pool[cpu] = pidx;
     194                 :          0 :                 m->pool_to[pidx] = cpu;
     195                 :          0 :                 pidx++;
     196                 :            :         }
     197                 :            :         /* cpus brought online later all get mapped to pool0, sorry */
     198                 :            : 
     199                 :          0 :         return pidx;
     200                 :            : };
     201                 :            : 
     202                 :            : 
     203                 :            : /*
     204                 :            :  * Initialise the pool map for SVC_POOL_PERNODE mode.
     205                 :            :  * Returns number of pools or <0 on error.
     206                 :            :  */
     207                 :            : static int
     208                 :          0 : svc_pool_map_init_pernode(struct svc_pool_map *m)
     209                 :            : {
     210                 :            :         unsigned int maxpools = nr_node_ids;
     211                 :            :         unsigned int pidx = 0;
     212                 :            :         unsigned int node;
     213                 :            :         int err;
     214                 :            : 
     215                 :          0 :         err = svc_pool_map_alloc_arrays(m, maxpools);
     216         [ #  # ]:          0 :         if (err)
     217                 :            :                 return err;
     218                 :            : 
     219 [ #  # ][ #  # ]:          0 :         for_each_node_with_cpus(node) {
     220                 :            :                 /* some architectures (e.g. SN2) have cpuless nodes */
     221         [ #  # ]:          0 :                 BUG_ON(pidx > maxpools);
     222                 :          0 :                 m->to_pool[node] = pidx;
     223                 :          0 :                 m->pool_to[pidx] = node;
     224                 :          0 :                 pidx++;
     225                 :            :         }
     226                 :            :         /* nodes brought online later all get mapped to pool0, sorry */
     227                 :            : 
     228                 :          0 :         return pidx;
     229                 :            : }
     230                 :            : 
     231                 :            : 
     232                 :            : /*
     233                 :            :  * Add a reference to the global map of cpus to pools (and
     234                 :            :  * vice versa).  Initialise the map if we're the first user.
     235                 :            :  * Returns the number of pools.
     236                 :            :  */
     237                 :            : static unsigned int
     238                 :          0 : svc_pool_map_get(void)
     239                 :            : {
     240                 :            :         struct svc_pool_map *m = &svc_pool_map;
     241                 :            :         int npools = -1;
     242                 :            : 
     243                 :          0 :         mutex_lock(&svc_pool_map_mutex);
     244                 :            : 
     245         [ #  # ]:          0 :         if (m->count++) {
     246                 :          0 :                 mutex_unlock(&svc_pool_map_mutex);
     247                 :          0 :                 return m->npools;
     248                 :            :         }
     249                 :            : 
     250         [ #  # ]:          0 :         if (m->mode == SVC_POOL_AUTO)
     251                 :          0 :                 m->mode = svc_pool_map_choose_mode();
     252                 :            : 
     253      [ #  #  # ]:          0 :         switch (m->mode) {
     254                 :            :         case SVC_POOL_PERCPU:
     255                 :          0 :                 npools = svc_pool_map_init_percpu(m);
     256                 :          0 :                 break;
     257                 :            :         case SVC_POOL_PERNODE:
     258                 :          0 :                 npools = svc_pool_map_init_pernode(m);
     259                 :          0 :                 break;
     260                 :            :         }
     261                 :            : 
     262         [ #  # ]:          0 :         if (npools < 0) {
     263                 :            :                 /* default, or memory allocation failure */
     264                 :            :                 npools = 1;
     265                 :          0 :                 m->mode = SVC_POOL_GLOBAL;
     266                 :            :         }
     267                 :          0 :         m->npools = npools;
     268                 :            : 
     269                 :          0 :         mutex_unlock(&svc_pool_map_mutex);
     270                 :          0 :         return m->npools;
     271                 :            : }
     272                 :            : 
     273                 :            : 
     274                 :            : /*
     275                 :            :  * Drop a reference to the global map of cpus to pools.
     276                 :            :  * When the last reference is dropped, the map data is
     277                 :            :  * freed; this allows the sysadmin to change the pool
     278                 :            :  * mode using the pool_mode module option without
     279                 :            :  * rebooting or re-loading sunrpc.ko.
     280                 :            :  */
     281                 :            : static void
     282                 :          0 : svc_pool_map_put(void)
     283                 :            : {
     284                 :            :         struct svc_pool_map *m = &svc_pool_map;
     285                 :            : 
     286                 :          0 :         mutex_lock(&svc_pool_map_mutex);
     287                 :            : 
     288         [ #  # ]:          0 :         if (!--m->count) {
     289                 :          0 :                 kfree(m->to_pool);
     290                 :          0 :                 m->to_pool = NULL;
     291                 :          0 :                 kfree(m->pool_to);
     292                 :          0 :                 m->pool_to = NULL;
     293                 :          0 :                 m->npools = 0;
     294                 :            :         }
     295                 :            : 
     296                 :          0 :         mutex_unlock(&svc_pool_map_mutex);
     297                 :          0 : }
     298                 :            : 
     299                 :            : 
     300                 :            : static int svc_pool_map_get_node(unsigned int pidx)
     301                 :            : {
     302                 :            :         const struct svc_pool_map *m = &svc_pool_map;
     303                 :            : 
     304         [ #  # ]:          0 :         if (m->count) {
     305         [ #  # ]:          0 :                 if (m->mode == SVC_POOL_PERCPU)
     306                 :            :                         return cpu_to_node(m->pool_to[pidx]);
     307         [ #  # ]:          0 :                 if (m->mode == SVC_POOL_PERNODE)
     308                 :          0 :                         return m->pool_to[pidx];
     309                 :            :         }
     310                 :            :         return NUMA_NO_NODE;
     311                 :            : }
     312                 :            : /*
     313                 :            :  * Set the given thread's cpus_allowed mask so that it
     314                 :            :  * will only run on cpus in the given pool.
     315                 :            :  */
     316                 :            : static inline void
     317                 :            : svc_pool_map_set_cpumask(struct task_struct *task, unsigned int pidx)
     318                 :            : {
     319                 :            :         struct svc_pool_map *m = &svc_pool_map;
     320                 :          0 :         unsigned int node = m->pool_to[pidx];
     321                 :            : 
     322                 :            :         /*
     323                 :            :          * The caller checks for sv_nrpools > 1, which
     324                 :            :          * implies that we've been initialized.
     325                 :            :          */
     326 [ #  # ][ #  # ]:          0 :         WARN_ON_ONCE(m->count == 0);
                 [ #  # ]
     327         [ #  # ]:          0 :         if (m->count == 0)
     328                 :            :                 return;
     329                 :            : 
     330      [ #  #  # ]:          0 :         switch (m->mode) {
     331                 :            :         case SVC_POOL_PERCPU:
     332                 :            :         {
     333                 :          0 :                 set_cpus_allowed_ptr(task, cpumask_of(node));
     334                 :            :                 break;
     335                 :            :         }
     336                 :            :         case SVC_POOL_PERNODE:
     337                 :            :         {
     338                 :          0 :                 set_cpus_allowed_ptr(task, cpumask_of_node(node));
     339                 :            :                 break;
     340                 :            :         }
     341                 :            :         }
     342                 :            : }
     343                 :            : 
     344                 :            : /*
     345                 :            :  * Use the mapping mode to choose a pool for a given CPU.
     346                 :            :  * Used when enqueueing an incoming RPC.  Always returns
     347                 :            :  * a non-NULL pool pointer.
     348                 :            :  */
     349                 :            : struct svc_pool *
     350                 :          0 : svc_pool_for_cpu(struct svc_serv *serv, int cpu)
     351                 :            : {
     352                 :            :         struct svc_pool_map *m = &svc_pool_map;
     353                 :            :         unsigned int pidx = 0;
     354                 :            : 
     355                 :            :         /*
     356                 :            :          * An uninitialised map happens in a pure client when
     357                 :            :          * lockd is brought up, so silently treat it the
     358                 :            :          * same as SVC_POOL_GLOBAL.
     359                 :            :          */
     360         [ #  # ]:          0 :         if (svc_serv_is_pooled(serv)) {
     361      [ #  #  # ]:          0 :                 switch (m->mode) {
     362                 :            :                 case SVC_POOL_PERCPU:
     363                 :          0 :                         pidx = m->to_pool[cpu];
     364                 :          0 :                         break;
     365                 :            :                 case SVC_POOL_PERNODE:
     366                 :          0 :                         pidx = m->to_pool[cpu_to_node(cpu)];
     367                 :          0 :                         break;
     368                 :            :                 }
     369                 :            :         }
     370                 :          0 :         return &serv->sv_pools[pidx % serv->sv_nrpools];
     371                 :            : }
     372                 :            : 
     373                 :          0 : int svc_rpcb_setup(struct svc_serv *serv, struct net *net)
     374                 :            : {
     375                 :            :         int err;
     376                 :            : 
     377                 :          0 :         err = rpcb_create_local(net);
     378         [ #  # ]:          0 :         if (err)
     379                 :            :                 return err;
     380                 :            : 
     381                 :            :         /* Remove any stale portmap registrations */
     382                 :          0 :         svc_unregister(serv, net);
     383                 :          0 :         return 0;
     384                 :            : }
     385                 :            : EXPORT_SYMBOL_GPL(svc_rpcb_setup);
     386                 :            : 
     387                 :          0 : void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net)
     388                 :            : {
     389                 :          0 :         svc_unregister(serv, net);
     390                 :          0 :         rpcb_put_local(net);
     391                 :          0 : }
     392                 :            : EXPORT_SYMBOL_GPL(svc_rpcb_cleanup);
     393                 :            : 
     394                 :          0 : static int svc_uses_rpcbind(struct svc_serv *serv)
     395                 :            : {
     396                 :            :         struct svc_program      *progp;
     397                 :            :         unsigned int            i;
     398                 :            : 
     399         [ #  # ]:          0 :         for (progp = serv->sv_program; progp; progp = progp->pg_next) {
     400         [ #  # ]:          0 :                 for (i = 0; i < progp->pg_nvers; i++) {
     401         [ #  # ]:          0 :                         if (progp->pg_vers[i] == NULL)
     402                 :          0 :                                 continue;
     403         [ #  # ]:          0 :                         if (progp->pg_vers[i]->vs_hidden == 0)
     404                 :            :                                 return 1;
     405                 :            :                 }
     406                 :            :         }
     407                 :            : 
     408                 :            :         return 0;
     409                 :            : }
     410                 :            : 
     411                 :          0 : int svc_bind(struct svc_serv *serv, struct net *net)
     412                 :            : {
     413         [ #  # ]:          0 :         if (!svc_uses_rpcbind(serv))
     414                 :            :                 return 0;
     415                 :          0 :         return svc_rpcb_setup(serv, net);
     416                 :            : }
     417                 :            : EXPORT_SYMBOL_GPL(svc_bind);
     418                 :            : 
     419                 :            : /*
     420                 :            :  * Create an RPC service
     421                 :            :  */
     422                 :            : static struct svc_serv *
     423                 :          0 : __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
     424                 :            :              void (*shutdown)(struct svc_serv *serv, struct net *net))
     425                 :            : {
     426                 :          0 :         struct svc_serv *serv;
     427                 :            :         unsigned int vers;
     428                 :            :         unsigned int xdrsize;
     429                 :            :         unsigned int i;
     430                 :            : 
     431         [ #  # ]:          0 :         if (!(serv = kzalloc(sizeof(*serv), GFP_KERNEL)))
     432                 :            :                 return NULL;
     433                 :          0 :         serv->sv_name      = prog->pg_name;
     434                 :          0 :         serv->sv_program   = prog;
     435                 :          0 :         serv->sv_nrthreads = 1;
     436                 :          0 :         serv->sv_stats     = prog->pg_stats;
     437         [ #  # ]:          0 :         if (bufsize > RPCSVC_MAXPAYLOAD)
     438                 :            :                 bufsize = RPCSVC_MAXPAYLOAD;
     439         [ #  # ]:          0 :         serv->sv_max_payload = bufsize? bufsize : 4096;
     440                 :          0 :         serv->sv_max_mesg  = roundup(serv->sv_max_payload + PAGE_SIZE, PAGE_SIZE);
     441                 :          0 :         serv->sv_shutdown  = shutdown;
     442                 :            :         xdrsize = 0;
     443         [ #  # ]:          0 :         while (prog) {
     444                 :          0 :                 prog->pg_lovers = prog->pg_nvers-1;
     445         [ #  # ]:          0 :                 for (vers=0; vers<prog->pg_nvers ; vers++)
     446         [ #  # ]:          0 :                         if (prog->pg_vers[vers]) {
     447                 :          0 :                                 prog->pg_hivers = vers;
     448         [ #  # ]:          0 :                                 if (prog->pg_lovers > vers)
     449                 :          0 :                                         prog->pg_lovers = vers;
     450         [ #  # ]:          0 :                                 if (prog->pg_vers[vers]->vs_xdrsize > xdrsize)
     451                 :            :                                         xdrsize = prog->pg_vers[vers]->vs_xdrsize;
     452                 :            :                         }
     453                 :          0 :                 prog = prog->pg_next;
     454                 :            :         }
     455                 :          0 :         serv->sv_xdrsize   = xdrsize;
     456                 :          0 :         INIT_LIST_HEAD(&serv->sv_tempsocks);
     457                 :          0 :         INIT_LIST_HEAD(&serv->sv_permsocks);
     458                 :          0 :         init_timer(&serv->sv_temptimer);
     459                 :          0 :         spin_lock_init(&serv->sv_lock);
     460                 :            : 
     461                 :          0 :         serv->sv_nrpools = npools;
     462                 :          0 :         serv->sv_pools =
     463                 :            :                 kcalloc(serv->sv_nrpools, sizeof(struct svc_pool),
     464                 :            :                         GFP_KERNEL);
     465         [ #  # ]:          0 :         if (!serv->sv_pools) {
     466                 :          0 :                 kfree(serv);
     467                 :          0 :                 return NULL;
     468                 :            :         }
     469                 :            : 
     470         [ #  # ]:          0 :         for (i = 0; i < serv->sv_nrpools; i++) {
     471                 :          0 :                 struct svc_pool *pool = &serv->sv_pools[i];
     472                 :            : 
     473                 :            :                 dprintk("svc: initialising pool %u for %s\n",
     474                 :            :                                 i, serv->sv_name);
     475                 :            : 
     476                 :          0 :                 pool->sp_id = i;
     477                 :          0 :                 INIT_LIST_HEAD(&pool->sp_threads);
     478                 :          0 :                 INIT_LIST_HEAD(&pool->sp_sockets);
     479                 :          0 :                 INIT_LIST_HEAD(&pool->sp_all_threads);
     480                 :          0 :                 spin_lock_init(&pool->sp_lock);
     481                 :            :         }
     482                 :            : 
     483 [ #  # ][ #  # ]:          0 :         if (svc_uses_rpcbind(serv) && (!serv->sv_shutdown))
     484                 :          0 :                 serv->sv_shutdown = svc_rpcb_cleanup;
     485                 :            : 
     486                 :          0 :         return serv;
     487                 :            : }
     488                 :            : 
     489                 :            : struct svc_serv *
     490                 :          0 : svc_create(struct svc_program *prog, unsigned int bufsize,
     491                 :            :            void (*shutdown)(struct svc_serv *serv, struct net *net))
     492                 :            : {
     493                 :          0 :         return __svc_create(prog, bufsize, /*npools*/1, shutdown);
     494                 :            : }
     495                 :            : EXPORT_SYMBOL_GPL(svc_create);
     496                 :            : 
     497                 :            : struct svc_serv *
     498                 :          0 : svc_create_pooled(struct svc_program *prog, unsigned int bufsize,
     499                 :            :                   void (*shutdown)(struct svc_serv *serv, struct net *net),
     500                 :            :                   svc_thread_fn func, struct module *mod)
     501                 :            : {
     502                 :            :         struct svc_serv *serv;
     503                 :          0 :         unsigned int npools = svc_pool_map_get();
     504                 :            : 
     505                 :          0 :         serv = __svc_create(prog, bufsize, npools, shutdown);
     506                 :            : 
     507         [ #  # ]:          0 :         if (serv != NULL) {
     508                 :          0 :                 serv->sv_function = func;
     509                 :          0 :                 serv->sv_module = mod;
     510                 :            :         }
     511                 :            : 
     512                 :          0 :         return serv;
     513                 :            : }
     514                 :            : EXPORT_SYMBOL_GPL(svc_create_pooled);
     515                 :            : 
     516                 :          0 : void svc_shutdown_net(struct svc_serv *serv, struct net *net)
     517                 :            : {
     518                 :          0 :         svc_close_net(serv, net);
     519                 :            : 
     520         [ #  # ]:          0 :         if (serv->sv_shutdown)
     521                 :          0 :                 serv->sv_shutdown(serv, net);
     522                 :          0 : }
     523                 :            : EXPORT_SYMBOL_GPL(svc_shutdown_net);
     524                 :            : 
     525                 :            : /*
     526                 :            :  * Destroy an RPC service. Should be called with appropriate locking to
     527                 :            :  * protect the sv_nrthreads, sv_permsocks and sv_tempsocks.
     528                 :            :  */
     529                 :            : void
     530                 :          0 : svc_destroy(struct svc_serv *serv)
     531                 :            : {
     532                 :            :         dprintk("svc: svc_destroy(%s, %d)\n",
     533                 :            :                                 serv->sv_program->pg_name,
     534                 :            :                                 serv->sv_nrthreads);
     535                 :            : 
     536         [ #  # ]:          0 :         if (serv->sv_nrthreads) {
     537         [ #  # ]:          0 :                 if (--(serv->sv_nrthreads) != 0) {
     538                 :          0 :                         svc_sock_update_bufs(serv);
     539                 :          0 :                         return;
     540                 :            :                 }
     541                 :            :         } else
     542                 :          0 :                 printk("svc_destroy: no threads for serv=%p!\n", serv);
     543                 :            : 
     544                 :          0 :         del_timer_sync(&serv->sv_temptimer);
     545                 :            : 
     546                 :            :         /*
     547                 :            :          * The last user is gone and thus all sockets have to be destroyed to
     548                 :            :          * the point. Check this.
     549                 :            :          */
     550         [ #  # ]:          0 :         BUG_ON(!list_empty(&serv->sv_permsocks));
     551         [ #  # ]:          0 :         BUG_ON(!list_empty(&serv->sv_tempsocks));
     552                 :            : 
     553                 :          0 :         cache_clean_deferred(serv);
     554                 :            : 
     555         [ #  # ]:          0 :         if (svc_serv_is_pooled(serv))
     556                 :          0 :                 svc_pool_map_put();
     557                 :            : 
     558                 :          0 :         kfree(serv->sv_pools);
     559                 :          0 :         kfree(serv);
     560                 :            : }
     561                 :            : EXPORT_SYMBOL_GPL(svc_destroy);
     562                 :            : 
     563                 :            : /*
     564                 :            :  * Allocate an RPC server's buffer space.
     565                 :            :  * We allocate pages and place them in rq_argpages.
     566                 :            :  */
     567                 :            : static int
     568                 :          0 : svc_init_buffer(struct svc_rqst *rqstp, unsigned int size, int node)
     569                 :            : {
     570                 :            :         unsigned int pages, arghi;
     571                 :            : 
     572                 :            :         /* bc_xprt uses fore channel allocated buffers */
     573                 :            :         if (svc_is_backchannel(rqstp))
     574                 :            :                 return 1;
     575                 :            : 
     576                 :          0 :         pages = size / PAGE_SIZE + 1; /* extra page as we hold both request and reply.
     577                 :            :                                        * We assume one is at most one page
     578                 :            :                                        */
     579                 :            :         arghi = 0;
     580 [ #  # ][ #  # ]:          0 :         WARN_ON_ONCE(pages > RPCSVC_MAXPAGES);
                 [ #  # ]
     581         [ #  # ]:          0 :         if (pages > RPCSVC_MAXPAGES)
     582                 :            :                 pages = RPCSVC_MAXPAGES;
     583         [ #  # ]:          0 :         while (pages) {
     584                 :            :                 struct page *p = alloc_pages_node(node, GFP_KERNEL, 0);
     585         [ #  # ]:          0 :                 if (!p)
     586                 :            :                         break;
     587                 :          0 :                 rqstp->rq_pages[arghi++] = p;
     588                 :          0 :                 pages--;
     589                 :            :         }
     590                 :          0 :         return pages == 0;
     591                 :            : }
     592                 :            : 
     593                 :            : /*
     594                 :            :  * Release an RPC server buffer
     595                 :            :  */
     596                 :            : static void
     597                 :          0 : svc_release_buffer(struct svc_rqst *rqstp)
     598                 :            : {
     599                 :            :         unsigned int i;
     600                 :            : 
     601         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(rqstp->rq_pages); i++)
     602         [ #  # ]:          0 :                 if (rqstp->rq_pages[i])
     603                 :          0 :                         put_page(rqstp->rq_pages[i]);
     604                 :          0 : }
     605                 :            : 
     606                 :            : struct svc_rqst *
     607                 :          0 : svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
     608                 :            : {
     609                 :            :         struct svc_rqst *rqstp;
     610                 :            : 
     611                 :            :         rqstp = kzalloc_node(sizeof(*rqstp), GFP_KERNEL, node);
     612         [ #  # ]:          0 :         if (!rqstp)
     613                 :            :                 goto out_enomem;
     614                 :            : 
     615                 :          0 :         init_waitqueue_head(&rqstp->rq_wait);
     616                 :            : 
     617                 :          0 :         serv->sv_nrthreads++;
     618                 :            :         spin_lock_bh(&pool->sp_lock);
     619                 :          0 :         pool->sp_nrthreads++;
     620                 :          0 :         list_add(&rqstp->rq_all, &pool->sp_all_threads);
     621                 :            :         spin_unlock_bh(&pool->sp_lock);
     622                 :          0 :         rqstp->rq_server = serv;
     623                 :          0 :         rqstp->rq_pool = pool;
     624                 :            : 
     625                 :          0 :         rqstp->rq_argp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
     626         [ #  # ]:          0 :         if (!rqstp->rq_argp)
     627                 :            :                 goto out_thread;
     628                 :            : 
     629                 :          0 :         rqstp->rq_resp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
     630         [ #  # ]:          0 :         if (!rqstp->rq_resp)
     631                 :            :                 goto out_thread;
     632                 :            : 
     633         [ #  # ]:          0 :         if (!svc_init_buffer(rqstp, serv->sv_max_mesg, node))
     634                 :            :                 goto out_thread;
     635                 :            : 
     636                 :            :         return rqstp;
     637                 :            : out_thread:
     638                 :          0 :         svc_exit_thread(rqstp);
     639                 :            : out_enomem:
     640                 :            :         return ERR_PTR(-ENOMEM);
     641                 :            : }
     642                 :            : EXPORT_SYMBOL_GPL(svc_prepare_thread);
     643                 :            : 
     644                 :            : /*
     645                 :            :  * Choose a pool in which to create a new thread, for svc_set_num_threads
     646                 :            :  */
     647                 :            : static inline struct svc_pool *
     648                 :            : choose_pool(struct svc_serv *serv, struct svc_pool *pool, unsigned int *state)
     649                 :            : {
     650         [ #  # ]:          0 :         if (pool != NULL)
     651                 :            :                 return pool;
     652                 :            : 
     653                 :          0 :         return &serv->sv_pools[(*state)++ % serv->sv_nrpools];
     654                 :            : }
     655                 :            : 
     656                 :            : /*
     657                 :            :  * Choose a thread to kill, for svc_set_num_threads
     658                 :            :  */
     659                 :            : static inline struct task_struct *
     660                 :            : choose_victim(struct svc_serv *serv, struct svc_pool *pool, unsigned int *state)
     661                 :            : {
     662                 :            :         unsigned int i;
     663                 :            :         struct task_struct *task = NULL;
     664                 :            : 
     665         [ #  # ]:          0 :         if (pool != NULL) {
     666                 :            :                 spin_lock_bh(&pool->sp_lock);
     667                 :            :         } else {
     668                 :            :                 /* choose a pool in round-robin fashion */
     669         [ #  # ]:          0 :                 for (i = 0; i < serv->sv_nrpools; i++) {
     670                 :          0 :                         pool = &serv->sv_pools[--(*state) % serv->sv_nrpools];
     671                 :            :                         spin_lock_bh(&pool->sp_lock);
     672         [ #  # ]:          0 :                         if (!list_empty(&pool->sp_all_threads))
     673                 :            :                                 goto found_pool;
     674                 :            :                         spin_unlock_bh(&pool->sp_lock);
     675                 :            :                 }
     676                 :            :                 return NULL;
     677                 :            :         }
     678                 :            : 
     679                 :            : found_pool:
     680         [ #  # ]:          0 :         if (!list_empty(&pool->sp_all_threads)) {
     681                 :            :                 struct svc_rqst *rqstp;
     682                 :            : 
     683                 :            :                 /*
     684                 :            :                  * Remove from the pool->sp_all_threads list
     685                 :            :                  * so we don't try to kill it again.
     686                 :            :                  */
     687                 :            :                 rqstp = list_entry(pool->sp_all_threads.next, struct svc_rqst, rq_all);
     688                 :          0 :                 list_del_init(&rqstp->rq_all);
     689                 :          0 :                 task = rqstp->rq_task;
     690                 :            :         }
     691                 :            :         spin_unlock_bh(&pool->sp_lock);
     692                 :            : 
     693                 :            :         return task;
     694                 :            : }
     695                 :            : 
     696                 :            : /*
     697                 :            :  * Create or destroy enough new threads to make the number
     698                 :            :  * of threads the given number.  If `pool' is non-NULL, applies
     699                 :            :  * only to threads in that pool, otherwise round-robins between
     700                 :            :  * all pools.  Caller must ensure that mutual exclusion between this and
     701                 :            :  * server startup or shutdown.
     702                 :            :  *
     703                 :            :  * Destroying threads relies on the service threads filling in
     704                 :            :  * rqstp->rq_task, which only the nfs ones do.  Assumes the serv
     705                 :            :  * has been created using svc_create_pooled().
     706                 :            :  *
     707                 :            :  * Based on code that used to be in nfsd_svc() but tweaked
     708                 :            :  * to be pool-aware.
     709                 :            :  */
     710                 :            : int
     711                 :          0 : svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
     712                 :            : {
     713                 :            :         struct svc_rqst *rqstp;
     714                 :            :         struct task_struct *task;
     715                 :            :         struct svc_pool *chosen_pool;
     716                 :            :         int error = 0;
     717                 :          0 :         unsigned int state = serv->sv_nrthreads-1;
     718                 :            :         int node;
     719                 :            : 
     720         [ #  # ]:          0 :         if (pool == NULL) {
     721                 :            :                 /* The -1 assumes caller has done a svc_get() */
     722                 :          0 :                 nrservs -= (serv->sv_nrthreads-1);
     723                 :            :         } else {
     724                 :            :                 spin_lock_bh(&pool->sp_lock);
     725                 :          0 :                 nrservs -= pool->sp_nrthreads;
     726                 :            :                 spin_unlock_bh(&pool->sp_lock);
     727                 :            :         }
     728                 :            : 
     729                 :            :         /* create new threads */
     730         [ #  # ]:          0 :         while (nrservs > 0) {
     731                 :          0 :                 nrservs--;
     732                 :            :                 chosen_pool = choose_pool(serv, pool, &state);
     733                 :            : 
     734                 :          0 :                 node = svc_pool_map_get_node(chosen_pool->sp_id);
     735                 :          0 :                 rqstp = svc_prepare_thread(serv, chosen_pool, node);
     736         [ #  # ]:          0 :                 if (IS_ERR(rqstp)) {
     737                 :            :                         error = PTR_ERR(rqstp);
     738                 :          0 :                         break;
     739                 :            :                 }
     740                 :            : 
     741                 :          0 :                 __module_get(serv->sv_module);
     742                 :          0 :                 task = kthread_create_on_node(serv->sv_function, rqstp,
     743                 :            :                                               node, "%s", serv->sv_name);
     744         [ #  # ]:          0 :                 if (IS_ERR(task)) {
     745                 :            :                         error = PTR_ERR(task);
     746                 :          0 :                         module_put(serv->sv_module);
     747                 :          0 :                         svc_exit_thread(rqstp);
     748                 :          0 :                         break;
     749                 :            :                 }
     750                 :            : 
     751                 :          0 :                 rqstp->rq_task = task;
     752         [ #  # ]:          0 :                 if (serv->sv_nrpools > 1)
     753                 :          0 :                         svc_pool_map_set_cpumask(task, chosen_pool->sp_id);
     754                 :            : 
     755                 :          0 :                 svc_sock_update_bufs(serv);
     756                 :          0 :                 wake_up_process(task);
     757                 :            :         }
     758                 :            :         /* destroy old threads */
     759 [ #  # ][ #  # ]:          0 :         while (nrservs < 0 &&
     760                 :            :                (task = choose_victim(serv, pool, &state)) != NULL) {
     761                 :          0 :                 send_sig(SIGINT, task, 1);
     762                 :          0 :                 nrservs++;
     763                 :            :         }
     764                 :            : 
     765                 :          0 :         return error;
     766                 :            : }
     767                 :            : EXPORT_SYMBOL_GPL(svc_set_num_threads);
     768                 :            : 
     769                 :            : /*
     770                 :            :  * Called from a server thread as it's exiting. Caller must hold the BKL or
     771                 :            :  * the "service mutex", whichever is appropriate for the service.
     772                 :            :  */
     773                 :            : void
     774                 :          0 : svc_exit_thread(struct svc_rqst *rqstp)
     775                 :            : {
     776                 :          0 :         struct svc_serv *serv = rqstp->rq_server;
     777                 :          0 :         struct svc_pool *pool = rqstp->rq_pool;
     778                 :            : 
     779                 :          0 :         svc_release_buffer(rqstp);
     780                 :          0 :         kfree(rqstp->rq_resp);
     781                 :          0 :         kfree(rqstp->rq_argp);
     782                 :          0 :         kfree(rqstp->rq_auth_data);
     783                 :            : 
     784                 :            :         spin_lock_bh(&pool->sp_lock);
     785                 :          0 :         pool->sp_nrthreads--;
     786                 :            :         list_del(&rqstp->rq_all);
     787                 :            :         spin_unlock_bh(&pool->sp_lock);
     788                 :            : 
     789                 :          0 :         kfree(rqstp);
     790                 :            : 
     791                 :            :         /* Release the server */
     792         [ #  # ]:          0 :         if (serv)
     793                 :          0 :                 svc_destroy(serv);
     794                 :          0 : }
     795                 :            : EXPORT_SYMBOL_GPL(svc_exit_thread);
     796                 :            : 
     797                 :            : /*
     798                 :            :  * Register an "inet" protocol family netid with the local
     799                 :            :  * rpcbind daemon via an rpcbind v4 SET request.
     800                 :            :  *
     801                 :            :  * No netconfig infrastructure is available in the kernel, so
     802                 :            :  * we map IP_ protocol numbers to netids by hand.
     803                 :            :  *
     804                 :            :  * Returns zero on success; a negative errno value is returned
     805                 :            :  * if any error occurs.
     806                 :            :  */
     807                 :          0 : static int __svc_rpcb_register4(struct net *net, const u32 program,
     808                 :            :                                 const u32 version,
     809                 :            :                                 const unsigned short protocol,
     810                 :            :                                 const unsigned short port)
     811                 :            : {
     812                 :          0 :         const struct sockaddr_in sin = {
     813                 :            :                 .sin_family             = AF_INET,
     814                 :            :                 .sin_addr.s_addr        = htonl(INADDR_ANY),
     815         [ #  # ]:          0 :                 .sin_port               = htons(port),
     816                 :            :         };
     817                 :            :         const char *netid;
     818                 :            :         int error;
     819                 :            : 
     820      [ #  #  # ]:          0 :         switch (protocol) {
     821                 :            :         case IPPROTO_UDP:
     822                 :            :                 netid = RPCBIND_NETID_UDP;
     823                 :            :                 break;
     824                 :            :         case IPPROTO_TCP:
     825                 :            :                 netid = RPCBIND_NETID_TCP;
     826                 :          0 :                 break;
     827                 :            :         default:
     828                 :            :                 return -ENOPROTOOPT;
     829                 :            :         }
     830                 :            : 
     831                 :          0 :         error = rpcb_v4_register(net, program, version,
     832                 :            :                                         (const struct sockaddr *)&sin, netid);
     833                 :            : 
     834                 :            :         /*
     835                 :            :          * User space didn't support rpcbind v4, so retry this
     836                 :            :          * registration request with the legacy rpcbind v2 protocol.
     837                 :            :          */
     838         [ #  # ]:          0 :         if (error == -EPROTONOSUPPORT)
     839                 :          0 :                 error = rpcb_register(net, program, version, protocol, port);
     840                 :            : 
     841                 :          0 :         return error;
     842                 :            : }
     843                 :            : 
     844                 :            : #if IS_ENABLED(CONFIG_IPV6)
     845                 :            : /*
     846                 :            :  * Register an "inet6" protocol family netid with the local
     847                 :            :  * rpcbind daemon via an rpcbind v4 SET request.
     848                 :            :  *
     849                 :            :  * No netconfig infrastructure is available in the kernel, so
     850                 :            :  * we map IP_ protocol numbers to netids by hand.
     851                 :            :  *
     852                 :            :  * Returns zero on success; a negative errno value is returned
     853                 :            :  * if any error occurs.
     854                 :            :  */
     855                 :          0 : static int __svc_rpcb_register6(struct net *net, const u32 program,
     856                 :            :                                 const u32 version,
     857                 :            :                                 const unsigned short protocol,
     858                 :            :                                 const unsigned short port)
     859                 :            : {
     860                 :          0 :         const struct sockaddr_in6 sin6 = {
     861                 :            :                 .sin6_family            = AF_INET6,
     862                 :            :                 .sin6_addr              = IN6ADDR_ANY_INIT,
     863         [ #  # ]:          0 :                 .sin6_port              = htons(port),
     864                 :            :         };
     865                 :            :         const char *netid;
     866                 :            :         int error;
     867                 :            : 
     868      [ #  #  # ]:          0 :         switch (protocol) {
     869                 :            :         case IPPROTO_UDP:
     870                 :            :                 netid = RPCBIND_NETID_UDP6;
     871                 :            :                 break;
     872                 :            :         case IPPROTO_TCP:
     873                 :            :                 netid = RPCBIND_NETID_TCP6;
     874                 :          0 :                 break;
     875                 :            :         default:
     876                 :            :                 return -ENOPROTOOPT;
     877                 :            :         }
     878                 :            : 
     879                 :          0 :         error = rpcb_v4_register(net, program, version,
     880                 :            :                                         (const struct sockaddr *)&sin6, netid);
     881                 :            : 
     882                 :            :         /*
     883                 :            :          * User space didn't support rpcbind version 4, so we won't
     884                 :            :          * use a PF_INET6 listener.
     885                 :            :          */
     886         [ #  # ]:          0 :         if (error == -EPROTONOSUPPORT)
     887                 :            :                 error = -EAFNOSUPPORT;
     888                 :            : 
     889                 :          0 :         return error;
     890                 :            : }
     891                 :            : #endif  /* IS_ENABLED(CONFIG_IPV6) */
     892                 :            : 
     893                 :            : /*
     894                 :            :  * Register a kernel RPC service via rpcbind version 4.
     895                 :            :  *
     896                 :            :  * Returns zero on success; a negative errno value is returned
     897                 :            :  * if any error occurs.
     898                 :            :  */
     899                 :          0 : static int __svc_register(struct net *net, const char *progname,
     900                 :            :                           const u32 program, const u32 version,
     901                 :            :                           const int family,
     902                 :            :                           const unsigned short protocol,
     903                 :            :                           const unsigned short port)
     904                 :            : {
     905                 :            :         int error = -EAFNOSUPPORT;
     906                 :            : 
     907      [ #  #  # ]:          0 :         switch (family) {
     908                 :            :         case PF_INET:
     909                 :          0 :                 error = __svc_rpcb_register4(net, program, version,
     910                 :            :                                                 protocol, port);
     911                 :          0 :                 break;
     912                 :            : #if IS_ENABLED(CONFIG_IPV6)
     913                 :            :         case PF_INET6:
     914                 :          0 :                 error = __svc_rpcb_register6(net, program, version,
     915                 :            :                                                 protocol, port);
     916                 :            : #endif
     917                 :            :         }
     918                 :            : 
     919         [ #  # ]:          0 :         if (error < 0)
     920                 :          0 :                 printk(KERN_WARNING "svc: failed to register %sv%u RPC "
     921                 :            :                         "service (errno %d).\n", progname, version, -error);
     922                 :          0 :         return error;
     923                 :            : }
     924                 :            : 
     925                 :            : /**
     926                 :            :  * svc_register - register an RPC service with the local portmapper
     927                 :            :  * @serv: svc_serv struct for the service to register
     928                 :            :  * @net: net namespace for the service to register
     929                 :            :  * @family: protocol family of service's listener socket
     930                 :            :  * @proto: transport protocol number to advertise
     931                 :            :  * @port: port to advertise
     932                 :            :  *
     933                 :            :  * Service is registered for any address in the passed-in protocol family
     934                 :            :  */
     935                 :          0 : int svc_register(const struct svc_serv *serv, struct net *net,
     936                 :            :                  const int family, const unsigned short proto,
     937                 :            :                  const unsigned short port)
     938                 :            : {
     939                 :            :         struct svc_program      *progp;
     940                 :            :         unsigned int            i;
     941                 :            :         int                     error = 0;
     942                 :            : 
     943 [ #  # ][ #  # ]:          0 :         WARN_ON_ONCE(proto == 0 && port == 0);
                 [ #  # ]
     944         [ #  # ]:          0 :         if (proto == 0 && port == 0)
     945                 :            :                 return -EINVAL;
     946                 :            : 
     947         [ #  # ]:          0 :         for (progp = serv->sv_program; progp; progp = progp->pg_next) {
     948         [ #  # ]:          0 :                 for (i = 0; i < progp->pg_nvers; i++) {
     949         [ #  # ]:          0 :                         if (progp->pg_vers[i] == NULL)
     950                 :          0 :                                 continue;
     951                 :            : 
     952                 :            :                         dprintk("svc: svc_register(%sv%d, %s, %u, %u)%s\n",
     953                 :            :                                         progp->pg_name,
     954                 :            :                                         i,
     955                 :            :                                         proto == IPPROTO_UDP?  "udp" : "tcp",
     956                 :            :                                         port,
     957                 :            :                                         family,
     958                 :            :                                         progp->pg_vers[i]->vs_hidden?
     959                 :            :                                                 " (but not telling portmap)" : "");
     960                 :            : 
     961         [ #  # ]:          0 :                         if (progp->pg_vers[i]->vs_hidden)
     962                 :          0 :                                 continue;
     963                 :            : 
     964                 :          0 :                         error = __svc_register(net, progp->pg_name, progp->pg_prog,
     965                 :            :                                                 i, family, proto, port);
     966         [ #  # ]:          0 :                         if (error < 0)
     967                 :            :                                 break;
     968                 :            :                 }
     969                 :            :         }
     970                 :            : 
     971                 :            :         return error;
     972                 :            : }
     973                 :            : 
     974                 :            : /*
     975                 :            :  * If user space is running rpcbind, it should take the v4 UNSET
     976                 :            :  * and clear everything for this [program, version].  If user space
     977                 :            :  * is running portmap, it will reject the v4 UNSET, but won't have
     978                 :            :  * any "inet6" entries anyway.  So a PMAP_UNSET should be sufficient
     979                 :            :  * in this case to clear all existing entries for [program, version].
     980                 :            :  */
     981                 :          0 : static void __svc_unregister(struct net *net, const u32 program, const u32 version,
     982                 :            :                              const char *progname)
     983                 :            : {
     984                 :            :         int error;
     985                 :            : 
     986                 :          0 :         error = rpcb_v4_register(net, program, version, NULL, "");
     987                 :            : 
     988                 :            :         /*
     989                 :            :          * User space didn't support rpcbind v4, so retry this
     990                 :            :          * request with the legacy rpcbind v2 protocol.
     991                 :            :          */
     992         [ #  # ]:          0 :         if (error == -EPROTONOSUPPORT)
     993                 :          0 :                 error = rpcb_register(net, program, version, 0, 0);
     994                 :            : 
     995                 :            :         dprintk("svc: %s(%sv%u), error %d\n",
     996                 :            :                         __func__, progname, version, error);
     997                 :          0 : }
     998                 :            : 
     999                 :            : /*
    1000                 :            :  * All netids, bind addresses and ports registered for [program, version]
    1001                 :            :  * are removed from the local rpcbind database (if the service is not
    1002                 :            :  * hidden) to make way for a new instance of the service.
    1003                 :            :  *
    1004                 :            :  * The result of unregistration is reported via dprintk for those who want
    1005                 :            :  * verification of the result, but is otherwise not important.
    1006                 :            :  */
    1007                 :          0 : static void svc_unregister(const struct svc_serv *serv, struct net *net)
    1008                 :            : {
    1009                 :            :         struct svc_program *progp;
    1010                 :            :         unsigned long flags;
    1011                 :            :         unsigned int i;
    1012                 :            : 
    1013                 :            :         clear_thread_flag(TIF_SIGPENDING);
    1014                 :            : 
    1015         [ #  # ]:          0 :         for (progp = serv->sv_program; progp; progp = progp->pg_next) {
    1016         [ #  # ]:          0 :                 for (i = 0; i < progp->pg_nvers; i++) {
    1017         [ #  # ]:          0 :                         if (progp->pg_vers[i] == NULL)
    1018                 :          0 :                                 continue;
    1019         [ #  # ]:          0 :                         if (progp->pg_vers[i]->vs_hidden)
    1020                 :          0 :                                 continue;
    1021                 :            : 
    1022                 :            :                         dprintk("svc: attempting to unregister %sv%u\n",
    1023                 :            :                                 progp->pg_name, i);
    1024                 :          0 :                         __svc_unregister(net, progp->pg_prog, i, progp->pg_name);
    1025                 :            :                 }
    1026                 :            :         }
    1027                 :            : 
    1028                 :          0 :         spin_lock_irqsave(&current->sighand->siglock, flags);
    1029                 :          0 :         recalc_sigpending();
    1030                 :          0 :         spin_unlock_irqrestore(&current->sighand->siglock, flags);
    1031                 :          0 : }
    1032                 :            : 
    1033                 :            : /*
    1034                 :            :  * dprintk the given error with the address of the client that caused it.
    1035                 :            :  */
    1036                 :            : #ifdef RPC_DEBUG
    1037                 :            : static __printf(2, 3)
    1038                 :            : void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
    1039                 :            : {
    1040                 :            :         struct va_format vaf;
    1041                 :            :         va_list args;
    1042                 :            :         char    buf[RPC_MAX_ADDRBUFLEN];
    1043                 :            : 
    1044                 :            :         va_start(args, fmt);
    1045                 :            : 
    1046                 :            :         vaf.fmt = fmt;
    1047                 :            :         vaf.va = &args;
    1048                 :            : 
    1049                 :            :         dprintk("svc: %s: %pV", svc_print_addr(rqstp, buf, sizeof(buf)), &vaf);
    1050                 :            : 
    1051                 :            :         va_end(args);
    1052                 :            : }
    1053                 :            : #else
    1054                 :            : static __printf(2,3) void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...) {}
    1055                 :            : #endif
    1056                 :            : 
    1057                 :            : /*
    1058                 :            :  * Common routine for processing the RPC request.
    1059                 :            :  */
    1060                 :            : static int
    1061                 :          0 : svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
    1062                 :            : {
    1063                 :            :         struct svc_program      *progp;
    1064                 :            :         struct svc_version      *versp = NULL;  /* compiler food */
    1065                 :            :         struct svc_procedure    *procp = NULL;
    1066                 :          0 :         struct svc_serv         *serv = rqstp->rq_server;
    1067                 :            :         kxdrproc_t              xdr;
    1068                 :            :         __be32                  *statp;
    1069                 :            :         u32                     prog, vers, proc;
    1070                 :            :         __be32                  auth_stat, rpc_stat;
    1071                 :            :         int                     auth_res;
    1072                 :            :         __be32                  *reply_statp;
    1073                 :            : 
    1074                 :            :         rpc_stat = rpc_success;
    1075                 :            : 
    1076         [ #  # ]:          0 :         if (argv->iov_len < 6*4)
    1077                 :            :                 goto err_short_len;
    1078                 :            : 
    1079                 :            :         /* Will be turned off only in gss privacy case: */
    1080                 :          0 :         rqstp->rq_splice_ok = 1;
    1081                 :            :         /* Will be turned off only when NFSv4 Sessions are used */
    1082                 :          0 :         rqstp->rq_usedeferral = 1;
    1083                 :          0 :         rqstp->rq_dropme = false;
    1084                 :            : 
    1085                 :            :         /* Setup reply header */
    1086                 :          0 :         rqstp->rq_xprt->xpt_ops->xpo_prep_reply_hdr(rqstp);
    1087                 :            : 
    1088                 :          0 :         svc_putu32(resv, rqstp->rq_xid);
    1089                 :            : 
    1090                 :            :         vers = svc_getnl(argv);
    1091                 :            : 
    1092                 :            :         /* First words of reply: */
    1093                 :            :         svc_putnl(resv, 1);             /* REPLY */
    1094                 :            : 
    1095         [ #  # ]:          0 :         if (vers != 2)          /* RPC version number */
    1096                 :            :                 goto err_bad_rpc;
    1097                 :            : 
    1098                 :            :         /* Save position in case we later decide to reject: */
    1099                 :          0 :         reply_statp = resv->iov_base + resv->iov_len;
    1100                 :            : 
    1101                 :            :         svc_putnl(resv, 0);             /* ACCEPT */
    1102                 :            : 
    1103                 :          0 :         rqstp->rq_prog = prog = svc_getnl(argv);     /* program number */
    1104                 :          0 :         rqstp->rq_vers = vers = svc_getnl(argv);     /* version number */
    1105                 :          0 :         rqstp->rq_proc = proc = svc_getnl(argv);     /* procedure number */
    1106                 :            : 
    1107         [ #  # ]:          0 :         for (progp = serv->sv_program; progp; progp = progp->pg_next)
    1108         [ #  # ]:          0 :                 if (prog == progp->pg_prog)
    1109                 :            :                         break;
    1110                 :            : 
    1111                 :            :         /*
    1112                 :            :          * Decode auth data, and add verifier to reply buffer.
    1113                 :            :          * We do this before anything else in order to get a decent
    1114                 :            :          * auth verifier.
    1115                 :            :          */
    1116                 :          0 :         auth_res = svc_authenticate(rqstp, &auth_stat);
    1117                 :            :         /* Also give the program a chance to reject this call: */
    1118         [ #  # ]:          0 :         if (auth_res == SVC_OK && progp) {
    1119                 :          0 :                 auth_stat = rpc_autherr_badcred;
    1120                 :          0 :                 auth_res = progp->pg_authenticate(rqstp);
    1121                 :            :         }
    1122   [ #  #  #  #  :          0 :         switch (auth_res) {
                #  #  # ]
    1123                 :            :         case SVC_OK:
    1124                 :            :                 break;
    1125                 :            :         case SVC_GARBAGE:
    1126                 :            :                 goto err_garbage;
    1127                 :            :         case SVC_SYSERR:
    1128                 :            :                 rpc_stat = rpc_system_err;
    1129                 :            :                 goto err_bad;
    1130                 :            :         case SVC_DENIED:
    1131                 :            :                 goto err_bad_auth;
    1132                 :            :         case SVC_CLOSE:
    1133         [ #  # ]:          0 :                 if (test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
    1134                 :          0 :                         svc_close_xprt(rqstp->rq_xprt);
    1135                 :            :         case SVC_DROP:
    1136                 :            :                 goto dropit;
    1137                 :            :         case SVC_COMPLETE:
    1138                 :            :                 goto sendit;
    1139                 :            :         }
    1140                 :            : 
    1141         [ #  # ]:          0 :         if (progp == NULL)
    1142                 :            :                 goto err_bad_prog;
    1143                 :            : 
    1144 [ #  # ][ #  # ]:          0 :         if (vers >= progp->pg_nvers ||
    1145                 :          0 :           !(versp = progp->pg_vers[vers]))
    1146                 :            :                 goto err_bad_vers;
    1147                 :            : 
    1148                 :          0 :         procp = versp->vs_proc + proc;
    1149 [ #  # ][ #  # ]:          0 :         if (proc >= versp->vs_nproc || !procp->pc_func)
    1150                 :            :                 goto err_bad_proc;
    1151                 :          0 :         rqstp->rq_procinfo = procp;
    1152                 :            : 
    1153                 :            :         /* Syntactic check complete */
    1154                 :          0 :         serv->sv_stats->rpccnt++;
    1155                 :            : 
    1156                 :            :         /* Build the reply header. */
    1157                 :          0 :         statp = resv->iov_base +resv->iov_len;
    1158                 :            :         svc_putnl(resv, RPC_SUCCESS);
    1159                 :            : 
    1160                 :            :         /* Bump per-procedure stats counter */
    1161                 :          0 :         procp->pc_count++;
    1162                 :            : 
    1163                 :            :         /* Initialize storage for argp and resp */
    1164         [ #  # ]:          0 :         memset(rqstp->rq_argp, 0, procp->pc_argsize);
    1165         [ #  # ]:          0 :         memset(rqstp->rq_resp, 0, procp->pc_ressize);
    1166                 :            : 
    1167                 :            :         /* un-reserve some of the out-queue now that we have a
    1168                 :            :          * better idea of reply size
    1169                 :            :          */
    1170         [ #  # ]:          0 :         if (procp->pc_xdrressize)
    1171                 :          0 :                 svc_reserve_auth(rqstp, procp->pc_xdrressize<<2);
    1172                 :            : 
    1173                 :            :         /* Call the function that processes the request. */
    1174         [ #  # ]:          0 :         if (!versp->vs_dispatch) {
    1175                 :            :                 /* Decode arguments */
    1176                 :          0 :                 xdr = procp->pc_decode;
    1177 [ #  # ][ #  # ]:          0 :                 if (xdr && !xdr(rqstp, argv->iov_base, rqstp->rq_argp))
    1178                 :            :                         goto err_garbage;
    1179                 :            : 
    1180                 :          0 :                 *statp = procp->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
    1181                 :            : 
    1182                 :            :                 /* Encode reply */
    1183         [ #  # ]:          0 :                 if (rqstp->rq_dropme) {
    1184         [ #  # ]:          0 :                         if (procp->pc_release)
    1185                 :          0 :                                 procp->pc_release(rqstp, NULL, rqstp->rq_resp);
    1186                 :            :                         goto dropit;
    1187                 :            :                 }
    1188 [ #  # ][ #  # ]:          0 :                 if (*statp == rpc_success &&
    1189         [ #  # ]:          0 :                     (xdr = procp->pc_encode) &&
    1190                 :          0 :                     !xdr(rqstp, resv->iov_base+resv->iov_len, rqstp->rq_resp)) {
    1191                 :            :                         dprintk("svc: failed to encode reply\n");
    1192                 :            :                         /* serv->sv_stats->rpcsystemerr++; */
    1193                 :          0 :                         *statp = rpc_system_err;
    1194                 :            :                 }
    1195                 :            :         } else {
    1196                 :            :                 dprintk("svc: calling dispatcher\n");
    1197         [ #  # ]:          0 :                 if (!versp->vs_dispatch(rqstp, statp)) {
    1198                 :            :                         /* Release reply info */
    1199         [ #  # ]:          0 :                         if (procp->pc_release)
    1200                 :          0 :                                 procp->pc_release(rqstp, NULL, rqstp->rq_resp);
    1201                 :            :                         goto dropit;
    1202                 :            :                 }
    1203                 :            :         }
    1204                 :            : 
    1205                 :            :         /* Check RPC status result */
    1206         [ #  # ]:          0 :         if (*statp != rpc_success)
    1207                 :          0 :                 resv->iov_len = ((void*)statp)  - resv->iov_base + 4;
    1208                 :            : 
    1209                 :            :         /* Release reply info */
    1210         [ #  # ]:          0 :         if (procp->pc_release)
    1211                 :          0 :                 procp->pc_release(rqstp, NULL, rqstp->rq_resp);
    1212                 :            : 
    1213         [ #  # ]:          0 :         if (procp->pc_encode == NULL)
    1214                 :            :                 goto dropit;
    1215                 :            : 
    1216                 :            :  sendit:
    1217         [ #  # ]:          0 :         if (svc_authorise(rqstp))
    1218                 :            :                 goto dropit;
    1219                 :            :         return 1;               /* Caller can now send it */
    1220                 :            : 
    1221                 :            :  dropit:
    1222                 :          0 :         svc_authorise(rqstp);   /* doesn't hurt to call this twice */
    1223                 :            :         dprintk("svc: svc_process dropit\n");
    1224                 :          0 :         return 0;
    1225                 :            : 
    1226                 :            : err_short_len:
    1227                 :            :         svc_printk(rqstp, "short len %Zd, dropping request\n",
    1228                 :            :                         argv->iov_len);
    1229                 :            : 
    1230                 :            :         goto dropit;                    /* drop request */
    1231                 :            : 
    1232                 :            : err_bad_rpc:
    1233                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1234                 :            :         svc_putnl(resv, 1);     /* REJECT */
    1235                 :            :         svc_putnl(resv, 0);     /* RPC_MISMATCH */
    1236                 :            :         svc_putnl(resv, 2);     /* Only RPCv2 supported */
    1237                 :            :         svc_putnl(resv, 2);
    1238                 :            :         goto sendit;
    1239                 :            : 
    1240                 :            : err_bad_auth:
    1241                 :            :         dprintk("svc: authentication failed (%d)\n", ntohl(auth_stat));
    1242                 :          0 :         serv->sv_stats->rpcbadauth++;
    1243                 :            :         /* Restore write pointer to location of accept status: */
    1244                 :            :         xdr_ressize_check(rqstp, reply_statp);
    1245                 :            :         svc_putnl(resv, 1);     /* REJECT */
    1246                 :            :         svc_putnl(resv, 1);     /* AUTH_ERROR */
    1247         [ #  # ]:          0 :         svc_putnl(resv, ntohl(auth_stat));      /* status */
    1248                 :            :         goto sendit;
    1249                 :            : 
    1250                 :            : err_bad_prog:
    1251                 :            :         dprintk("svc: unknown program %d\n", prog);
    1252                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1253                 :            :         svc_putnl(resv, RPC_PROG_UNAVAIL);
    1254                 :            :         goto sendit;
    1255                 :            : 
    1256                 :            : err_bad_vers:
    1257                 :            :         svc_printk(rqstp, "unknown version (%d for prog %d, %s)\n",
    1258                 :            :                        vers, prog, progp->pg_name);
    1259                 :            : 
    1260                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1261                 :            :         svc_putnl(resv, RPC_PROG_MISMATCH);
    1262                 :          0 :         svc_putnl(resv, progp->pg_lovers);
    1263                 :          0 :         svc_putnl(resv, progp->pg_hivers);
    1264                 :            :         goto sendit;
    1265                 :            : 
    1266                 :            : err_bad_proc:
    1267                 :            :         svc_printk(rqstp, "unknown procedure (%d)\n", proc);
    1268                 :            : 
    1269                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1270                 :            :         svc_putnl(resv, RPC_PROC_UNAVAIL);
    1271                 :            :         goto sendit;
    1272                 :            : 
    1273                 :            : err_garbage:
    1274                 :            :         svc_printk(rqstp, "failed to decode args\n");
    1275                 :            : 
    1276                 :            :         rpc_stat = rpc_garbage_args;
    1277                 :            : err_bad:
    1278                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1279         [ #  # ]:          0 :         svc_putnl(resv, ntohl(rpc_stat));
    1280                 :            :         goto sendit;
    1281                 :            : }
    1282                 :            : EXPORT_SYMBOL_GPL(svc_process);
    1283                 :            : 
    1284                 :            : /*
    1285                 :            :  * Process the RPC request.
    1286                 :            :  */
    1287                 :            : int
    1288                 :          0 : svc_process(struct svc_rqst *rqstp)
    1289                 :            : {
    1290                 :          0 :         struct kvec             *argv = &rqstp->rq_arg.head[0];
    1291                 :          0 :         struct kvec             *resv = &rqstp->rq_res.head[0];
    1292                 :          0 :         struct svc_serv         *serv = rqstp->rq_server;
    1293                 :            :         u32                     dir;
    1294                 :            : 
    1295                 :            :         /*
    1296                 :            :          * Setup response xdr_buf.
    1297                 :            :          * Initially it has just one page
    1298                 :            :          */
    1299                 :          0 :         rqstp->rq_next_page = &rqstp->rq_respages[1];
    1300                 :          0 :         resv->iov_base = page_address(rqstp->rq_respages[0]);
    1301                 :          0 :         resv->iov_len = 0;
    1302                 :          0 :         rqstp->rq_res.pages = rqstp->rq_respages + 1;
    1303                 :          0 :         rqstp->rq_res.len = 0;
    1304                 :          0 :         rqstp->rq_res.page_base = 0;
    1305                 :          0 :         rqstp->rq_res.page_len = 0;
    1306                 :          0 :         rqstp->rq_res.buflen = PAGE_SIZE;
    1307                 :          0 :         rqstp->rq_res.tail[0].iov_base = NULL;
    1308                 :          0 :         rqstp->rq_res.tail[0].iov_len = 0;
    1309                 :            : 
    1310                 :          0 :         rqstp->rq_xid = svc_getu32(argv);
    1311                 :            : 
    1312                 :            :         dir  = svc_getnl(argv);
    1313         [ #  # ]:          0 :         if (dir != 0) {
    1314                 :            :                 /* direction != CALL */
    1315                 :            :                 svc_printk(rqstp, "bad direction %d, dropping request\n", dir);
    1316                 :          0 :                 serv->sv_stats->rpcbadfmt++;
    1317                 :          0 :                 svc_drop(rqstp);
    1318                 :          0 :                 return 0;
    1319                 :            :         }
    1320                 :            : 
    1321                 :            :         /* Returns 1 for send, 0 for drop */
    1322         [ #  # ]:          0 :         if (svc_process_common(rqstp, argv, resv))
    1323                 :          0 :                 return svc_send(rqstp);
    1324                 :            :         else {
    1325                 :          0 :                 svc_drop(rqstp);
    1326                 :          0 :                 return 0;
    1327                 :            :         }
    1328                 :            : }
    1329                 :            : 
    1330                 :            : #if defined(CONFIG_SUNRPC_BACKCHANNEL)
    1331                 :            : /*
    1332                 :            :  * Process a backchannel RPC request that arrived over an existing
    1333                 :            :  * outbound connection
    1334                 :            :  */
    1335                 :            : int
    1336                 :            : bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req,
    1337                 :            :                struct svc_rqst *rqstp)
    1338                 :            : {
    1339                 :            :         struct kvec     *argv = &rqstp->rq_arg.head[0];
    1340                 :            :         struct kvec     *resv = &rqstp->rq_res.head[0];
    1341                 :            : 
    1342                 :            :         /* Build the svc_rqst used by the common processing routine */
    1343                 :            :         rqstp->rq_xprt = serv->sv_bc_xprt;
    1344                 :            :         rqstp->rq_xid = req->rq_xid;
    1345                 :            :         rqstp->rq_prot = req->rq_xprt->prot;
    1346                 :            :         rqstp->rq_server = serv;
    1347                 :            : 
    1348                 :            :         rqstp->rq_addrlen = sizeof(req->rq_xprt->addr);
    1349                 :            :         memcpy(&rqstp->rq_addr, &req->rq_xprt->addr, rqstp->rq_addrlen);
    1350                 :            :         memcpy(&rqstp->rq_arg, &req->rq_rcv_buf, sizeof(rqstp->rq_arg));
    1351                 :            :         memcpy(&rqstp->rq_res, &req->rq_snd_buf, sizeof(rqstp->rq_res));
    1352                 :            : 
    1353                 :            :         /* reset result send buffer "put" position */
    1354                 :            :         resv->iov_len = 0;
    1355                 :            : 
    1356                 :            :         if (rqstp->rq_prot != IPPROTO_TCP) {
    1357                 :            :                 printk(KERN_ERR "No support for Non-TCP transports!\n");
    1358                 :            :                 BUG();
    1359                 :            :         }
    1360                 :            : 
    1361                 :            :         /*
    1362                 :            :          * Skip the next two words because they've already been
    1363                 :            :          * processed in the trasport
    1364                 :            :          */
    1365                 :            :         svc_getu32(argv);       /* XID */
    1366                 :            :         svc_getnl(argv);        /* CALLDIR */
    1367                 :            : 
    1368                 :            :         /* Returns 1 for send, 0 for drop */
    1369                 :            :         if (svc_process_common(rqstp, argv, resv)) {
    1370                 :            :                 memcpy(&req->rq_snd_buf, &rqstp->rq_res,
    1371                 :            :                                                 sizeof(req->rq_snd_buf));
    1372                 :            :                 return bc_send(req);
    1373                 :            :         } else {
    1374                 :            :                 /* drop request */
    1375                 :            :                 xprt_free_bc_request(req);
    1376                 :            :                 return 0;
    1377                 :            :         }
    1378                 :            : }
    1379                 :            : EXPORT_SYMBOL_GPL(bc_svc_process);
    1380                 :            : #endif /* CONFIG_SUNRPC_BACKCHANNEL */
    1381                 :            : 
    1382                 :            : /*
    1383                 :            :  * Return (transport-specific) limit on the rpc payload.
    1384                 :            :  */
    1385                 :          0 : u32 svc_max_payload(const struct svc_rqst *rqstp)
    1386                 :            : {
    1387                 :          0 :         u32 max = rqstp->rq_xprt->xpt_class->xcl_max_payload;
    1388                 :            : 
    1389         [ #  # ]:          0 :         if (rqstp->rq_server->sv_max_payload < max)
    1390                 :            :                 max = rqstp->rq_server->sv_max_payload;
    1391                 :          0 :         return max;
    1392                 :            : }
    1393                 :            : EXPORT_SYMBOL_GPL(svc_max_payload);

Generated by: LCOV version 1.9