Print this page
6149 use NULL capable segop as a shorthand for no-capabilities


  88  *
  89  * segmap_kpm -- separate on/off switch for segmap using segkpm:
  90  * . Set by default.
  91  * . Will be disabled when kpm_enable is zero.
  92  * . Will be disabled when MAXBSIZE != PAGESIZE.
  93  * . Can be disabled via /etc/system.
  94  *
  95  */
  96 int kpm_enable = 1;
  97 int kpm_smallpages = 0;
  98 int segmap_kpm = 1;
  99 
 100 /*
 101  * Private seg op routines.
 102  */
 103 faultcode_t segkpm_fault(struct hat *hat, struct seg *seg, caddr_t addr,
 104                         size_t len, enum fault_type type, enum seg_rw rw);
 105 static void     segkpm_dump(struct seg *);
 106 static void     segkpm_badop(void);
 107 static int      segkpm_notsup(void);
 108 static int      segkpm_capable(struct seg *, segcapability_t);
 109 
 110 #define SEGKPM_BADOP(t) (t(*)())segkpm_badop
 111 #define SEGKPM_NOTSUP   (int(*)())segkpm_notsup
 112 
 113 static struct seg_ops segkpm_ops = {
 114         .dup            = SEGKPM_BADOP(int),
 115         .unmap          = SEGKPM_BADOP(int),
 116         .free           = SEGKPM_BADOP(void),
 117         .fault          = segkpm_fault,
 118         .faulta         = SEGKPM_BADOP(int),
 119         .setprot        = SEGKPM_BADOP(int),
 120         .checkprot      = SEGKPM_BADOP(int),
 121         .kluster        = SEGKPM_BADOP(int),
 122         .swapout        = SEGKPM_BADOP(size_t),
 123         .sync           = SEGKPM_BADOP(int),
 124         .incore         = SEGKPM_BADOP(size_t),
 125         .lockop         = SEGKPM_BADOP(int),
 126         .getprot        = SEGKPM_BADOP(int),
 127         .getoffset      = SEGKPM_BADOP(u_offset_t),
 128         .gettype        = SEGKPM_BADOP(int),
 129         .getvp          = SEGKPM_BADOP(int),
 130         .advise         = SEGKPM_BADOP(int),
 131         .dump           = segkpm_dump,
 132         .pagelock       = SEGKPM_NOTSUP,
 133         .setpagesize    = SEGKPM_BADOP(int),
 134         .getmemid       = SEGKPM_BADOP(int),
 135         .getpolicy      = SEGKPM_BADOP(lgrp_mem_policy_info_t *),
 136         .capable        = segkpm_capable,
 137 };
 138 
 139 /*
 140  * kpm_pgsz and kpm_pgshft are set by platform layer.
 141  */
 142 size_t          kpm_pgsz;       /* kpm page size */
 143 uint_t          kpm_pgshft;     /* kpm page shift */
 144 u_offset_t      kpm_pgoff;      /* kpm page offset mask */
 145 uint_t          kpmp2pshft;     /* kpm page to page shift */
 146 pgcnt_t         kpmpnpgs;       /* how many pages per kpm page */
 147 
 148 
 149 #ifdef  SEGKPM_SUPPORT
 150 
 151 int
 152 segkpm_create(struct seg *seg, void *argsp)
 153 {
 154         struct segkpm_data *skd;
 155         struct segkpm_crargs *b = (struct segkpm_crargs *)argsp;
 156         ushort_t *p;


 311 void segkpm_mapout_validkpme(struct kpme *kpme) {}
 312 
 313 static void
 314 segkpm_badop() {}
 315 
 316 #endif  /* SEGKPM_SUPPORT */
 317 
 318 static int
 319 segkpm_notsup()
 320 {
 321         return (ENOTSUP);
 322 }
 323 
 324 /*
 325  * segkpm pages are not dumped, so we just return
 326  */
 327 /*ARGSUSED*/
 328 static void
 329 segkpm_dump(struct seg *seg)
 330 {}
 331 
 332 /*
 333  * We claim to have no special capabilities.
 334  */
 335 /*ARGSUSED*/
 336 static int
 337 segkpm_capable(struct seg *seg, segcapability_t capability)
 338 {
 339         return (0);
 340 }


  88  *
  89  * segmap_kpm -- separate on/off switch for segmap using segkpm:
  90  * . Set by default.
  91  * . Will be disabled when kpm_enable is zero.
  92  * . Will be disabled when MAXBSIZE != PAGESIZE.
  93  * . Can be disabled via /etc/system.
  94  *
  95  */
  96 int kpm_enable = 1;
  97 int kpm_smallpages = 0;
  98 int segmap_kpm = 1;
  99 
 100 /*
 101  * Private seg op routines.
 102  */
 103 faultcode_t segkpm_fault(struct hat *hat, struct seg *seg, caddr_t addr,
 104                         size_t len, enum fault_type type, enum seg_rw rw);
 105 static void     segkpm_dump(struct seg *);
 106 static void     segkpm_badop(void);
 107 static int      segkpm_notsup(void);

 108 
 109 #define SEGKPM_BADOP(t) (t(*)())segkpm_badop
 110 #define SEGKPM_NOTSUP   (int(*)())segkpm_notsup
 111 
 112 static struct seg_ops segkpm_ops = {
 113         .dup            = SEGKPM_BADOP(int),
 114         .unmap          = SEGKPM_BADOP(int),
 115         .free           = SEGKPM_BADOP(void),
 116         .fault          = segkpm_fault,
 117         .faulta         = SEGKPM_BADOP(int),
 118         .setprot        = SEGKPM_BADOP(int),
 119         .checkprot      = SEGKPM_BADOP(int),
 120         .kluster        = SEGKPM_BADOP(int),
 121         .swapout        = SEGKPM_BADOP(size_t),
 122         .sync           = SEGKPM_BADOP(int),
 123         .incore         = SEGKPM_BADOP(size_t),
 124         .lockop         = SEGKPM_BADOP(int),
 125         .getprot        = SEGKPM_BADOP(int),
 126         .getoffset      = SEGKPM_BADOP(u_offset_t),
 127         .gettype        = SEGKPM_BADOP(int),
 128         .getvp          = SEGKPM_BADOP(int),
 129         .advise         = SEGKPM_BADOP(int),
 130         .dump           = segkpm_dump,
 131         .pagelock       = SEGKPM_NOTSUP,
 132         .setpagesize    = SEGKPM_BADOP(int),
 133         .getmemid       = SEGKPM_BADOP(int),
 134         .getpolicy      = SEGKPM_BADOP(lgrp_mem_policy_info_t *),

 135 };
 136 
 137 /*
 138  * kpm_pgsz and kpm_pgshft are set by platform layer.
 139  */
 140 size_t          kpm_pgsz;       /* kpm page size */
 141 uint_t          kpm_pgshft;     /* kpm page shift */
 142 u_offset_t      kpm_pgoff;      /* kpm page offset mask */
 143 uint_t          kpmp2pshft;     /* kpm page to page shift */
 144 pgcnt_t         kpmpnpgs;       /* how many pages per kpm page */
 145 
 146 
 147 #ifdef  SEGKPM_SUPPORT
 148 
 149 int
 150 segkpm_create(struct seg *seg, void *argsp)
 151 {
 152         struct segkpm_data *skd;
 153         struct segkpm_crargs *b = (struct segkpm_crargs *)argsp;
 154         ushort_t *p;


 309 void segkpm_mapout_validkpme(struct kpme *kpme) {}
 310 
 311 static void
 312 segkpm_badop() {}
 313 
 314 #endif  /* SEGKPM_SUPPORT */
 315 
 316 static int
 317 segkpm_notsup()
 318 {
 319         return (ENOTSUP);
 320 }
 321 
 322 /*
 323  * segkpm pages are not dumped, so we just return
 324  */
 325 /*ARGSUSED*/
 326 static void
 327 segkpm_dump(struct seg *seg)
 328 {}