Print this page
4953763 Need way to configure NFS window sizes without changing system wide defaults
6216670 NFS server needs a bigger transmit buffer

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/fs.d/nfs/nfsd/nfsd.c
          +++ new/usr/src/cmd/fs.d/nfs/nfsd/nfsd.c
↓ open down ↓ 120 lines elided ↑ open up ↑
 121  121   */
 122  122  int     nfs_server_vers_min = NFS_VERSMIN_DEFAULT;
 123  123  int     nfs_server_vers_max = NFS_VERSMAX_DEFAULT;
 124  124  
 125  125  /*
 126  126   * Set the default for server delegation enablement and set per
 127  127   * /etc/default/nfs configuration (if present).
 128  128   */
 129  129  int     nfs_server_delegation = NFS_SERVER_DELEGATION_DEFAULT;
 130  130  
      131 +/*
      132 + * Default values for TCP send and receive buffer size of NFS server
      133 + * connections.
      134 + *
      135 + * These values can be tuned by user via /etc/default/nfs configuration
      136 + * file by setting NFS_SERVER_SNDBUFSZ and NFS_SERVER_RCVBUFSZ.
      137 + *
      138 + * To force NFS connections to use system-wide default for TCP send and
      139 + * receive buffer, set NFS_SERVER_SNDBUFSZ and NFS_SERVER_RCVBUFSZ to 0.
      140 + */
      141 +int     nfs_server_sndbufsz = 1048576;
      142 +int     nfs_server_rcvbufsz = 1048576;
      143 +
 131  144  int
 132  145  main(int ac, char *av[])
 133  146  {
 134  147          char *dir = "/";
 135  148          int allflag = 0;
 136  149          int df_allflag = 0;
 137  150          int opt_cnt = 0;
 138  151          int maxservers = 1;     /* zero allows inifinte number of threads */
 139  152          int maxservers_set = 0;
 140  153          int logmaxservers = 0;
 141  154          int pid;
 142      -        int i;
      155 +        int i, bufsz;
 143  156          char *provider = (char *)NULL;
 144  157          char *df_provider = (char *)NULL;
 145  158          struct protob *protobp0, *protobp;
 146  159          NETSELDECL(proto) = NULL;
 147  160          NETSELDECL(df_proto) = NULL;
 148  161          NETSELPDECL(providerp);
 149  162          char *defval;
 150  163          boolean_t can_do_mlp;
 151  164          uint_t dss_npaths = 0;
 152  165          char **dss_pathnames = NULL;
↓ open down ↓ 75 lines elided ↑ open up ↑
 228  241                              strtol(defval, (char **)NULL, 10);
 229  242                          if (errno != 0) {
 230  243                                  nfs_server_vers_max = NFS_VERSMAX_DEFAULT;
 231  244                          }
 232  245                  }
 233  246                  if ((defval = defread("NFS_SERVER_DELEGATION=")) != NULL) {
 234  247                          if (strcmp(defval, "off") == 0) {
 235  248                                  nfs_server_delegation = FALSE;
 236  249                          }
 237  250                  }
      251 +                if ((defval = defread("NFS_SERVER_SNDBUFSZ=")) != NULL) {
      252 +                        errno = 0;
      253 +                        bufsz = strtol(defval, (char **)NULL, 10);
      254 +                        if (errno == 0)
      255 +                                nfs_server_sndbufsz = bufsz;
      256 +                }
      257 +                if ((defval = defread("NFS_SERVER_RCVBUFSZ=")) != NULL) {
      258 +                        errno = 0;
      259 +                        bufsz = strtol(defval, (char **)NULL, 10);
      260 +                        if (errno == 0)
      261 +                                nfs_server_rcvbufsz = bufsz;
      262 +                }
 238  263  
 239  264                  /* close defaults file */
 240  265                  defopen(NULL);
 241  266          }
 242  267  
 243  268          /*
 244  269           * Conflict options error messages.
 245  270           */
 246  271          if (opt_cnt > 1) {
 247  272                  (void) fprintf(stderr, "\nConflicting options, only one of "
↓ open down ↓ 279 lines elided ↑ open up ↑
 527  552          protobp = protobp->next;
 528  553          protobp->serv = "NFS_ACL";              /* not used */
 529  554          protobp->versmin = nfs_server_vers_min;
 530  555          /* XXX - this needs work to get the version just right */
 531  556          protobp->versmax = (nfs_server_vers_max > NFS_ACL_V3) ?
 532  557              NFS_ACL_V3 : nfs_server_vers_max;
 533  558          protobp->program = NFS_ACL_PROGRAM;
 534  559          protobp->next = (struct protob *)NULL;
 535  560  
 536  561          if (allflag) {
 537      -                if (do_all(protobp0, nfssvc, 0) == -1) {
      562 +                if (do_all_setbuf(protobp0, nfssvc, 0, nfs_server_sndbufsz,
      563 +                    nfs_server_rcvbufsz) == -1) {
 538  564                          fprintf(stderr, "setnetconfig failed : %s",
 539  565                              strerror(errno));
 540  566                          exit(1);
 541  567                  }
 542  568          } else if (proto) {
 543  569                  /* there's more than one match for the same protocol */
 544  570                  struct netconfig *nconf;
 545  571                  NCONF_HANDLE *nc;
 546  572                  bool_t  protoFound = FALSE;
 547  573                  if ((nc = setnetconfig()) == (NCONF_HANDLE *) NULL) {
 548  574                          fprintf(stderr, "setnetconfig failed : %s",
 549  575                              strerror(errno));
 550  576                          goto done;
 551  577                  }
 552  578                  while (nconf = getnetconfig(nc)) {
 553  579                          if (strcmp(nconf->nc_proto, proto) == 0) {
 554  580                                  protoFound = TRUE;
 555      -                                do_one(nconf->nc_device, NULL,
 556      -                                    protobp0, nfssvc, 0);
      581 +                                do_one_setbuf(nconf->nc_device, NULL,
      582 +                                    protobp0, nfssvc, 0,
      583 +                                    nfs_server_sndbufsz, nfs_server_rcvbufsz);
 557  584                          }
 558  585                  }
 559  586                  (void) endnetconfig(nc);
 560  587                  if (protoFound == FALSE) {
 561  588                          fprintf(stderr,
 562  589                              "couldn't find netconfig entry for protocol %s",
 563  590                              proto);
 564  591                  }
 565  592          } else if (provider)
 566      -                do_one(provider, proto, protobp0, nfssvc, 0);
      593 +                do_one_setbuf(provider, proto, protobp0, nfssvc, 0,
      594 +                    nfs_server_sndbufsz, nfs_server_rcvbufsz);
 567  595          else {
 568  596                  for (providerp = defaultproviders;
 569  597                      *providerp != NULL; providerp++) {
 570  598                          provider = *providerp;
 571      -                        do_one(provider, NULL, protobp0, nfssvc, 0);
      599 +                        do_one_setbuf(provider, NULL, protobp0, nfssvc, 0,
      600 +                            nfs_server_sndbufsz, nfs_server_rcvbufsz);
 572  601                  }
 573  602          }
 574  603  done:
 575  604  
 576  605          free(protobp);
 577  606          free(protobp0);
 578  607  
 579  608          if (num_fds == 0) {
 580  609                  fprintf(stderr, "Could not start NFS service for any protocol."
 581  610                      " Exiting");
↓ open down ↓ 375 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX