62 static int segnf_unmap(struct seg *seg, caddr_t addr, size_t len);
63 static void segnf_free(struct seg *seg);
64 static faultcode_t segnf_nomap(void);
65 static int segnf_setprot(struct seg *seg, caddr_t addr,
66 size_t len, uint_t prot);
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.
466 static int
467 segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
468 struct page ***ppp, enum lock_type type, enum seg_rw rw)
469 {
470 return (ENOTSUP);
471 }
472
473 /*ARGSUSED*/
474 static int
475 segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
476 uint_t szc)
477 {
478 return (ENOTSUP);
479 }
480
481 /*ARGSUSED*/
482 static int
483 segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp)
484 {
485 return (ENODEV);
486 }
487
488 /*ARGSUSED*/
489 static lgrp_mem_policy_info_t *
490 segnf_getpolicy(struct seg *seg, caddr_t addr)
491 {
492 return (NULL);
493 }
|
62 static int segnf_unmap(struct seg *seg, caddr_t addr, size_t len);
63 static void segnf_free(struct seg *seg);
64 static faultcode_t segnf_nomap(void);
65 static int segnf_setprot(struct seg *seg, caddr_t addr,
66 size_t len, uint_t prot);
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
83
84 struct seg_ops segnf_ops = {
85 .dup = segnf_dup,
86 .unmap = segnf_unmap,
87 .free = segnf_free,
88 .fault = (faultcode_t (*)(struct hat *, struct seg *, caddr_t,
89 size_t, enum fault_type, enum seg_rw))segnf_nomap,
90 .faulta = (faultcode_t (*)(struct seg *, caddr_t)) segnf_nomap,
91 .setprot = segnf_setprot,
92 .checkprot = segnf_checkprot,
93 .kluster = (int (*)())segnf_badop,
94 .sync = (int (*)(struct seg *, caddr_t, size_t, int, uint_t))
95 segnf_nop,
96 .incore = (size_t (*)(struct seg *, caddr_t, size_t, char *))
97 segnf_nop,
98 .lockop = (int (*)(struct seg *, caddr_t, size_t, int, int,
99 ulong_t *, size_t))segnf_nop,
100 .getprot = segnf_getprot,
101 .getoffset = segnf_getoffset,
102 .gettype = segnf_gettype,
103 .getvp = segnf_getvp,
104 .advise = (int (*)(struct seg *, caddr_t, size_t, uint_t))
105 segnf_nop,
106 .dump = segnf_dump,
107 .pagelock = segnf_pagelock,
108 .setpagesize = segnf_setpagesize,
109 .getmemid = segnf_getmemid,
110 };
111
112 /*
113 * vnode and page for the page of zeros we use for the nf mappings.
114 */
115 static kmutex_t segnf_lock;
116 static struct vnode nfvp;
117 static struct page **nfpp;
118
119 #define addr_to_vcolor(addr) \
120 (shm_alignment) ? \
121 ((int)(((uintptr_t)(addr) & (shm_alignment - 1)) >> PAGESHIFT)) : 0
122
123 /*
124 * We try to limit the number of Non-fault segments created.
125 * Non fault segments are created to optimize sparc V9 code which uses
126 * the sparc nonfaulting load ASI (ASI_PRIMARY_NOFAULT).
127 *
128 * There are several reasons why creating too many non-fault segments
129 * could cause problems.
463 static int
464 segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
465 struct page ***ppp, enum lock_type type, enum seg_rw rw)
466 {
467 return (ENOTSUP);
468 }
469
470 /*ARGSUSED*/
471 static int
472 segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
473 uint_t szc)
474 {
475 return (ENOTSUP);
476 }
477
478 /*ARGSUSED*/
479 static int
480 segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp)
481 {
482 return (ENODEV);
483 }
|