Print this page
use NULL dump segop as a shorthand for no-op
Instead of forcing every segment driver to implement a dummy function that
does nothing, handle NULL dump segop function pointer as a no-op shorthand.
const-ify make segment ops structures
There is no reason to keep the segment ops structures writable.
use NULL setpagesize segop as a shorthand for ENOTSUP
Instead of forcing every segment driver to implement a dummp function to
return (hopefully) ENOTSUP, handle NULL setpagesize segop function pointer
as "return ENOTSUP" shorthand.
use NULL getmemid segop as a shorthand for ENODEV
Instead of forcing every segment driver to implement a dummy function to
return (hopefully) ENODEV, handle NULL getmemid segop function pointer as
"return ENODEV" shorthand.
segop_getpolicy already checks for a NULL op
no need for bad-op segment op functions
The segment drivers have a number of bad-op functions that simply panic.
Keeping the function pointer NULL will accomplish the same thing in most
cases.  In other cases, keeping the function pointer NULL will result in
proper error code being returned.
use C99 initializers in segment ops structures
remove whole-process swapping
Long before Unix supported paging, it used process swapping to reclaim
memory.  The code is there and in theory it runs when we get *extremely* low
on memory.  In practice, it never runs since the definition of low-on-memory
is antiquated. (XXX: define what antiquated means)
You can check the number of swapout/swapin events with kstats:
$ kstat -p ::vm:swapin ::vm:swapout

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/sparc/v9/vm/seg_nf.c
          +++ new/usr/src/uts/sparc/v9/vm/seg_nf.c
↓ open down ↓ 23 lines elided ↑ open up ↑
  24   24   */
  25   25  
  26   26  /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
  27   27  /* All Rights Reserved */
  28   28  
  29   29  /*
  30   30   * Portions of this source code were derived from Berkeley 4.3 BSD
  31   31   * under license from the Regents of the University of California.
  32   32   */
  33   33  
  34      -#pragma ident   "%Z%%M% %I%     %E% SMI"
  35      -
  36   34  /*
  37   35   * VM - segment for non-faulting loads.
  38   36   */
  39   37  
  40   38  #include <sys/types.h>
  41   39  #include <sys/t_lock.h>
  42   40  #include <sys/param.h>
  43   41  #include <sys/mman.h>
  44   42  #include <sys/errno.h>
  45   43  #include <sys/kmem.h>
↓ open down ↓ 15 lines elided ↑ open up ↑
  61   59   * Private seg op routines.
  62   60   */
  63   61  static int      segnf_dup(struct seg *seg, struct seg *newseg);
  64   62  static int      segnf_unmap(struct seg *seg, caddr_t addr, size_t len);
  65   63  static void     segnf_free(struct seg *seg);
  66   64  static faultcode_t segnf_nomap(void);
  67   65  static int      segnf_setprot(struct seg *seg, caddr_t addr,
  68   66                      size_t len, uint_t prot);
  69   67  static int      segnf_checkprot(struct seg *seg, caddr_t addr,
  70   68                      size_t len, uint_t prot);
  71      -static void     segnf_badop(void);
  72   69  static int      segnf_nop(void);
  73   70  static int      segnf_getprot(struct seg *seg, caddr_t addr,
  74   71                      size_t len, uint_t *protv);
  75   72  static u_offset_t segnf_getoffset(struct seg *seg, caddr_t addr);
  76   73  static int      segnf_gettype(struct seg *seg, caddr_t addr);
  77   74  static int      segnf_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp);
  78      -static void     segnf_dump(struct seg *seg);
  79   75  static int      segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
  80   76                      struct page ***ppp, enum lock_type type, enum seg_rw rw);
  81      -static int      segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
  82      -                    uint_t szc);
  83      -static int      segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp);
  84      -static lgrp_mem_policy_info_t   *segnf_getpolicy(struct seg *seg,
  85      -    caddr_t addr);
  86      -
  87      -
  88      -struct seg_ops segnf_ops = {
  89      -        segnf_dup,
  90      -        segnf_unmap,
  91      -        segnf_free,
  92      -        (faultcode_t (*)(struct hat *, struct seg *, caddr_t, size_t,
  93      -            enum fault_type, enum seg_rw))
  94      -                segnf_nomap,            /* fault */
  95      -        (faultcode_t (*)(struct seg *, caddr_t))
  96      -                segnf_nomap,            /* faulta */
  97      -        segnf_setprot,
  98      -        segnf_checkprot,
  99      -        (int (*)())segnf_badop,         /* kluster */
 100      -        (size_t (*)(struct seg *))NULL, /* swapout */
 101      -        (int (*)(struct seg *, caddr_t, size_t, int, uint_t))
 102      -                segnf_nop,              /* sync */
 103      -        (size_t (*)(struct seg *, caddr_t, size_t, char *))
 104      -                segnf_nop,              /* incore */
 105      -        (int (*)(struct seg *, caddr_t, size_t, int, int, ulong_t *, size_t))
 106      -                segnf_nop,              /* lockop */
 107      -        segnf_getprot,
 108      -        segnf_getoffset,
 109      -        segnf_gettype,
 110      -        segnf_getvp,
 111      -        (int (*)(struct seg *, caddr_t, size_t, uint_t))
 112      -                segnf_nop,              /* advise */
 113      -        segnf_dump,
 114      -        segnf_pagelock,
 115      -        segnf_setpagesize,
 116      -        segnf_getmemid,
 117      -        segnf_getpolicy,
       77 +
       78 +
       79 +const struct seg_ops segnf_ops = {
       80 +        .dup            = segnf_dup,
       81 +        .unmap          = segnf_unmap,
       82 +        .free           = segnf_free,
       83 +        .fault          = (faultcode_t (*)(struct hat *, struct seg *, caddr_t,
       84 +            size_t, enum fault_type, enum seg_rw))segnf_nomap,
       85 +        .faulta         = (faultcode_t (*)(struct seg *, caddr_t)) segnf_nomap,
       86 +        .setprot        = segnf_setprot,
       87 +        .checkprot      = segnf_checkprot,
       88 +        .sync           = (int (*)(struct seg *, caddr_t, size_t, int, uint_t))
       89 +                segnf_nop,
       90 +        .incore         = (size_t (*)(struct seg *, caddr_t, size_t, char *))
       91 +                segnf_nop,
       92 +        .lockop         = (int (*)(struct seg *, caddr_t, size_t, int, int,
       93 +            ulong_t *, size_t))segnf_nop,
       94 +        .getprot        = segnf_getprot,
       95 +        .getoffset      = segnf_getoffset,
       96 +        .gettype        = segnf_gettype,
       97 +        .getvp          = segnf_getvp,
       98 +        .advise         = (int (*)(struct seg *, caddr_t, size_t, uint_t))
       99 +                segnf_nop,
      100 +        .pagelock       = segnf_pagelock,
 118  101  };
 119  102  
 120  103  /*
 121  104   * vnode and page for the page of zeros we use for the nf mappings.
 122  105   */
 123  106  static kmutex_t segnf_lock;
 124  107  static struct vnode nfvp;
 125  108  static struct page **nfpp;
 126  109  
 127  110  #define addr_to_vcolor(addr)                                            \
↓ open down ↓ 271 lines elided ↑ open up ↑
 399  382  static int
 400  383  segnf_checkprot(struct seg *seg, caddr_t addr, size_t len, uint_t prot)
 401  384  {
 402  385          uint_t sprot;
 403  386          ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
 404  387  
 405  388          sprot = seg->s_as == &kas ?  PROT_READ : PROT_READ|PROT_USER;
 406  389          return ((prot & sprot) == prot ? 0 : EACCES);
 407  390  }
 408  391  
 409      -static void
 410      -segnf_badop(void)
 411      -{
 412      -        panic("segnf_badop");
 413      -        /*NOTREACHED*/
 414      -}
 415      -
 416  392  static int
 417  393  segnf_nop(void)
 418  394  {
 419  395          return (0);
 420  396  }
 421  397  
 422  398  static int
 423  399  segnf_getprot(struct seg *seg, caddr_t addr, size_t len, uint_t *protv)
 424  400  {
 425  401          size_t pgno = seg_page(seg, addr + len) - seg_page(seg, addr) + 1;
↓ open down ↓ 26 lines elided ↑ open up ↑
 452  428  /* ARGSUSED */
 453  429  static int
 454  430  segnf_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp)
 455  431  {
 456  432          ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
 457  433  
 458  434          *vpp = &nfvp;
 459  435          return (0);
 460  436  }
 461  437  
 462      -/*
 463      - * segnf pages are not dumped, so we just return
 464      - */
 465      -/* ARGSUSED */
 466      -static void
 467      -segnf_dump(struct seg *seg)
 468      -{}
 469      -
 470  438  /*ARGSUSED*/
 471  439  static int
 472  440  segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
 473  441      struct page ***ppp, enum lock_type type, enum seg_rw rw)
 474  442  {
 475  443          return (ENOTSUP);
 476      -}
 477      -
 478      -/*ARGSUSED*/
 479      -static int
 480      -segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
 481      -    uint_t szc)
 482      -{
 483      -        return (ENOTSUP);
 484      -}
 485      -
 486      -/*ARGSUSED*/
 487      -static int
 488      -segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp)
 489      -{
 490      -        return (ENODEV);
 491      -}
 492      -
 493      -/*ARGSUSED*/
 494      -static lgrp_mem_policy_info_t *
 495      -segnf_getpolicy(struct seg *seg, caddr_t addr)
 496      -{
 497      -        return (NULL);
 498  444  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX