Print this page
use C99 initializers in segment ops structures


  67 static int      segnf_checkprot(struct seg *seg, caddr_t addr,
  68                     size_t len, uint_t prot);
  69 static void     segnf_badop(void);
  70 static int      segnf_nop(void);
  71 static int      segnf_getprot(struct seg *seg, caddr_t addr,
  72                     size_t len, uint_t *protv);
  73 static u_offset_t segnf_getoffset(struct seg *seg, caddr_t addr);
  74 static int      segnf_gettype(struct seg *seg, caddr_t addr);
  75 static int      segnf_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp);
  76 static void     segnf_dump(struct seg *seg);
  77 static int      segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
  78                     struct page ***ppp, enum lock_type type, enum seg_rw rw);
  79 static int      segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
  80                     uint_t szc);
  81 static int      segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp);
  82 static lgrp_mem_policy_info_t   *segnf_getpolicy(struct seg *seg,
  83     caddr_t addr);
  84 
  85 
  86 struct seg_ops segnf_ops = {
  87         segnf_dup,
  88         segnf_unmap,
  89         segnf_free,
  90         (faultcode_t (*)(struct hat *, struct seg *, caddr_t, size_t,
  91             enum fault_type, enum seg_rw))
  92                 segnf_nomap,            /* fault */
  93         (faultcode_t (*)(struct seg *, caddr_t))
  94                 segnf_nomap,            /* faulta */
  95         segnf_setprot,
  96         segnf_checkprot,
  97         (int (*)())segnf_badop,         /* kluster */
  98         (int (*)(struct seg *, caddr_t, size_t, int, uint_t))
  99                 segnf_nop,              /* sync */
 100         (size_t (*)(struct seg *, caddr_t, size_t, char *))
 101                 segnf_nop,              /* incore */
 102         (int (*)(struct seg *, caddr_t, size_t, int, int, ulong_t *, size_t))
 103                 segnf_nop,              /* lockop */
 104         segnf_getprot,
 105         segnf_getoffset,
 106         segnf_gettype,
 107         segnf_getvp,
 108         (int (*)(struct seg *, caddr_t, size_t, uint_t))
 109                 segnf_nop,              /* advise */
 110         segnf_dump,
 111         segnf_pagelock,
 112         segnf_setpagesize,
 113         segnf_getmemid,
 114         segnf_getpolicy,
 115 };
 116 
 117 /*
 118  * vnode and page for the page of zeros we use for the nf mappings.
 119  */
 120 static kmutex_t segnf_lock;
 121 static struct vnode nfvp;
 122 static struct page **nfpp;
 123 
 124 #define addr_to_vcolor(addr)                                            \
 125         (shm_alignment) ?                                               \
 126         ((int)(((uintptr_t)(addr) & (shm_alignment - 1)) >> PAGESHIFT)) : 0
 127 
 128 /*
 129  * We try to limit the number of Non-fault segments created.
 130  * Non fault segments are created to optimize sparc V9 code which uses
 131  * the sparc nonfaulting load ASI (ASI_PRIMARY_NOFAULT).
 132  *
 133  * There are several reasons why creating too many non-fault segments
 134  * could cause problems.




  67 static int      segnf_checkprot(struct seg *seg, caddr_t addr,
  68                     size_t len, uint_t prot);
  69 static void     segnf_badop(void);
  70 static int      segnf_nop(void);
  71 static int      segnf_getprot(struct seg *seg, caddr_t addr,
  72                     size_t len, uint_t *protv);
  73 static u_offset_t segnf_getoffset(struct seg *seg, caddr_t addr);
  74 static int      segnf_gettype(struct seg *seg, caddr_t addr);
  75 static int      segnf_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp);
  76 static void     segnf_dump(struct seg *seg);
  77 static int      segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
  78                     struct page ***ppp, enum lock_type type, enum seg_rw rw);
  79 static int      segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
  80                     uint_t szc);
  81 static int      segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp);
  82 static lgrp_mem_policy_info_t   *segnf_getpolicy(struct seg *seg,
  83     caddr_t addr);
  84 
  85 
  86 struct seg_ops segnf_ops = {
  87         .dup            = segnf_dup,
  88         .unmap          = segnf_unmap,
  89         .free           = segnf_free,
  90         .fault          = (faultcode_t (*)(struct hat *, struct seg *, caddr_t,
  91             size_t, enum fault_type, enum seg_rw))segnf_nomap,
  92         .faulta         = (faultcode_t (*)(struct seg *, caddr_t)) segnf_nomap,
  93         .setprot        = segnf_setprot,
  94         .checkprot      = segnf_checkprot,
  95         .kluster        = (int (*)())segnf_badop,
  96         .sync           = (int (*)(struct seg *, caddr_t, size_t, int, uint_t))
  97                 segnf_nop,
  98         .incore         = (size_t (*)(struct seg *, caddr_t, size_t, char *))
  99                 segnf_nop,
 100         .lockop         = (int (*)(struct seg *, caddr_t, size_t, int, int,
 101             ulong_t *, size_t))segnf_nop,
 102         .getprot        = segnf_getprot,
 103         .getoffset      = segnf_getoffset,
 104         .gettype        = segnf_gettype,
 105         .getvp          = segnf_getvp,
 106         .advise         = (int (*)(struct seg *, caddr_t, size_t, uint_t))
 107                 segnf_nop,
 108         .dump           = segnf_dump,
 109         .pagelock       = segnf_pagelock,
 110         .setpagesize    = segnf_setpagesize,
 111         .getmemid       = segnf_getmemid,
 112         .getpolicy      = segnf_getpolicy,


 113 };
 114 
 115 /*
 116  * vnode and page for the page of zeros we use for the nf mappings.
 117  */
 118 static kmutex_t segnf_lock;
 119 static struct vnode nfvp;
 120 static struct page **nfpp;
 121 
 122 #define addr_to_vcolor(addr)                                            \
 123         (shm_alignment) ?                                               \
 124         ((int)(((uintptr_t)(addr) & (shm_alignment - 1)) >> PAGESHIFT)) : 0
 125 
 126 /*
 127  * We try to limit the number of Non-fault segments created.
 128  * Non fault segments are created to optimize sparc V9 code which uses
 129  * the sparc nonfaulting load ASI (ASI_PRIMARY_NOFAULT).
 130  *
 131  * There are several reasons why creating too many non-fault segments
 132  * could cause problems.