Print this page
3354 kernel crash in rpcsec_gss after using gsscred
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Carlos Neira <cneirabustos@gmail.com>
Approved by: Robert Mustacchi <rm@joyent.com>
re #12783 rb4338 Flow control is needed in rpcmod when the NFS server is unable to keep up with the network

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/rpc/svc.h
          +++ new/usr/src/uts/common/rpc/svc.h
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
       23 + * Copyright 2012 Marcel Telka <marcel@telka.sk>
  23   24   * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
       25 + * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
  24   26   */
  25   27  /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
  26   28  /* All Rights Reserved */
  27   29  /*
  28   30   * Portions of this source code were derived from Berkeley
  29   31   * 4.3 BSD under license from the Regents of the University of
  30   32   * California.
  31   33   */
  32   34  
  33   35  /*
↓ open down ↓ 148 lines elided ↑ open up ↑
 182  184          int32_t *(*xp_getres)(SVCXPRT *, int);
 183  185                  /* get pointer to response buffer */
 184  186          void    (*xp_freeres)(SVCXPRT *);
 185  187                  /* destroy pre-serialized response */
 186  188          void    (*xp_clone_destroy)(SVCXPRT *);
 187  189                  /* destroy a clone xprt */
 188  190          void    (*xp_start)(SVCMASTERXPRT *);
 189  191                  /* `ready-to-receive' */
 190  192          void    (*xp_clone_xprt)(SVCXPRT *, SVCXPRT *);
 191  193                  /* transport specific clone function */
 192      -        void    (*xp_tattrs) (SVCXPRT *, int, void **);
      194 +        void    (*xp_tattrs)(SVCXPRT *, int, void **);
      195 +                /* transport specific hold function */
      196 +        void    (*xp_hold)(queue_t *);
      197 +                /* transport specific release function */
      198 +        void    (*xp_release)(queue_t *, mblk_t *, bool_t);
 193  199  };
 194  200  
 195  201  #define SVC_TATTR_ADDRMASK      1
 196  202  
 197  203  #else   /* _KERNEL */
 198  204  /*
 199  205   *      Service control requests
 200  206   */
 201  207  #define SVCGET_VERSQUIET        1
 202  208  #define SVCSET_VERSQUIET        2
↓ open down ↓ 62 lines elided ↑ open up ↑
 265  271          SVCPOOL         *p_prev;                /* Prev pool in the list  */
 266  272          int             p_id;                   /* Pool id                */
 267  273          int             p_threads;              /* Non-detached threads   */
 268  274          int             p_detached_threads;     /* Detached threads       */
 269  275          int             p_maxthreads;           /* Max threads in the pool */
 270  276          int             p_redline;              /* `Redline' for the pool */
 271  277          int             p_reserved_threads;     /* Reserved threads       */
 272  278          kmutex_t        p_thread_lock;          /* Thread lock            */
 273  279          int             p_asleep;               /* Asleep threads         */
 274  280          int             p_drowsy;               /* Drowsy flag            */
 275      -        kcondvar_t      p_req_cv;               /* svc_poll() sleep var.  */
      281 +        kcondvar_t      p_req_cv;               /* svc_poll() sleep var.  */
 276  282          clock_t         p_timeout;              /* svc_poll() timeout     */
 277  283          kmutex_t        p_req_lock;             /* Request lock           */
 278  284          int             p_reqs;                 /* Pending requests       */
 279  285          int             p_walkers;              /* Walking threads        */
 280  286          int             p_max_same_xprt;        /* Max reqs from the xprt */
 281  287          int             p_stksize;              /* Stack size for svc_run */
 282  288          bool_t          p_closing : 1;          /* Pool is closing        */
 283  289  
 284  290          /*
 285  291           * Thread creator variables.
↓ open down ↓ 121 lines elided ↑ open up ↑
 407  413  #define xp_wq           xp_xpc.xpc_wq
 408  414  #define xp_cred         xp_xpc.xpc_cred
 409  415  #define xp_type         xp_xpc.xpc_type
 410  416  #define xp_msg_size     xp_xpc.xpc_msg_size
 411  417  #define xp_rtaddr       xp_xpc.xpc_rtaddr
 412  418  #define xp_lcladdr      xp_xpc.xpc_lcladdr
 413  419  #define xp_sct          xp_xpc.xpc_sct
 414  420  #define xp_netid        xp_xpc.xpc_netid
 415  421  
 416  422  struct __svcmasterxprt {
 417      -        SVCMASTERXPRT   *xp_next;       /* Next transport in the list   */
 418      -        SVCMASTERXPRT   *xp_prev;       /* Prev transport in the list   */
      423 +        SVCMASTERXPRT   *xp_next;       /* Next transport in the list   */
      424 +        SVCMASTERXPRT   *xp_prev;       /* Prev transport in the list   */
 419  425          __SVCXPRT_COMMON xp_xpc;        /* Fields common with the clone */
 420  426          SVCPOOL         *xp_pool;       /* Pointer to the pool          */
 421  427          mblk_t          *xp_req_head;   /* Request queue head           */
 422  428          mblk_t          *xp_req_tail;   /* Request queue tail           */
 423  429          kmutex_t        xp_req_lock;    /* Request lock                 */
 424  430          int             xp_threads;     /* Current num. of attached threads */
 425  431          int             xp_detached_threads; /* num. of detached threads */
 426  432          kmutex_t        xp_thread_lock; /* Thread count lock            */
 427  433          void            (*xp_closeproc)(const SVCMASTERXPRT *);
 428  434                                          /* optional; see comments above */
↓ open down ↓ 96 lines elided ↑ open up ↑
 525  531  #ifdef  _KERNEL
 526  532  
 527  533  #define SVC_GETADDRMASK(clone_xprt, attrflag, tattr) \
 528  534  (*(clone_xprt)->xp_ops->xp_tattrs)((clone_xprt), (attrflag), (tattr))
 529  535  
 530  536  #define SVC_CLONE_XPRT(src_xprt, dst_xprt) \
 531  537          if ((src_xprt)->xp_ops->xp_clone_xprt) \
 532  538                  (*(src_xprt)->xp_ops->xp_clone_xprt) \
 533  539                      (src_xprt, dst_xprt)
 534  540  
      541 +#define SVC_HOLD(xprt) \
      542 +        if ((xprt)->xp_ops->xp_hold) \
      543 +                (*(xprt)->xp_ops->xp_hold)((xprt)->xp_wq)
      544 +
      545 +#define SVC_RELE(xprt, mp, enable) \
      546 +        if ((xprt)->xp_ops->xp_release) \
      547 +                (*(xprt)->xp_ops->xp_release)((xprt)->xp_wq, (mp), (enable))
      548 +
 535  549  #define SVC_RECV(clone_xprt, mp, msg) \
 536  550          (*(clone_xprt)->xp_ops->xp_recv)((clone_xprt), (mp), (msg))
 537  551  
 538  552  /*
 539  553   * PSARC 2003/523 Contract Private Interface
 540  554   * SVC_GETARGS
 541  555   * Changes must be reviewed by Solaris File Sharing
 542  556   * Changes must be communicated to contract-2003-523@sun.com
 543  557   */
 544  558  #define SVC_GETARGS(clone_xprt, xargs, argsp) \
↓ open down ↓ 176 lines elided ↑ open up ↑
 721  735  #else   /* __STDC__ */
 722  736  extern bool_t   rpc_reg();
 723  737  extern bool_t   svc_reg();
 724  738  extern bool_t   svc_auth_reg();
 725  739  extern void     svc_unreg();
 726  740  extern void     xprt_register();
 727  741  extern void     xprt_unregister();
 728  742  #endif /* __STDC__ */
 729  743  #endif  /* _KERNEL */
 730  744  
      745 +#ifdef _KERNEL
      746 +/*
      747 + * Transport hold and release.
      748 + */
      749 +extern void rpcmod_hold(queue_t *);
      750 +extern void rpcmod_release(queue_t *, mblk_t *, bool_t);
      751 +extern void mir_svc_hold(queue_t *);
      752 +extern void mir_svc_release(queue_t *, mblk_t *, bool_t);
      753 +#endif /* _KERNEL */
 731  754  
 732  755  /*
 733  756   * When the service routine is called, it must first check to see if it
 734  757   * knows about the procedure;  if not, it should call svcerr_noproc
 735  758   * and return.  If so, it should deserialize its arguments via
 736  759   * SVC_GETARGS (defined above).  If the deserialization does not work,
 737  760   * svcerr_decode should be called followed by a return.  Successful
 738  761   * decoding of the arguments should be followed the execution of the
 739  762   * procedure's code and a call to svc_sendreply.
 740  763   *
↓ open down ↓ 155 lines elided ↑ open up ↑
 896  919  /*
 897  920   * These are the existing service side transport implementations.
 898  921   *
 899  922   * Transport independent svc_create routine.
 900  923   */
 901  924  #ifdef __STDC__
 902  925  extern int      svc_create(void (*)(struct svc_req *, SVCXPRT *),
 903  926                                  const rpcprog_t, const rpcvers_t,
 904  927                                  const char *);
 905  928          /*
 906      -         *      void (*dispatch)();             -- dispatch routine
      929 +         *      void (*dispatch)();             -- dispatch routine
 907  930           *      const rpcprog_t prognum;        -- program number
 908  931           *      const rpcvers_t versnum;        -- version number
 909  932           *      const char *nettype;            -- network type
 910  933           */
 911  934  
 912  935  /*
 913  936   * Generic server creation routine. It takes a netconfig structure
 914  937   * instead of a nettype.
 915  938   */
 916  939  extern SVCXPRT  *svc_tp_create(void (*)(struct svc_req *, SVCXPRT *),
↓ open down ↓ 52 lines elided ↑ open up ↑
 969  992           * const uint_t sendsize;               -- max send size
 970  993           * const uint_t recvsize;               -- max recv size
 971  994           */
 972  995  
 973  996  /*
 974  997   * the routine takes any *open* TLI file
 975  998   * descriptor as its first input and is used for open connections.
 976  999   */
 977 1000  extern  SVCXPRT *svc_fd_create(const int, const uint_t, const uint_t);
 978 1001          /*
 979      -         *      const int fd;                   -- open connection end point
 980      -         *      const uint_t sendsize;          -- max send size
 981      -         *      const uint_t recvsize;          -- max recv size
     1002 +         *      const int fd;                   -- open connection end point
     1003 +         *      const uint_t sendsize;          -- max send size
     1004 +         *      const uint_t recvsize;          -- max recv size
 982 1005           */
 983 1006  
 984 1007  /*
 985 1008   * Memory based rpc (for speed check and testing)
 986 1009   */
 987 1010  extern SVCXPRT  *svc_raw_create(void);
 988 1011  
 989 1012  /*
 990 1013   * Creation of service over doors transport.
 991 1014   */
 992 1015  extern SVCXPRT  *svc_door_create(void (*)(struct svc_req *, SVCXPRT *),
 993 1016                                  const rpcprog_t, const rpcvers_t,
 994 1017                                  const uint_t);
 995 1018          /*
 996      -         *      void (*dispatch)();             -- dispatch routine
     1019 +         *      void (*dispatch)();             -- dispatch routine
 997 1020           *      const rpcprog_t prognum;        -- program number
 998 1021           *      const rpcvers_t versnum;        -- version number
 999 1022           *      const uint_t sendsize;          -- send buffer size
1000 1023           */
1001 1024  
1002 1025  /*
1003 1026   * Service control interface
1004 1027   */
1005 1028  extern  bool_t  svc_control(SVCXPRT *, const uint_t, void *);
1006 1029          /*
↓ open down ↓ 138 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX