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.
|