Lines Matching refs:pp

104  *		if (! page_tryupgrade(pp)) {
105 * page_unlock(pp);
106 * while (! page_lock(pp, SE_EXCL, NULL, P_RECLAIM)) {
110 * page_free(pp);
112 * The problem is that pp can change identity right after the
114 * there, change pp's identity, and hash pp onto the retired_vnode.
358 #define PR_TYPES(pp) { \
360 if (pp->p_vnode) \
362 if (PP_ISKAS(pp)) \
364 if (PP_ISFREE(pp)) \
366 if (hat_ismod(pp)) \
368 if (pp->p_toxic & PR_UE) \
370 if (pp->p_toxic & PR_MCE) \
399 * May be called with a NULL pp (PRD_INVALID_PA case).
462 page_settoxic(page_t *pp, uchar_t bits)
464 atomic_or_8(&pp->p_toxic, bits);
475 page_clrtoxic(page_t *pp, uchar_t bits)
477 ASSERT((bits & PR_CAPTURE) || PAGE_EXCL(pp));
478 atomic_and_8(&pp->p_toxic, ~bits);
486 page_retire_done(page_t *pp, int code)
492 if (pp != NULL) {
493 pa = mmu_ptob((uint64_t)pp->p_pagenum);
515 if (pp != NULL) {
516 page_settoxic(pp, PR_MSG);
530 page_retire_destroy(page_t *pp)
532 u_offset_t off = (u_offset_t)((uintptr_t)pp);
534 ASSERT(PAGE_EXCL(pp));
535 ASSERT(!PP_ISFREE(pp));
536 ASSERT(pp->p_szc == 0);
537 ASSERT(!hat_page_is_mapped(pp));
538 ASSERT(!pp->p_vnode);
540 page_clr_all_props(pp);
541 pagescrub(pp, 0, MMU_PAGESIZE);
543 pp->p_next = NULL;
544 pp->p_prev = NULL;
545 if (page_hashin(pp, retired_pages, off, NULL) == 0) {
546 cmn_err(CE_PANIC, "retired page %p hashin failed", (void *)pp);
549 page_settoxic(pp, PR_RETIRED);
552 if (pp->p_toxic & PR_FMA) {
554 } else if (pp->p_toxic & PR_UE) {
564 page_unlock(pp);
597 page_clear_transient_ue(page_t *pp)
607 ASSERT(PAGE_EXCL(pp));
608 ASSERT(PP_PR_REQ(pp));
609 ASSERT(pp->p_szc == 0);
610 ASSERT(!hat_page_is_mapped(pp));
616 pagescrub(pp, 0, PAGESIZE);
625 kaddr = ppmapin(pp, PROT_READ|PROT_WRITE, (caddr_t)-1);
627 pa = ptob((uint64_t)page_pptonum(pp));
687 page_retire_transient_ue(page_t *pp)
689 ASSERT(PAGE_EXCL(pp));
690 ASSERT(!hat_page_is_mapped(pp));
697 if (pp->p_toxic & PR_UE_SCRUBBED) {
702 if (page_clear_transient_ue(pp)) {
707 page_settoxic(pp, PR_UE_SCRUBBED);
715 page_clrtoxic(pp, PR_UE | PR_MCE | PR_MSG);
718 VN_DISPOSE(pp, B_FREE, 1, kcred);
759 page_t *pp;
776 for (pp = retired_pages->v_pages->p_vpnext;
777 pp != retired_pages->v_pages; pp = pp->p_vpnext) {
796 page_t *pp;
811 pp = retired_pages->v_pages;
813 (pp == NULL)) {
817 kspmem->address = ptob(pp->p_pagenum);
820 for (pp = pp->p_vpnext; pp != retired_pages->v_pages;
821 pp = pp->p_vpnext, kspmem++) {
824 kspmem->address = ptob(pp->p_pagenum);
936 page_retire_thread_cb(page_t *pp)
939 if (!PP_ISKAS(pp) && page_trylock(pp, SE_EXCL)) {
941 page_unlock(pp);
954 page_retire_pp_finish(page_t *pp, void *notused, uint_t flags)
958 ASSERT(PAGE_EXCL(pp));
959 ASSERT(pp->p_iolock_state == 0);
960 ASSERT(pp->p_szc == 0);
962 toxic = pp->p_toxic;
972 if (page_retire_transient_ue(pp)) {
974 (void) page_retire_done(pp, PRD_UE_SCRUBBED);
977 page_retire_destroy(pp);
978 (void) page_retire_done(pp, PRD_SUCCESS);
983 page_retire_destroy(pp);
984 (void) page_retire_done(pp, PRD_SUCCESS);
988 page_retire_destroy(pp);
989 (void) page_retire_done(pp, PRD_SUCCESS);
1032 page_t *pp;
1037 pp = page_numtopp_nolock(mmu_btop(pa));
1038 if (pp == NULL) {
1041 return (page_retire_done(pp, PRD_INVALID_PA));
1043 if (PP_RETIRED(pp)) {
1045 return (page_retire_done(pp, PRD_DUPLICATE));
1052 if ((reason & PR_UE) && !PP_TOXIC(pp)) {
1055 } else if (PP_PR_REQ(pp)) {
1057 return (page_retire_done(pp, PRD_DUPLICATE));
1066 return (page_retire_done(pp, PRD_LIMIT));
1070 page_settoxic(pp, reason);
1071 if (page_trycapture(pp, 0, CAPTURE_RETIRE, pp->p_vnode) == 0) {
1080 if (PP_RETIRED(pp)) {
1087 if (pp->p_toxic & PR_MSG) {
1088 return (page_retire_done(pp, PRD_FAILED));
1090 return (page_retire_done(pp, PRD_PENDING));
1103 * Returns 0 if page pp was unretired; else an error code.
1114 page_unretire_pp(page_t *pp, int flags)
1121 page_try_reclaim_lock(pp, SE_EXCL, SE_RETIRED)) {
1122 ASSERT(PAGE_EXCL(pp));
1124 if (!PP_RETIRED(pp)) {
1126 page_unlock(pp);
1127 return (page_retire_done(pp, PRD_UNR_NOT));
1131 " page 0x%08x.%08x", mmu_ptob((uint64_t)pp->p_pagenum));
1132 if (pp->p_toxic & PR_FMA) {
1134 } else if (pp->p_toxic & PR_UE) {
1141 page_clrtoxic(pp, PR_RETIRED);
1143 page_clrtoxic(pp, PR_TOXICFLAGS);
1147 page_destroy(pp, 0);
1150 page_hashout(pp, NULL);
1160 return (page_retire_done(pp, PRD_UNR_SUCCESS));
1163 return (page_retire_done(pp, PRD_UNR_CANTLOCK));
1175 * - EAGAIN if the pp can not be locked,
1177 * - EIO if the pp is not retired.
1182 page_t *pp;
1184 pp = page_numtopp_nolock(mmu_btop(pa));
1185 if (pp == NULL) {
1186 return (page_retire_done(pp, PRD_INVALID_PA));
1189 return (page_unretire_pp(pp, PR_UNR_FREE));
1197 page_retire_check_pp(page_t *pp, uint64_t *errors)
1201 if (PP_RETIRED(pp)) {
1204 } else if (PP_PR_REQ(pp)) {
1217 uint64_t toxic = (uint64_t)(pp->p_toxic & PR_ERRMASK);
1244 page_t *pp;
1250 pp = page_numtopp_nolock(mmu_btop(pa));
1251 if (pp == NULL) {
1252 return (page_retire_done(pp, PRD_INVALID_PA));
1255 return (page_retire_check_pp(pp, errors));
1264 page_t *first, *pp, *cpp, *cpp2, *lpp;
1276 pp = first = page_first();
1278 if (pp->p_szc && PP_PAGEROOT(pp) == pp) {
1279 cpp = pp + 1;
1280 lpp = PP_ISFREE(pp)? pp : pp + 2;
1281 cpp2 = pp + 3;
1282 if (!page_trylock(lpp, pp == lpp? SE_EXCL : SE_SHARED))
1297 } while ((pp = page_next(pp)) != first);