Print this page
    
Clean up merge problems with illumos#11083 (nfs-zone)
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/common/sys/zone.h
          +++ new/usr/src/uts/common/sys/zone.h
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  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  /*
  23   23   * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  24   24   * Copyright 2014 Igor Kozhukhov <ikozhukhov@gmail.com>.
  25   25   * Copyright 2019 Nexenta Systems, Inc. All rights reserved.
  26   26   * Copyright 2020 Joyent, Inc.
  27   27   */
  28   28  
  29   29  #ifndef _SYS_ZONE_H
  30   30  #define _SYS_ZONE_H
  31   31  
  32   32  #include <sys/types.h>
  33   33  #include <sys/param.h>
  34   34  #include <sys/tsol/label.h>
  35   35  #include <sys/uadmin.h>
  36   36  #include <netinet/in.h>
  37   37  
  38   38  #ifdef _KERNEL
  39   39  /*
  40   40   * Many includes are kernel-only to reduce namespace pollution of
  41   41   * userland applications.
  42   42   */
  43   43  #include <sys/mutex.h>
  44   44  #include <sys/rctl.h>
  45   45  #include <sys/ipc_rctl.h>
  
    | 
      ↓ open down ↓ | 
    45 lines elided | 
    
      ↑ open up ↑ | 
  
  46   46  #include <sys/pset.h>
  47   47  #include <sys/cred.h>
  48   48  #include <sys/netstack.h>
  49   49  #include <sys/ksynch.h>
  50   50  #include <sys/socket_impl.h>
  51   51  #include <sys/secflags.h>
  52   52  #include <sys/cpu_uarray.h>
  53   53  #include <sys/nvpair.h>
  54   54  #include <sys/list.h>
  55   55  #include <sys/loadavg.h>
       56 +#include <sys/vnode.h>
  56   57  #endif  /* _KERNEL */
  57   58  
  58   59  #ifdef  __cplusplus
  59   60  extern "C" {
  60   61  #endif
  61   62  
  62   63  /*
  63   64   * NOTE
  64   65   *
  65   66   * The contents of this file are private to the implementation of
  66   67   * illumos and are subject to change at any time without notice.
  67   68   * Applications and drivers using these interfaces may fail to
  68   69   * run on future releases.
  69   70   */
  70   71  
  71   72  /* Available both in kernel and for user space */
  72   73  
  73   74  /*
  74   75   * zone id restrictions and special ids.
  75   76   * See 'maxzones' for run-time zone limit.
  76   77   *
  77   78   * The current 8k value for MAX_ZONES was originally derived from the virtual
  78   79   * interface limit in IP when "shared-stack" was the only supported networking
  79   80   * for zones. The virtual interface limit is the number of addresses allowed
  80   81   * on an interface (see MAX_ADDRS_PER_IF). Even with exclusive stacks, an 8k
  81   82   * zone limit is still a reasonable choice at this time, given other limits
  82   83   * within the kernel. Since we only support 8192 zones (which includes GZ),
  83   84   * there is no point in allowing MAX_ZONEID > 8k.
  84   85   */
  85   86  #define MAX_ZONES       8192
  86   87  #define MAX_ZONEID      (MAX_ZONES - 1)
  87   88  #define MIN_USERZONEID  1       /* lowest user-creatable zone ID */
  88   89  #define MIN_ZONEID      0       /* minimum zone ID on system */
  89   90  #define GLOBAL_ZONEID   0
  90   91  #define ZONEID_WIDTH    4       /* for printf */
  91   92  
  92   93  /*
  93   94   * Special zoneid_t token to refer to all zones.
  94   95   */
  95   96  #define ALL_ZONES       (-1)
  96   97  
  97   98  /* system call subcodes */
  98   99  #define ZONE_CREATE             0
  99  100  #define ZONE_DESTROY            1
 100  101  #define ZONE_GETATTR            2
 101  102  #define ZONE_ENTER              3
 102  103  #define ZONE_LIST               4
 103  104  #define ZONE_SHUTDOWN           5
 104  105  #define ZONE_LOOKUP             6
 105  106  #define ZONE_BOOT               7
 106  107  #define ZONE_VERSION            8
 107  108  #define ZONE_SETATTR            9
 108  109  #define ZONE_ADD_DATALINK       10
 109  110  #define ZONE_DEL_DATALINK       11
 110  111  #define ZONE_CHECK_DATALINK     12
 111  112  #define ZONE_LIST_DATALINK      13
 112  113  
 113  114  /* zone attributes */
 114  115  #define ZONE_ATTR_ROOT          1
 115  116  #define ZONE_ATTR_NAME          2
 116  117  #define ZONE_ATTR_STATUS        3
 117  118  #define ZONE_ATTR_PRIVSET       4
 118  119  #define ZONE_ATTR_UNIQID        5
 119  120  #define ZONE_ATTR_POOLID        6
 120  121  #define ZONE_ATTR_INITPID       7
 121  122  #define ZONE_ATTR_SLBL          8
 122  123  #define ZONE_ATTR_INITNAME      9
 123  124  #define ZONE_ATTR_BOOTARGS      10
 124  125  #define ZONE_ATTR_BRAND         11
 125  126  #define ZONE_ATTR_SCHED_CLASS   12
 126  127  #define ZONE_ATTR_FLAGS         13
 127  128  #define ZONE_ATTR_HOSTID        14
 128  129  #define ZONE_ATTR_FS_ALLOWED    15
 129  130  #define ZONE_ATTR_NETWORK       16
 130  131  #define ZONE_ATTR_DID           17
 131  132  #define ZONE_ATTR_INITNORESTART 18
 132  133  #define ZONE_ATTR_APP_SVC_CT    19
 133  134  #define ZONE_ATTR_SCHED_FIXEDHI 20
 134  135  #define ZONE_ATTR_SECFLAGS      21
 135  136  #define ZONE_ATTR_INITRESTART0  22
 136  137  #define ZONE_ATTR_INITREBOOT    23
 137  138  
 138  139  /* Start of the brand-specific attribute namespace */
 139  140  #define ZONE_ATTR_BRAND_ATTRS   32768
 140  141  
 141  142  #define ZONE_FS_ALLOWED_MAX     1024
 142  143  
 143  144  #define ZONE_EVENT_CHANNEL      "com.sun:zones:status"
 144  145  #define ZONE_EVENT_STATUS_CLASS "status"
 145  146  #define ZONE_EVENT_STATUS_SUBCLASS      "change"
 146  147  
 147  148  #define ZONE_EVENT_UNINITIALIZED        "uninitialized"
 148  149  #define ZONE_EVENT_INITIALIZED          "initialized"
 149  150  #define ZONE_EVENT_READY                "ready"
 150  151  #define ZONE_EVENT_RUNNING              "running"
 151  152  #define ZONE_EVENT_SHUTTING_DOWN        "shutting_down"
 152  153  #define ZONE_EVENT_FREE                 "free"
 153  154  
 154  155  #define ZONE_CB_NAME            "zonename"
 155  156  #define ZONE_CB_NEWSTATE        "newstate"
 156  157  #define ZONE_CB_OLDSTATE        "oldstate"
 157  158  #define ZONE_CB_RESTARTS        "restarts"
 158  159  #define ZONE_CB_TIMESTAMP       "when"
 159  160  #define ZONE_CB_ZONEID          "zoneid"
 160  161  
 161  162  #define ZONE_EVENT_INIT_CLASS           "init"
 162  163  #define ZONE_EVENT_INIT_RESTART_SC      "restart"
 163  164  
 164  165  /*
 165  166   * Exit values that may be returned by scripts or programs invoked by various
 166  167   * zone commands.
 167  168   *
 168  169   * These are defined as:
 169  170   *
 170  171   *      ZONE_SUBPROC_OK
 171  172   *      ===============
 172  173   *      The subprocess completed successfully.
 173  174   *
 174  175   *      ZONE_SUBPROC_USAGE
 175  176   *      ==================
 176  177   *      The subprocess failed with a usage message, or a usage message should
 177  178   *      be output in its behalf.
 178  179   *
 179  180   *      ZONE_SUBPROC_NOTCOMPLETE
 180  181   *      ========================
 181  182   *      The subprocess did not complete, but the actions performed by the
 182  183   *      subprocess require no recovery actions by the user.
 183  184   *
 184  185   *      For example, if the subprocess were called by "zoneadm install," the
 185  186   *      installation of the zone did not succeed but the user need not perform
 186  187   *      a "zoneadm uninstall" before attempting another install.
 187  188   *
 188  189   *      ZONE_SUBPROC_FATAL
 189  190   *      ==================
 190  191   *      The subprocess failed in a fatal manner, usually one that will require
 191  192   *      some type of recovery action by the user.
 192  193   *
 193  194   *      For example, if the subprocess were called by "zoneadm install," the
 194  195   *      installation of the zone did not succeed and the user will need to
 195  196   *      perform a "zoneadm uninstall" before another install attempt is
 196  197   *      possible.
 197  198   *
 198  199   *      The non-success exit values are large to avoid accidental collision
 199  200   *      with values used internally by some commands (e.g. "Z_ERR" and
 200  201   *      "Z_USAGE" as used by zoneadm.)
 201  202   */
 202  203  #define ZONE_SUBPROC_OK                 0
 203  204  #define ZONE_SUBPROC_USAGE              253
 204  205  #define ZONE_SUBPROC_NOTCOMPLETE        254
 205  206  #define ZONE_SUBPROC_FATAL              255
 206  207  
 207  208  #ifdef _SYSCALL32
 208  209  typedef struct {
 209  210          caddr32_t zone_name;
 210  211          caddr32_t zone_root;
 211  212          caddr32_t zone_privs;
 212  213          size32_t zone_privssz;
 213  214          caddr32_t rctlbuf;
 214  215          size32_t rctlbufsz;
 215  216          caddr32_t extended_error;
 216  217          caddr32_t zfsbuf;
 217  218          size32_t  zfsbufsz;
 218  219          int match;                      /* match level */
 219  220          uint32_t doi;                   /* DOI for label */
 220  221          caddr32_t label;                /* label associated with zone */
 221  222          int flags;
 222  223          zoneid_t zoneid;                /* requested zoneid */
 223  224  } zone_def32;
 224  225  #endif
 225  226  typedef struct {
 226  227          const char *zone_name;
 227  228          const char *zone_root;
 228  229          const struct priv_set *zone_privs;
 229  230          size_t zone_privssz;
 230  231          const char *rctlbuf;
 231  232          size_t rctlbufsz;
 232  233          int *extended_error;
 233  234          const char *zfsbuf;
 234  235          size_t zfsbufsz;
 235  236          int match;                      /* match level */
 236  237          uint32_t doi;                   /* DOI for label */
 237  238          const bslabel_t *label;         /* label associated with zone */
 238  239          int flags;
 239  240          zoneid_t zoneid;                /* requested zoneid */
 240  241  } zone_def;
 241  242  
 242  243  /* extended error information */
 243  244  #define ZE_UNKNOWN      0       /* No extended error info */
 244  245  #define ZE_CHROOTED     1       /* tried to zone_create from chroot */
 245  246  #define ZE_AREMOUNTS    2       /* there are mounts within the zone */
 246  247  #define ZE_LABELINUSE   3       /* label is already in use by some other zone */
 247  248  
 248  249  /*
 249  250   * zone_status values
 250  251   *
 251  252   * You must modify zone_status_names in mdb(1M)'s genunix module
 252  253   * (genunix/zone.c) when you modify this enum.
 253  254   */
 254  255  typedef enum {
 255  256          ZONE_IS_UNINITIALIZED = 0,
 256  257          ZONE_IS_INITIALIZED,
 257  258          ZONE_IS_READY,
 258  259          ZONE_IS_BOOTING,
 259  260          ZONE_IS_RUNNING,
 260  261          ZONE_IS_SHUTTING_DOWN,
 261  262          ZONE_IS_EMPTY,
 262  263          ZONE_IS_DOWN,
 263  264          ZONE_IS_DYING,
 264  265          ZONE_IS_DEAD,
 265  266          ZONE_IS_FREE            /* transient state for zone sysevent */
 266  267  } zone_status_t;
 267  268  #define ZONE_MIN_STATE          ZONE_IS_UNINITIALIZED
 268  269  #define ZONE_MAX_STATE          ZONE_IS_DEAD
 269  270  
 270  271  /*
 271  272   * Valid commands which may be issued by zoneadm to zoneadmd.  The kernel also
 272  273   * communicates with zoneadmd, but only uses Z_REBOOT and Z_HALT.
 273  274   */
 274  275  typedef enum zone_cmd {
 275  276          Z_READY, Z_BOOT, Z_FORCEBOOT, Z_REBOOT, Z_HALT, Z_NOTE_UNINSTALLING,
 276  277          Z_MOUNT, Z_FORCEMOUNT, Z_UNMOUNT, Z_SHUTDOWN
 277  278  } zone_cmd_t;
 278  279  
 279  280  /*
 280  281   * The structure of a request to zoneadmd.
 281  282   */
 282  283  typedef struct zone_cmd_arg {
 283  284          uint64_t        uniqid;         /* unique "generation number" */
 284  285          zone_cmd_t      cmd;            /* requested action */
 285  286          int             status;         /* init status on shutdown */
 286  287          uint32_t        debug;          /* enable brand hook debug */
 287  288          char locale[MAXPATHLEN];        /* locale in which to render messages */
 288  289          char bootbuf[BOOTARGS_MAX];     /* arguments passed to zone_boot() */
 289  290          /* Needed for 32/64 zoneadm -> zoneadmd door arg size check. */
 290  291          int             pad;
 291  292  } zone_cmd_arg_t;
 292  293  
 293  294  /*
 294  295   * Structure of zoneadmd's response to a request.  A NULL return value means
 295  296   * the caller should attempt to restart zoneadmd and retry.
 296  297   */
 297  298  typedef struct zone_cmd_rval {
 298  299          int rval;                       /* return value of request */
 299  300          char errbuf[1]; /* variable-sized buffer containing error messages */
 300  301  } zone_cmd_rval_t;
 301  302  
 302  303  /*
 303  304   * The zone support infrastructure uses the zone name as a component
 304  305   * of unix domain (AF_UNIX) sockets, which are limited to 108 characters
 305  306   * in length, so ZONENAME_MAX is limited by that.
 306  307   */
 307  308  #define ZONENAME_MAX            64
 308  309  
 309  310  #define GLOBAL_ZONENAME         "global"
 310  311  
 311  312  /*
 312  313   * Extended Regular expression (see regex(5)) which matches all valid zone
 313  314   * names.
 314  315   */
 315  316  #define ZONENAME_REGEXP         "[a-zA-Z0-9][-_.a-zA-Z0-9]{0,62}"
 316  317  
 317  318  /*
 318  319   * Where the zones support infrastructure places temporary files.
 319  320   */
 320  321  #define ZONES_TMPDIR            "/var/run/zones"
 321  322  
 322  323  /*
 323  324   * The path to the door used by clients to communicate with zoneadmd.
 324  325   */
 325  326  #define ZONE_DOOR_PATH          ZONES_TMPDIR "/%s.zoneadmd_door"
 326  327  
 327  328  
 328  329  /* zone_flags */
 329  330  /*
 330  331   * Threads that read or write the following flag must hold zone_lock.
 331  332   */
 332  333  #define ZF_REFCOUNTS_LOGGED     0x1     /* a thread logged the zone's refs */
 333  334  
 334  335  /*
 335  336   * The following threads are set when the zone is created and never changed.
 336  337   * Threads that test for these flags don't have to hold zone_lock.
 337  338   */
 338  339  #define ZF_HASHED_LABEL         0x2     /* zone has a unique label */
 339  340  #define ZF_IS_SCRATCH           0x4     /* scratch zone */
 340  341  #define ZF_NET_EXCL             0x8     /* Zone has an exclusive IP stack */
 341  342  
 342  343  
 343  344  /* zone_create flags */
 344  345  #define ZCF_NET_EXCL            0x1     /* Create a zone with exclusive IP */
 345  346  
 346  347  /* zone network properties */
 347  348  #define ZONE_NETWORK_ADDRESS    1
 348  349  #define ZONE_NETWORK_DEFROUTER  2
 349  350  
 350  351  #define ZONE_NET_ADDRNAME       "address"
 351  352  #define ZONE_NET_RTRNAME        "route"
 352  353  
 353  354  typedef struct zone_net_data {
 354  355          int zn_type;
 355  356          int zn_len;
 356  357          datalink_id_t zn_linkid;
 357  358          uint8_t zn_val[1];
 358  359  } zone_net_data_t;
 359  360  
 360  361  
 361  362  #ifdef _KERNEL
 362  363  
 363  364  #define GLOBAL_ZONEUNIQID       0       /* uniqid of the global zone */
 364  365  
 365  366  /*
 366  367   * Indexes into ->zone_ustate array, summing the micro state of all threads in a
 367  368   * particular zone.
 368  369   */
 369  370  #define ZONE_USTATE_STIME (0)
 370  371  #define ZONE_USTATE_UTIME (1)
 371  372  #define ZONE_USTATE_WTIME (2)
 372  373  #define ZONE_USTATE_MAX (3)
 373  374  
 374  375  struct pool;
 375  376  struct brand;
 376  377  
 377  378  /*
 378  379   * Each of these constants identifies a kernel subsystem that acquires and
 379  380   * releases zone references.  Each subsystem that invokes
 380  381   * zone_hold_ref() and zone_rele_ref() should specify the
 381  382   * zone_ref_subsys_t constant associated with the subsystem.  Tracked holds
 382  383   * help users and developers quickly identify subsystems that stall zone
 383  384   * shutdowns indefinitely.
 384  385   *
 385  386   * NOTE: You must modify zone_ref_subsys_names in usr/src/uts/common/os/zone.c
 386  387   * when you modify this enumeration.
 387  388   */
 388  389  typedef enum zone_ref_subsys {
 389  390          ZONE_REF_NFS,                   /* NFS */
 390  391          ZONE_REF_NFSV4,                 /* NFSv4 */
 391  392          ZONE_REF_SMBFS,                 /* SMBFS */
 392  393          ZONE_REF_MNTFS,                 /* MNTFS */
 393  394          ZONE_REF_LOFI,                  /* LOFI devices */
 394  395          ZONE_REF_VFS,                   /* VFS infrastructure */
 395  396          ZONE_REF_IPC,                   /* IPC infrastructure */
 396  397          ZONE_REF_NUM_SUBSYS             /* This must be the last entry. */
 397  398  } zone_ref_subsys_t;
 398  399  
 399  400  /*
 400  401   * zone_ref represents a general-purpose references to a zone.  Each zone's
 401  402   * references are linked into the zone's zone_t::zone_ref_list.  This allows
 402  403   * debuggers to walk zones' references.
 403  404   */
 404  405  typedef struct zone_ref {
 405  406          struct zone     *zref_zone; /* the zone to which the reference refers */
 406  407          list_node_t     zref_linkage; /* linkage for zone_t::zone_ref_list */
 407  408  } zone_ref_t;
 408  409  
 409  410  /*
 410  411   * Structure to record list of ZFS datasets exported to a zone.
 411  412   */
 412  413  typedef struct zone_dataset {
 413  414          char            *zd_dataset;
 414  415          list_node_t     zd_linkage;
 415  416  } zone_dataset_t;
 416  417  
 417  418  /*
 418  419   * structure for rctl zone kstats
 419  420   */
 420  421  typedef struct zone_kstat {
 421  422          kstat_named_t zk_zonename;
 422  423          kstat_named_t zk_usage;
 423  424          kstat_named_t zk_value;
 424  425  } zone_kstat_t;
 425  426  
 426  427  struct cpucap;
 427  428  
 428  429  typedef struct {
 429  430          hrtime_t        cycle_start;
 430  431          uint_t          cycle_cnt;
 431  432          hrtime_t        zone_avg_cnt;
 432  433  } sys_zio_cntr_t;
 433  434  
 434  435  typedef struct {
 435  436          kstat_named_t   zv_zonename;
 436  437          kstat_named_t   zv_nread;
 437  438          kstat_named_t   zv_reads;
 438  439          kstat_named_t   zv_rtime;
 439  440          kstat_named_t   zv_rlentime;
 440  441          kstat_named_t   zv_rcnt;
 441  442          kstat_named_t   zv_nwritten;
 442  443          kstat_named_t   zv_writes;
 443  444          kstat_named_t   zv_wtime;
 444  445          kstat_named_t   zv_wlentime;
 445  446          kstat_named_t   zv_wcnt;
 446  447          kstat_named_t   zv_10ms_ops;
 447  448          kstat_named_t   zv_100ms_ops;
 448  449          kstat_named_t   zv_1s_ops;
 449  450          kstat_named_t   zv_10s_ops;
 450  451          kstat_named_t   zv_delay_cnt;
 451  452          kstat_named_t   zv_delay_time;
 452  453  } zone_vfs_kstat_t;
 453  454  
 454  455  typedef struct {
 455  456          kstat_named_t   zz_zonename;
 456  457          kstat_named_t   zz_nread;
 457  458          kstat_named_t   zz_reads;
 458  459          kstat_named_t   zz_rtime;
 459  460          kstat_named_t   zz_rlentime;
 460  461          kstat_named_t   zz_nwritten;
 461  462          kstat_named_t   zz_writes;
 462  463          kstat_named_t   zz_waittime;
 463  464  } zone_zfs_kstat_t;
 464  465  
 465  466  typedef struct {
 466  467          kstat_named_t   zm_zonename;
 467  468          kstat_named_t   zm_rss;
 468  469          kstat_named_t   zm_phys_cap;
 469  470          kstat_named_t   zm_swap;
 470  471          kstat_named_t   zm_swap_cap;
 471  472          kstat_named_t   zm_nover;
 472  473          kstat_named_t   zm_pagedout;
 473  474          kstat_named_t   zm_pgpgin;
 474  475          kstat_named_t   zm_anonpgin;
 475  476          kstat_named_t   zm_execpgin;
 476  477          kstat_named_t   zm_fspgin;
 477  478          kstat_named_t   zm_anon_alloc_fail;
 478  479          kstat_named_t   zm_pf_throttle;
 479  480          kstat_named_t   zm_pf_throttle_usec;
 480  481  } zone_mcap_kstat_t;
 481  482  
 482  483  typedef struct {
 483  484          kstat_named_t   zm_zonename;    /* full name, kstat truncates name */
 484  485          kstat_named_t   zm_utime;
 485  486          kstat_named_t   zm_stime;
 486  487          kstat_named_t   zm_wtime;
 487  488          kstat_named_t   zm_avenrun1;
 488  489          kstat_named_t   zm_avenrun5;
 489  490          kstat_named_t   zm_avenrun15;
 490  491          kstat_named_t   zm_ffcap;
 491  492          kstat_named_t   zm_ffnoproc;
 492  493          kstat_named_t   zm_ffnomem;
 493  494          kstat_named_t   zm_ffmisc;
 494  495          kstat_named_t   zm_mfseglim;
 495  496          kstat_named_t   zm_nested_intp;
 496  497          kstat_named_t   zm_init_pid;
 497  498          kstat_named_t   zm_init_restarts;
 498  499          kstat_named_t   zm_boot_time;
 499  500  } zone_misc_kstat_t;
 500  501  
 501  502  typedef struct zone {
 502  503          /*
 503  504           * zone_name is never modified once set.
 504  505           */
 505  506          char            *zone_name;     /* zone's configuration name */
 506  507          /*
 507  508           * zone_nodename and zone_domain are never freed once allocated.
 508  509           */
 509  510          char            *zone_nodename; /* utsname.nodename equivalent */
 510  511          char            *zone_domain;   /* srpc_domain equivalent */
 511  512          /*
 512  513           * zone_hostid is used for per-zone hostid emulation.
 513  514           * Currently it isn't modified after it's set (so no locks protect
 514  515           * accesses), but that might have to change when we allow
 515  516           * administrators to change running zones' properties.
 516  517           *
 517  518           * The global zone's zone_hostid must always be HW_INVALID_HOSTID so
 518  519           * that zone_get_hostid() will function correctly.
 519  520           */
 520  521          uint32_t        zone_hostid;    /* zone's hostid, HW_INVALID_HOSTID */
 521  522                                          /* if not emulated */
 522  523          /*
 523  524           * zone_lock protects the following fields of a zone_t:
 524  525           *      zone_ref
 525  526           *      zone_cred_ref
 526  527           *      zone_subsys_ref
 527  528           *      zone_ref_list
 528  529           *      zone_ntasks
 529  530           *      zone_flags
 530  531           *      zone_zsd
 531  532           *      zone_pfexecd
 532  533           */
 533  534          kmutex_t        zone_lock;
 534  535          /*
 535  536           * zone_linkage is the zone's linkage into the active or
 536  537           * death-row list.  The field is protected by zonehash_lock.
 537  538           */
 538  539          list_node_t     zone_linkage;
 539  540          zoneid_t        zone_id;        /* ID of zone */
 540  541          zoneid_t        zone_did;       /* persistent debug ID of zone */
 541  542          uint_t          zone_ref;       /* count of zone_hold()s on zone */
 542  543          uint_t          zone_cred_ref;  /* count of zone_hold_cred()s on zone */
 543  544          /*
 544  545           * Fixed-sized array of subsystem-specific reference counts
 545  546           * The sum of all of the counts must be less than or equal to zone_ref.
 546  547           * The array is indexed by the counts' subsystems' zone_ref_subsys_t
 547  548           * constants.
 548  549           */
 549  550          uint_t          zone_subsys_ref[ZONE_REF_NUM_SUBSYS];
 550  551          list_t          zone_ref_list;  /* list of zone_ref_t structs */
 551  552          /*
 552  553           * zone_rootvp and zone_rootpath can never be modified once set.
 553  554           */
 554  555          struct vnode    *zone_rootvp;   /* zone's root vnode */
 555  556          char            *zone_rootpath; /* Path to zone's root + '/' */
 556  557          ushort_t        zone_flags;     /* misc flags */
 557  558          zone_status_t   zone_status;    /* protected by zone_status_lock */
 558  559          uint_t          zone_ntasks;    /* number of tasks executing in zone */
 559  560          kmutex_t        zone_nlwps_lock; /* protects zone_nlwps, and *_nlwps */
 560  561                                          /* counters in projects and tasks */
 561  562                                          /* that are within the zone */
 562  563          rctl_qty_t      zone_nlwps;     /* number of lwps in zone */
 563  564          rctl_qty_t      zone_nlwps_ctl; /* protected by zone_rctls->rcs_lock */
 564  565          rctl_qty_t      zone_shmmax;    /* System V shared memory usage */
 565  566          ipc_rqty_t      zone_ipc;       /* System V IPC id resource usage */
 566  567  
 567  568          uint_t          zone_rootpathlen; /* strlen(zone_rootpath) + 1 */
 568  569          uint32_t        zone_shares;    /* FSS shares allocated to zone */
 569  570          rctl_set_t      *zone_rctls;    /* zone-wide (zone.*) rctls */
 570  571          kmutex_t        zone_mem_lock;  /* protects zone_locked_mem and */
 571  572                                          /* kpd_locked_mem for all */
 572  573                                          /* projects in zone. */
 573  574                                          /* Also protects zone_max_swap */
 574  575                                          /* grab after p_lock, before rcs_lock */
 575  576          rctl_qty_t      zone_locked_mem;        /* bytes of locked memory in */
 576  577                                                  /* zone */
 577  578          rctl_qty_t      zone_locked_mem_ctl;    /* Current locked memory */
 578  579                                                  /* limit.  Protected by */
 579  580                                                  /* zone_rctls->rcs_lock */
 580  581          rctl_qty_t      zone_max_swap; /* bytes of swap reserved by zone */
 581  582          rctl_qty_t      zone_max_swap_ctl;      /* current swap limit. */
 582  583                                                  /* Protected by */
 583  584                                                  /* zone_rctls->rcs_lock */
 584  585          kmutex_t        zone_rctl_lock; /* protects zone_max_lofi */
 585  586          rctl_qty_t      zone_max_lofi; /* lofi devs for zone */
 586  587          rctl_qty_t      zone_max_lofi_ctl;      /* current lofi limit. */
 587  588                                                  /* Protected by */
 588  589                                                  /* zone_rctls->rcs_lock */
 589  590          list_t          zone_zsd;       /* list of Zone-Specific Data values */
 590  591          kcondvar_t      zone_cv;        /* used to signal state changes */
 591  592          struct proc     *zone_zsched;   /* Dummy kernel "zsched" process */
 592  593          pid_t           zone_proc_initpid; /* pid of "init" for this zone */
 593  594          uint_t          zone_proc_init_restarts; /* times init restarted */
 594  595          char            *zone_initname;         /* fs path to 'init' */
 595  596          int             zone_init_status;       /* init's exit status */
 596  597          int             zone_boot_err;  /* for zone_boot() if boot fails */
 597  598          char            *zone_bootargs; /* arguments passed via zone_boot() */
 598  599          /*
 599  600           * zone_kthreads is protected by zone_status_lock.
 600  601           */
 601  602          kthread_t       *zone_kthreads; /* kernel threads in zone */
 602  603          struct priv_set *zone_privset;  /* limit set for zone */
 603  604          /*
 604  605           * zone_vfslist is protected by vfs_list_lock().
 605  606           */
 606  607          struct vfs      *zone_vfslist;  /* list of FS's mounted in zone */
 607  608          uint64_t        zone_uniqid;    /* unique zone generation number */
 608  609          struct cred     *zone_kcred;    /* kcred-like, zone-limited cred */
 609  610          /*
 610  611           * zone_pool is protected by pool_lock().
 611  612           */
 612  613          struct pool     *zone_pool;     /* pool the zone is bound to */
 613  614          hrtime_t        zone_pool_mod;  /* last pool bind modification time */
 614  615          /* zone_psetid is protected by cpu_lock */
 615  616          psetid_t        zone_psetid;    /* pset the zone is bound to */
 616  617  
 617  618          time_t          zone_boot_time; /* Similar to boot_time */
 618  619  
 619  620          /*
 620  621           * The following two can be read without holding any locks.  They are
 621  622           * updated under cpu_lock.
 622  623           */
 623  624          int             zone_ncpus;  /* zone's idea of ncpus */
 624  625          int             zone_ncpus_online; /* zone's idea of ncpus_online */
 625  626          /*
 626  627           * List of ZFS datasets exported to this zone.
 627  628           */
 628  629          list_t          zone_datasets;  /* list of datasets */
 629  630  
 630  631          ts_label_t      *zone_slabel;   /* zone sensitivity label */
 631  632          int             zone_match;     /* require label match for packets */
 632  633          tsol_mlp_list_t zone_mlps;      /* MLPs on zone-private addresses */
 633  634  
 634  635          boolean_t       zone_restart_init;      /* Restart init if it dies? */
 635  636          boolean_t       zone_reboot_on_init_exit; /* Reboot if init dies? */
 636  637          boolean_t       zone_restart_init_0;    /* Restart only if it exits 0 */
 637  638          boolean_t       zone_setup_app_contract; /* setup contract? */
 638  639          struct brand    *zone_brand;            /* zone's brand */
 639  640          void            *zone_brand_data;       /* store brand specific data */
 640  641          id_t            zone_defaultcid;        /* dflt scheduling class id */
 641  642          boolean_t       zone_fixed_hipri;       /* fixed sched. hi prio */
 642  643          kstat_t         *zone_swapresv_kstat;
 643  644          kstat_t         *zone_lockedmem_kstat;
 644  645          /*
 645  646           * zone_dl_list is protected by zone_lock
 646  647           */
 647  648          list_t          zone_dl_list;
 648  649          netstack_t      *zone_netstack;
 649  650          struct cpucap   *zone_cpucap;   /* CPU caps data */
 650  651  
 651  652          /*
 652  653           * kstats and counters for VFS ops and bytes.
 653  654           */
 654  655          kmutex_t        zone_vfs_lock;          /* protects VFS statistics */
 655  656          kstat_t         *zone_vfs_ksp;
 656  657          kstat_io_t      zone_vfs_rwstats;
 657  658          zone_vfs_kstat_t *zone_vfs_stats;
 658  659  
 659  660          /*
 660  661           * kstats for ZFS I/O ops and bytes.
 661  662           */
 662  663          kmutex_t        zone_zfs_lock;          /* protects ZFS statistics */
 663  664          kstat_t         *zone_zfs_ksp;
 664  665          zone_zfs_kstat_t *zone_zfs_stats;
 665  666  
 666  667          /*
 667  668           * illumos Auditing per-zone audit context
 668  669           */
 669  670          struct au_kcontext      *zone_audit_kctxt;
 670  671          /*
 671  672           * For private use by mntfs.
 672  673           */
 673  674          struct mntelem  *zone_mntfs_db;
 674  675          krwlock_t       zone_mntfs_db_lock;
 675  676  
 676  677          struct klpd_reg         *zone_pfexecd;
 677  678  
 678  679          char            *zone_fs_allowed;
 679  680          rctl_qty_t      zone_nprocs;    /* number of processes in the zone */
 680  681          rctl_qty_t      zone_nprocs_ctl;        /* current limit protected by */
 681  682                                                  /* zone_rctls->rcs_lock */
 682  683          kstat_t         *zone_nprocs_kstat;
 683  684  
 684  685          /*
 685  686           * kstats and counters for physical memory capping.
 686  687           */
 687  688          kstat_t         *zone_physmem_kstat;
 688  689          kmutex_t        zone_mcap_lock;         /* protects mcap statistics */
 689  690          kstat_t         *zone_mcap_ksp;
 690  691          zone_mcap_kstat_t *zone_mcap_stats;
 691  692          uint64_t        zone_pgpgin;            /* pages paged in */
 692  693          uint64_t        zone_anonpgin;          /* anon pages paged in */
 693  694          uint64_t        zone_execpgin;          /* exec pages paged in */
 694  695          uint64_t        zone_fspgin;            /* fs pages paged in */
 695  696          uint64_t        zone_anon_alloc_fail;   /* cnt of anon alloc fails */
 696  697  
 697  698          psecflags_t     zone_secflags; /* default zone security-flags */
 698  699  
 699  700          /*
 700  701           * Misc. kstats and counters for zone cpu-usage aggregation.
 701  702           */
 702  703          kmutex_t        zone_misc_lock;         /* protects misc statistics */
 703  704          kstat_t         *zone_misc_ksp;
 704  705          zone_misc_kstat_t *zone_misc_stats;
 705  706          /* Accumulated microstate for all threads in this zone. */
 706  707          cpu_uarray_t    *zone_ustate;
 707  708          /* fork-fail kstat tracking */
 708  709          uint32_t        zone_ffcap;             /* hit an rctl cap */
 709  710          uint32_t        zone_ffnoproc;          /* get proc/lwp error */
 710  711          uint32_t        zone_ffnomem;           /* as_dup/memory error */
 711  712          uint32_t        zone_ffmisc;            /* misc. other error */
 712  713  
 713  714          uint32_t        zone_mfseglim;          /* map failure (# segs limit) */
 714  715  
 715  716          uint32_t        zone_nested_intp;       /* nested interp. kstat */
 716  717  
 717  718          struct loadavg_s zone_loadavg;          /* loadavg for this zone */
 718  719          uint64_t        zone_hp_avenrun[3];     /* high-precision avenrun */
 719  720          int             zone_avenrun[3];        /* FSCALED avg. run queue len */
 720  721  
 721  722          /*
 722  723           * FSS stats updated once per second by fss_decay_usage.
 723  724           */
 724  725          uint32_t        zone_fss_gen;           /* FSS generation cntr */
 725  726          uint64_t        zone_run_ticks;         /* tot # of ticks running */
 726  727  
 727  728          /*
 728  729           * DTrace-private per-zone state
 729  730           */
 730  731          int             zone_dtrace_getf;       /* # of unprivileged getf()s */
 731  732  
 732  733          /*
 733  734           * Synchronization primitives used to synchronize between mounts and
 734  735           * zone creation/destruction.
 735  736           */
 736  737          int             zone_mounts_in_progress;
 737  738          kcondvar_t      zone_mount_cv;
 738  739          kmutex_t        zone_mount_lock;
 739  740  } zone_t;
 740  741  
 741  742  /*
 742  743   * Data and counters used for ZFS fair-share disk IO.
 743  744   */
 744  745  typedef struct zone_zfs_io {
 745  746          uint16_t        zpers_zfs_io_pri;       /* ZFS IO priority - 16k max */
 746  747          uint_t          zpers_zfs_queued[2];    /* sync I/O enqueued count */
 747  748          sys_zio_cntr_t  zpers_rd_ops;           /* Counters for ZFS reads, */
 748  749          sys_zio_cntr_t  zpers_wr_ops;           /* writes, and */
 749  750          sys_zio_cntr_t  zpers_lwr_ops;          /* logical writes. */
 750  751          kstat_io_t      zpers_zfs_rwstats;
 751  752          uint64_t        zpers_io_util;          /* IO utilization metric */
 752  753          uint64_t        zpers_zfs_rd_waittime;
 753  754          uint8_t         zpers_io_delay;         /* IO delay on logical r/w */
 754  755          uint8_t         zpers_zfs_weight;       /* used to prevent starvation */
 755  756          uint8_t         zpers_io_util_above_avg; /* IO util percent > avg. */
 756  757  } zone_zfs_io_t;
 757  758  
 758  759  /*
 759  760   * "Persistent" zone data which can be accessed idependently of the zone_t.
 760  761   */
 761  762  typedef struct zone_persist {
 762  763          kmutex_t        zpers_zfs_lock; /* Protects zpers_zfsp references */
 763  764          zone_zfs_io_t   *zpers_zfsp;    /* ZFS fair-share IO data */
 764  765          uint8_t         zpers_over;     /* currently over cap */
 765  766          uint32_t        zpers_pg_cnt;   /* current RSS in pages */
 766  767          uint32_t        zpers_pg_limit; /* current RRS limit in pages */
 767  768          uint32_t        zpers_nover;    /* # of times over phys. cap */
 768  769  #ifndef DEBUG
 769  770          uint64_t        zpers_pg_out;   /* # pages flushed */
 770  771  #else
 771  772          /*
 772  773           * To conserve memory, some detailed kstats are only kept for DEBUG
 773  774           * builds.
 774  775           */
 775  776          uint64_t        zpers_zfs_rd_waittime;
 776  777  
 777  778          uint64_t        zpers_pg_anon;          /* # clean anon pages flushed */
 778  779          uint64_t        zpers_pg_anondirty;     /* # dirty anon pages flushed */
 779  780          uint64_t        zpers_pg_fs;            /* # clean fs pages flushed */
 780  781          uint64_t        zpers_pg_fsdirty;       /* # dirty fs pages flushed */
 781  782  #endif
 782  783  } zone_persist_t;
 783  784  
 784  785  typedef enum zone_pageout_op {
 785  786          ZPO_DIRTY, ZPO_FS, ZPO_ANON, ZPO_ANONDIRTY
 786  787  } zone_pageout_op_t;
 787  788  
 788  789  /*
 789  790   * Special value of zone_psetid to indicate that pools are disabled.
 790  791   */
 791  792  #define ZONE_PS_INVAL   PS_MYID
 792  793  
 793  794  extern zone_t zone0;
 794  795  extern zone_t *global_zone;
 795  796  extern uint_t maxzones;
 796  797  extern rctl_hndl_t rc_zone_nlwps;
 797  798  extern rctl_hndl_t rc_zone_nprocs;
 798  799  
 799  800  extern long zone(int, void *, void *, void *, void *);
 800  801  extern void zone_zsd_init(void);
 801  802  extern void zone_init(void);
 802  803  extern void zone_hold(zone_t *);
 803  804  extern void zone_rele(zone_t *);
 804  805  extern void zone_init_ref(zone_ref_t *);
 805  806  extern void zone_hold_ref(zone_t *, zone_ref_t *, zone_ref_subsys_t);
 806  807  extern void zone_rele_ref(zone_ref_t *, zone_ref_subsys_t);
 807  808  extern void zone_cred_hold(zone_t *);
 808  809  extern void zone_cred_rele(zone_t *);
 809  810  extern void zone_task_hold(zone_t *);
 810  811  extern void zone_task_rele(zone_t *);
 811  812  extern zone_t *zone_find_by_id(zoneid_t);
 812  813  extern zone_t *zone_find_by_label(const ts_label_t *);
 813  814  extern zone_t *zone_find_by_name(char *);
 814  815  extern zone_t *zone_find_by_any_path(const char *, boolean_t);
 815  816  extern zone_t *zone_find_by_path(const char *);
 816  817  extern zoneid_t getzoneid(void);
 817  818  extern zoneid_t getzonedid(void);
 818  819  extern zone_t *zone_find_by_id_nolock(zoneid_t);
 819  820  extern int zone_datalink_walk(zoneid_t, int (*)(datalink_id_t, void *), void *);
 820  821  extern int zone_check_datalink(zoneid_t *, datalink_id_t);
 821  822  extern void zone_loadavg_update();
 822  823  
 823  824  /*
 824  825   * Zone-specific data (ZSD) APIs
 825  826   */
 826  827  /*
 827  828   * The following is what code should be initializing its zone_key_t to if it
 828  829   * calls zone_getspecific() without necessarily knowing that zone_key_create()
 829  830   * has been called on the key.
 830  831   */
 831  832  #define ZONE_KEY_UNINITIALIZED  0
 832  833  
 833  834  typedef uint_t zone_key_t;
 834  835  
 835  836  extern void     zone_key_create(zone_key_t *, void *(*)(zoneid_t),
 836  837      void (*)(zoneid_t, void *), void (*)(zoneid_t, void *));
 837  838  extern int      zone_key_delete(zone_key_t);
 838  839  extern void     *zone_getspecific(zone_key_t, zone_t *);
 839  840  extern int      zone_setspecific(zone_key_t, zone_t *, const void *);
 840  841  
 841  842  /*
 842  843   * The definition of a zsd_entry is truly private to zone.c and is only
 843  844   * placed here so it can be shared with mdb.
 844  845   *
 845  846   * State maintained for each zone times each registered key, which tracks
 846  847   * the state of the create, shutdown and destroy callbacks.
 847  848   *
 848  849   * zsd_flags is used to keep track of pending actions to avoid holding locks
 849  850   * when calling the create/shutdown/destroy callbacks, since doing so
 850  851   * could lead to deadlocks.
 851  852   */
 852  853  struct zsd_entry {
 853  854          zone_key_t              zsd_key;        /* Key used to lookup value */
 854  855          void                    *zsd_data;      /* Caller-managed value */
 855  856          /*
 856  857           * Callbacks to be executed when a zone is created, shutdown, and
 857  858           * destroyed, respectively.
 858  859           */
 859  860          void                    *(*zsd_create)(zoneid_t);
 860  861          void                    (*zsd_shutdown)(zoneid_t, void *);
 861  862          void                    (*zsd_destroy)(zoneid_t, void *);
 862  863          list_node_t             zsd_linkage;
 863  864          uint16_t                zsd_flags;      /* See below */
 864  865          kcondvar_t              zsd_cv;
 865  866  };
 866  867  
 867  868  /*
 868  869   * zsd_flags
 869  870   */
 870  871  #define ZSD_CREATE_NEEDED       0x0001
 871  872  #define ZSD_CREATE_INPROGRESS   0x0002
 872  873  #define ZSD_CREATE_COMPLETED    0x0004
 873  874  #define ZSD_SHUTDOWN_NEEDED     0x0010
 874  875  #define ZSD_SHUTDOWN_INPROGRESS 0x0020
 875  876  #define ZSD_SHUTDOWN_COMPLETED  0x0040
 876  877  #define ZSD_DESTROY_NEEDED      0x0100
 877  878  #define ZSD_DESTROY_INPROGRESS  0x0200
 878  879  #define ZSD_DESTROY_COMPLETED   0x0400
 879  880  
 880  881  #define ZSD_CREATE_ALL  \
 881  882          (ZSD_CREATE_NEEDED|ZSD_CREATE_INPROGRESS|ZSD_CREATE_COMPLETED)
 882  883  #define ZSD_SHUTDOWN_ALL        \
 883  884          (ZSD_SHUTDOWN_NEEDED|ZSD_SHUTDOWN_INPROGRESS|ZSD_SHUTDOWN_COMPLETED)
 884  885  #define ZSD_DESTROY_ALL \
 885  886          (ZSD_DESTROY_NEEDED|ZSD_DESTROY_INPROGRESS|ZSD_DESTROY_COMPLETED)
 886  887  
 887  888  #define ZSD_ALL_INPROGRESS \
 888  889          (ZSD_CREATE_INPROGRESS|ZSD_SHUTDOWN_INPROGRESS|ZSD_DESTROY_INPROGRESS)
 889  890  
 890  891  /*
 891  892   * Macros to help with zone visibility restrictions.
 892  893   */
 893  894  
 894  895  /*
 895  896   * Is process in the global zone?
 896  897   */
 897  898  #define INGLOBALZONE(p) \
 898  899          ((p)->p_zone == global_zone)
 899  900  
 900  901  /*
 901  902   * Can process view objects in given zone?
 902  903   */
 903  904  #define HASZONEACCESS(p, zoneid) \
 904  905          ((p)->p_zone->zone_id == (zoneid) || INGLOBALZONE(p))
 905  906  
 906  907  /*
 907  908   * Convenience macro to see if a resolved path is visible from within a
 908  909   * given zone.
 909  910   *
 910  911   * The basic idea is that the first (zone_rootpathlen - 1) bytes of the
 911  912   * two strings must be equal.  Since the rootpathlen has a trailing '/',
 912  913   * we want to skip everything in the path up to (but not including) the
 913  914   * trailing '/'.
 914  915   */
 915  916  #define ZONE_PATH_VISIBLE(path, zone) \
 916  917          (strncmp((path), (zone)->zone_rootpath,         \
 917  918              (zone)->zone_rootpathlen - 1) == 0)
 918  919  
 919  920  /*
 920  921   * Convenience macro to go from the global view of a path to that seen
 921  922   * from within said zone.  It is the responsibility of the caller to
 922  923   * ensure that the path is a resolved one (ie, no '..'s or '.'s), and is
 923  924   * in fact visible from within the zone.
 924  925   */
 925  926  #define ZONE_PATH_TRANSLATE(path, zone) \
 926  927          (ASSERT(ZONE_PATH_VISIBLE(path, zone)), \
 927  928          (path) + (zone)->zone_rootpathlen - 2)
 928  929  
 929  930  /*
 930  931   * Special processes visible in all zones.
 931  932   */
 932  933  #define ZONE_SPECIALPID(x)       ((x) == 0 || (x) == 1)
 933  934  
 934  935  /*
 935  936   * A root vnode of the current zone.
 936  937   *
 937  938   * NOTE: It may be necessary (initialization time for file sharing where an
 938  939   * NGZ loads a file-sharing kernel module that does zsd initialization) to NOT
 939  940   * use this macro. One should ASSERT() that curzone == active ZSD (an
 940  941   * ASSERTion that's not always true at ZSD initialization time) during regular
 941  942   * use of this macro.
  
    | 
      ↓ open down ↓ | 
    876 lines elided | 
    
      ↑ open up ↑ | 
  
 942  943   */
 943  944  #define ZONE_ROOTVP()   (curzone->zone_rootvp)
 944  945  
 945  946  /*
 946  947   * Since a zone's root isn't necessarily an actual filesystem boundary
 947  948   * (i.e. VROOT may not be set on zone->zone_rootvp) we need to not assume it.
 948  949   * This macro helps in checking if a vnode is the current zone's rootvp.
 949  950   * NOTE:  Using the VN_ prefix, even though it's defined here in zone.h.
 950  951   * NOTE2: See above warning about ZONE_ROOTVP().
 951  952   */
 952      -#define VN_IS_CURZONEROOT(vp)   (VN_CMP(vp, ZONE_ROOTVP()))
      953 +#define VN_IS_CURZONEROOT(vp)   (VN_CMP(vp, ZONE_ROOTVP()))
 953  954  
 954  955  /*
 955  956   * Zone-safe version of thread_create() to be used when the caller wants to
 956  957   * create a kernel thread to run within the current zone's context.
 957  958   */
 958  959  extern kthread_t *zthread_create(caddr_t, size_t, void (*)(), void *, size_t,
 959  960      pri_t);
 960  961  extern void zthread_exit(void);
 961  962  
 962  963  /*
 963  964   * Functions for an external observer to register interest in a zone's status
 964  965   * change.  Observers will be woken up when the zone status equals the status
 965  966   * argument passed in (in the case of zone_status_timedwait, the function may
 966  967   * also return because of a timeout; zone_status_wait_sig may return early due
 967  968   * to a signal being delivered; zone_status_timedwait_sig may return for any of
 968  969   * the above reasons).
 969  970   *
 970  971   * Otherwise these behave identically to cv_timedwait(), cv_wait(), and
 971  972   * cv_wait_sig() respectively.
 972  973   */
 973  974  extern clock_t zone_status_timedwait(zone_t *, clock_t, zone_status_t);
 974  975  extern clock_t zone_status_timedwait_sig(zone_t *, clock_t, zone_status_t);
 975  976  extern void zone_status_wait(zone_t *, zone_status_t);
 976  977  extern int zone_status_wait_sig(zone_t *, zone_status_t);
 977  978  
 978  979  /*
 979  980   * Get the status  of the zone (at the time it was called).  The state may
 980  981   * have progressed by the time it is returned.
 981  982   */
 982  983  extern zone_status_t zone_status_get(zone_t *);
 983  984  
 984  985  /*
 985  986   * Safely get the hostid of the specified zone (defaults to machine's hostid
 986  987   * if the specified zone doesn't emulate a hostid).  Passing NULL retrieves
 987  988   * the global zone's (i.e., physical system's) hostid.
 988  989   */
 989  990  extern uint32_t zone_get_hostid(zone_t *);
 990  991  
 991  992  /*
 992  993   * Get the "kcred" credentials corresponding to the given zone.
 993  994   */
 994  995  extern struct cred *zone_get_kcred(zoneid_t);
 995  996  
 996  997  /*
 997  998   * Get/set the pool the zone is currently bound to.
 998  999   */
 999 1000  extern struct pool *zone_pool_get(zone_t *);
1000 1001  extern void zone_pool_set(zone_t *, struct pool *);
1001 1002  
1002 1003  /*
1003 1004   * Get/set the pset the zone is currently using.
1004 1005   */
1005 1006  extern psetid_t zone_pset_get(zone_t *);
1006 1007  extern void zone_pset_set(zone_t *, psetid_t);
1007 1008  
1008 1009  /*
1009 1010   * Get the number of cpus/online-cpus visible from the given zone.
1010 1011   */
1011 1012  extern int zone_ncpus_get(zone_t *);
1012 1013  extern int zone_ncpus_online_get(zone_t *);
1013 1014  
1014 1015  /*
1015 1016   * Returns true if the named pool/dataset is visible in the current zone.
1016 1017   */
1017 1018  extern int zone_dataset_visible(const char *, int *);
1018 1019  extern int zone_dataset_visible_inzone(zone_t *, const char *, int *);
1019 1020  
1020 1021  /*
1021 1022   * zone version of kadmin()
1022 1023   */
1023 1024  extern int zone_kadmin(int, int, const char *, cred_t *);
1024 1025  extern void zone_shutdown_global(void);
1025 1026  
1026 1027  extern void mount_in_progress(zone_t *);
1027 1028  extern void mount_completed(zone_t *);
1028 1029  
1029 1030  extern int zone_walk(int (*)(zone_t *, void *), void *);
1030 1031  
1031 1032  struct page;
1032 1033  extern void zone_add_page(struct page *);
1033 1034  extern void zone_rm_page(struct page *);
1034 1035  extern void zone_pageout_stat(int, zone_pageout_op_t);
1035 1036  extern void zone_get_physmem_data(int, pgcnt_t *, pgcnt_t *);
1036 1037  
1037 1038  /* Interfaces for page scanning */
1038 1039  extern uint_t zone_num_over_cap;
1039 1040  extern zone_persist_t zone_pdata[MAX_ZONES];
1040 1041  
1041 1042  extern rctl_hndl_t rc_zone_locked_mem;
1042 1043  extern rctl_hndl_t rc_zone_max_swap;
1043 1044  extern rctl_hndl_t rc_zone_phys_mem;
1044 1045  extern rctl_hndl_t rc_zone_max_lofi;
1045 1046  
1046 1047  /* For publishing sysevents related to a particular zone */
1047 1048  extern void zone_sysevent_publish(zone_t *, const char *, const char *,
1048 1049      nvlist_t *);
1049 1050  
1050 1051  #endif  /* _KERNEL */
1051 1052  
1052 1053  #ifdef  __cplusplus
1053 1054  }
1054 1055  #endif
1055 1056  
1056 1057  #endif  /* _SYS_ZONE_H */
  
    | 
      ↓ open down ↓ | 
    94 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX