Lines Matching refs:kpd

86 static void	segkp_insert(struct seg *seg, struct segkp_data *kpd);
87 static void segkp_delete(struct seg *seg, struct segkp_data *kpd);
91 struct segkp_data *kpd, size_t len);
93 size_t len, struct segkp_data *kpd, uint_t flags);
95 size_t len, struct segkp_data *kpd, uint_t flags);
267 struct segkp_data *kpd;
278 kpd = segkp_cache[i].kpf_list;
284 while (kpd != NULL) {
287 next = kpd->kp_next;
288 segkp_release_internal(seg, kpd, kpd->kp_len);
289 kpd = next;
304 struct segkp_data *kpd = NULL;
306 if (segkp_get_internal(seg, len, flags, &kpd, NULL) != NULL) {
307 kpd->kp_cookie = -1;
308 return (stom(kpd->kp_base, flags));
320 struct segkp_data *kpd = NULL;
334 kpd = freelist->kpf_list;
335 freelist->kpf_list = kpd->kp_next;
338 kpd->kp_next = NULL;
339 segkp_insert(seg, kpd);
340 return (stom(kpd->kp_base, flags));
344 if (segkp_get_internal(seg, len, flags, &kpd, NULL) != NULL) {
345 kpd->kp_cookie = index;
346 return (stom(kpd->kp_base, flags));
358 struct segkp_data *kpd = NULL;
362 if (segkp_get_internal(seg, len, flags, &kpd, amp) != NULL) {
363 kpd->kp_cookie = -1;
364 return (stom(kpd->kp_base, flags));
391 struct segkp_data *kpd;
413 if ((kpd = kmem_zalloc(sizeof (struct segkp_data), kmflag)) == NULL)
424 kmem_free(kpd, sizeof (struct segkp_data));
433 kmem_free(kpd, sizeof (struct segkp_data));
454 kpd->kp_anon_idx = anon_idx;
455 kpd->kp_anon = amp->ahp;
458 kpd, vbase, len, flags, 1);
468 kmem_free(kpd, sizeof (struct segkp_data));
474 kpd->kp_anon_idx = anon_idx;
475 kpd->kp_anon = kpsd->kpsd_anon;
478 kpd, vbase, len, flags, 1);
480 kpd->kp_anon = NULL;
481 kpd->kp_anon_idx = 0;
511 if ((flags & KPD_HASREDZONE) && KPD_REDZONE(kpd) == i)
514 if (kpd->kp_anon != NULL) {
517 ASSERT(anon_get_ptr(kpd->kp_anon, anon_idx + i)
525 (void) anon_set_ptr(kpd->kp_anon, anon_idx + i,
558 kpd->kp_flags = flags;
559 kpd->kp_base = vbase;
560 kpd->kp_len = len;
561 segkp_release_internal(seg, kpd, va - vbase);
590 kpd->kp_flags = flags;
591 kpd->kp_base = vbase;
592 kpd->kp_len = len;
593 segkp_insert(seg, kpd);
594 *tkpd = kpd;
595 return (stom(kpd->kp_base, flags));
607 struct segkp_data *kpd = NULL;
609 if ((kpd = segkp_find(seg, vaddr)) == NULL) {
610 panic("segkp_release: null kpd");
614 if (kpd->kp_cookie != -1) {
615 freelist = &segkp_cache[kpd->kp_cookie];
618 segkp_delete(seg, kpd);
619 kpd->kp_next = freelist->kpf_list;
620 freelist->kpf_list = kpd;
626 kpd->kp_cookie = -1;
629 segkp_release_internal(seg, kpd, kpd->kp_len);
638 segkp_release_internal(struct seg *seg, struct segkp_data *kpd, size_t len)
650 ASSERT(kpd != NULL);
651 ASSERT((kpd->kp_flags & KPD_HASAMP) == 0 || kpd->kp_cookie == -1);
655 if (kpd->kp_cookie == -1) {
657 segkp_delete(seg, kpd);
665 if (kpd->kp_flags & KPD_HASREDZONE)
666 redzone = KPD_REDZONE(kpd);
669 va = kpd->kp_base;
672 ((kpd->kp_flags & KPD_LOCKED) ? HAT_UNLOAD_UNLOCK : HAT_UNLOAD));
690 if (kpd->kp_anon) {
698 if (kpd->kp_flags & KPD_LOCKED) {
699 ap = anon_get_ptr(kpd->kp_anon,
700 kpd->kp_anon_idx + i);
714 if ((kpd->kp_flags & KPD_HASAMP) == 0) {
715 anon_free(kpd->kp_anon, kpd->kp_anon_idx + i,
722 kpd, va, PAGESIZE, 0, 0);
724 if (kpd->kp_flags & KPD_LOCKED) {
747 if (kpd->kp_flags & KPD_LOCKED) {
748 pgcnt_t pages = btop(SEGKP_MAPLEN(kpd->kp_len, kpd->kp_flags));
749 if ((kpd->kp_flags & KPD_NO_ANON) == 0)
754 vmem_free(SEGKP_VMEM(seg), kpd->kp_base, kpd->kp_len);
755 kmem_free(kpd, sizeof (struct segkp_data));
937 struct segkp_data *kpd = NULL;
950 if ((kpd = segkp_find(seg, vaddr)) == NULL)
953 mutex_enter(&kpd->kp_lock);
956 ASSERT(!(kpd->kp_flags & KPD_LOCKED));
963 if (vaddr != stom(kpd->kp_base, kpd->kp_flags) ||
964 len != SEGKP_MAPLEN(kpd->kp_len, kpd->kp_flags)) {
965 mutex_exit(&kpd->kp_lock);
969 if ((err = segkp_load(hat, seg, vaddr, len, kpd, KPD_LOCKED))) {
970 mutex_exit(&kpd->kp_lock);
973 kpd->kp_flags |= KPD_LOCKED;
974 mutex_exit(&kpd->kp_lock);
979 ASSERT(!(kpd->kp_flags & KPD_NO_ANON));
986 if ((kpd->kp_flags & KPD_HASREDZONE) &&
987 btop((uintptr_t)(vaddr - kpd->kp_base)) == KPD_REDZONE(kpd))
996 if (kpd->kp_flags & KPD_LOCKED) {
997 mutex_exit(&kpd->kp_lock);
1001 err = segkp_load(hat, seg, vaddr, len, kpd, kpd->kp_flags);
1002 mutex_exit(&kpd->kp_lock);
1013 if ((kpd->kp_flags & (KPD_LOCKED|KPD_NO_ANON)) != KPD_LOCKED) {
1018 if (vaddr != stom(kpd->kp_base, kpd->kp_flags) ||
1019 len != SEGKP_MAPLEN(kpd->kp_len, kpd->kp_flags)) {
1025 flags = kpd->kp_flags | KPD_WRITEDIRTY;
1027 flags = kpd->kp_flags;
1028 err = segkp_unlock(hat, seg, vaddr, len, kpd, flags);
1029 kpd->kp_flags &= ~KPD_LOCKED;
1030 mutex_exit(&kpd->kp_lock);
1033 mutex_exit(&kpd->kp_lock);
1048 struct segkp_data *kpd = NULL;
1052 if ((kpd = segkp_find(seg, vaddr)) == NULL)
1055 mutex_enter(&kpd->kp_lock);
1056 mbase = stom(kpd->kp_base, kpd->kp_flags);
1057 mlen = SEGKP_MAPLEN(kpd->kp_len, kpd->kp_flags);
1060 mutex_exit(&kpd->kp_lock);
1063 mutex_exit(&kpd->kp_lock);
1092 struct segkp_data *kpd,
1100 ASSERT(MUTEX_HELD(&kpd->kp_lock));
1107 if ((kpd->kp_flags & KPD_NO_ANON) == 0)
1119 i = ((uintptr_t)(va - kpd->kp_base)) >> PAGESHIFT;
1131 ap = anon_get_ptr(kpd->kp_anon, kpd->kp_anon_idx + i);
1146 (va - vaddr), kpd, flags);
1177 struct segkp_data *kpd,
1192 ASSERT(MUTEX_HELD(&kpd->kp_lock));
1200 i = ((uintptr_t)(va - kpd->kp_base)) >> PAGESHIFT;
1209 ap = anon_get_ptr(kpd->kp_anon, kpd->kp_anon_idx + i);
1262 if ((kpd->kp_flags & KPD_NO_ANON) == 0)
1270 * Insert the kpd in the hash table.
1273 segkp_insert(struct seg *seg, struct segkp_data *kpd)
1279 * Insert the kpd based on the address that will be returned
1282 index = SEGKP_HASH(stom(kpd->kp_base, kpd->kp_flags));
1284 kpd->kp_next = kpsd->kpsd_hash[index];
1285 kpsd->kpsd_hash[index] = kpd;
1290 * Remove kpd from the hash table.
1293 segkp_delete(struct seg *seg, struct segkp_data *kpd)
1301 index = SEGKP_HASH(stom(kpd->kp_base, kpd->kp_flags));
1304 if (*kpp == kpd) {
1305 *kpp = kpd->kp_next;
1314 * Find the kpd associated with a vaddr.
1327 struct segkp_data *kpd;
1334 for (kpd = kpsd->kpsd_hash[i]; kpd != NULL;
1335 kpd = kpd->kp_next) {
1336 if (vaddr >= kpd->kp_base &&
1337 vaddr < kpd->kp_base + kpd->kp_len) {
1339 return (kpd);
1355 struct segkp_data *kpd;
1357 if ((kpd = segkp_find(segkp, v)) != NULL)
1358 return (SEGKP_MAPLEN(kpd->kp_len, kpd->kp_flags));
1370 struct segkp_data *kpd;
1374 for (kpd = kpsd->kpsd_hash[i];
1375 kpd != NULL; kpd = kpd->kp_next) {
1380 addr = kpd->kp_base;
1381 eaddr = addr + kpd->kp_len;