634 arg->a_off = pp->p_offset;
635 arg->a_len = PAGESIZE;
636 arg->a_flags = B_ASYNC | B_FREE;
637 arg->a_cred = kcred;
638 sw_putreq(arg);
639
640 return (0);
641 }
642
643 SWAPFS_PRINT(SWAP_PUTP,
644 "swap_putapage: pp %p, vp %p, off %llx, flags %x\n",
645 pp, vp, pp->p_offset, flags, 0);
646
647 ASSERT(PAGE_LOCKED(pp));
648
649 off = pp->p_offset;
650
651 doff = off;
652 dlen = PAGESIZE;
653
654 if (err = swap_newphysname(vp, off, &doff, &dlen, &pvp, &poff)) {
655 err = (flags == (B_ASYNC | B_FREE) ? ENOMEM : 0);
656 hat_setmod(pp);
657 page_io_unlock(pp);
658 page_unlock(pp);
659 goto out;
660 }
661
662 klvp = pvp;
663 klstart = poff;
664 pplist = pp;
665 /*
666 * If this is ASYNC | FREE and we've accumulated a bunch of such
667 * pending requests, kluster.
668 */
669 if (flags == (B_ASYNC | B_FREE))
670 swap_klustsize = klustsize;
671 else
672 swap_klustsize = PAGESIZE;
673 se = (flags & B_FREE ? SE_EXCL : SE_SHARED);
674 klsz = PAGESIZE;
678 swap_getiopages += btop(klsz);
679 break;
680 }
681 ASSERT(vn_matchops(arg->a_vp, swap_vnodeops));
682 vp = arg->a_vp;
683 off = arg->a_off;
684
685 if ((pp = page_lookup_nowait(vp, off, se)) == NULL) {
686 swap_otherfail++;
687 swap_otherpages += btop(klsz);
688 sw_putfree(arg);
689 break;
690 }
691 if (pvn_getdirty(pp, flags | B_DELWRI) == 0) {
692 sw_putfree(arg);
693 continue;
694 }
695 /* Get new physical backing store for the page */
696 doff = off;
697 dlen = PAGESIZE;
698 if (err = swap_newphysname(vp, off, &doff, &dlen,
699 &pvp, &poff)) {
700 swap_otherfail++;
701 swap_otherpages += btop(klsz);
702 hat_setmod(pp);
703 page_io_unlock(pp);
704 page_unlock(pp);
705 sw_putbackreq(arg);
706 break;
707 }
708 /* Try to cluster new physical name with previous ones */
709 if (klvp == pvp && poff == klstart + klsz) {
710 klsz += PAGESIZE;
711 page_add(&pplist, pp);
712 pplist = pplist->p_next;
713 sw_putfree(arg);
714 } else if (klvp == pvp && poff == klstart - PAGESIZE) {
715 klsz += PAGESIZE;
716 klstart -= PAGESIZE;
717 page_add(&pplist, pp);
718 sw_putfree(arg);
719 } else {
|
634 arg->a_off = pp->p_offset;
635 arg->a_len = PAGESIZE;
636 arg->a_flags = B_ASYNC | B_FREE;
637 arg->a_cred = kcred;
638 sw_putreq(arg);
639
640 return (0);
641 }
642
643 SWAPFS_PRINT(SWAP_PUTP,
644 "swap_putapage: pp %p, vp %p, off %llx, flags %x\n",
645 pp, vp, pp->p_offset, flags, 0);
646
647 ASSERT(PAGE_LOCKED(pp));
648
649 off = pp->p_offset;
650
651 doff = off;
652 dlen = PAGESIZE;
653
654 /* All newphysname() failure types are treated the same. */
655 if (swap_newphysname(vp, off, &doff, &dlen, &pvp, &poff) != 0) {
656 err = (flags == (B_ASYNC | B_FREE) ? ENOMEM : 0);
657 hat_setmod(pp);
658 page_io_unlock(pp);
659 page_unlock(pp);
660 goto out;
661 }
662
663 klvp = pvp;
664 klstart = poff;
665 pplist = pp;
666 /*
667 * If this is ASYNC | FREE and we've accumulated a bunch of such
668 * pending requests, kluster.
669 */
670 if (flags == (B_ASYNC | B_FREE))
671 swap_klustsize = klustsize;
672 else
673 swap_klustsize = PAGESIZE;
674 se = (flags & B_FREE ? SE_EXCL : SE_SHARED);
675 klsz = PAGESIZE;
679 swap_getiopages += btop(klsz);
680 break;
681 }
682 ASSERT(vn_matchops(arg->a_vp, swap_vnodeops));
683 vp = arg->a_vp;
684 off = arg->a_off;
685
686 if ((pp = page_lookup_nowait(vp, off, se)) == NULL) {
687 swap_otherfail++;
688 swap_otherpages += btop(klsz);
689 sw_putfree(arg);
690 break;
691 }
692 if (pvn_getdirty(pp, flags | B_DELWRI) == 0) {
693 sw_putfree(arg);
694 continue;
695 }
696 /* Get new physical backing store for the page */
697 doff = off;
698 dlen = PAGESIZE;
699 if (swap_newphysname(vp, off, &doff, &dlen, &pvp, &poff) != 0) {
700 swap_otherfail++;
701 swap_otherpages += btop(klsz);
702 hat_setmod(pp);
703 page_io_unlock(pp);
704 page_unlock(pp);
705 sw_putbackreq(arg);
706 break;
707 }
708 /* Try to cluster new physical name with previous ones */
709 if (klvp == pvp && poff == klstart + klsz) {
710 klsz += PAGESIZE;
711 page_add(&pplist, pp);
712 pplist = pplist->p_next;
713 sw_putfree(arg);
714 } else if (klvp == pvp && poff == klstart - PAGESIZE) {
715 klsz += PAGESIZE;
716 klstart -= PAGESIZE;
717 page_add(&pplist, pp);
718 sw_putfree(arg);
719 } else {
|