vnode_pager.c (945f418ab8a676a9675bf5b845514cf63dbc652a) vnode_pager.c (eb00b276ab2a5a549620ec3fe92c22fd0ddf948e)
1/*-
2 * Copyright (c) 1990 University of Utah.
3 * Copyright (c) 1991 The Regents of the University of California.
4 * All rights reserved.
5 * Copyright (c) 1993, 1994 John S. Dyson
6 * Copyright (c) 1995, David Greenman
7 *
8 * This code is derived from software contributed to Berkeley by

--- 711 unchanged lines hidden (view full) ---

720 */
721 error = VOP_BMAP(vp, foff / bsize, &bo, &reqblock, NULL, NULL);
722 if (error == EOPNOTSUPP) {
723 VM_OBJECT_LOCK(object);
724
725 for (i = 0; i < count; i++)
726 if (i != reqpage) {
727 vm_page_lock(m[i]);
1/*-
2 * Copyright (c) 1990 University of Utah.
3 * Copyright (c) 1991 The Regents of the University of California.
4 * All rights reserved.
5 * Copyright (c) 1993, 1994 John S. Dyson
6 * Copyright (c) 1995, David Greenman
7 *
8 * This code is derived from software contributed to Berkeley by

--- 711 unchanged lines hidden (view full) ---

720 */
721 error = VOP_BMAP(vp, foff / bsize, &bo, &reqblock, NULL, NULL);
722 if (error == EOPNOTSUPP) {
723 VM_OBJECT_LOCK(object);
724
725 for (i = 0; i < count; i++)
726 if (i != reqpage) {
727 vm_page_lock(m[i]);
728 vm_page_lock_queues();
729 vm_page_free(m[i]);
728 vm_page_free(m[i]);
730 vm_page_unlock_queues();
731 vm_page_unlock(m[i]);
732 }
733 PCPU_INC(cnt.v_vnodein);
734 PCPU_INC(cnt.v_vnodepgsin);
735 error = vnode_pager_input_old(object, m[reqpage]);
736 VM_OBJECT_UNLOCK(object);
737 return (error);
738 } else if (error != 0) {
739 VM_OBJECT_LOCK(object);
740 for (i = 0; i < count; i++)
741 if (i != reqpage) {
742 vm_page_lock(m[i]);
729 vm_page_unlock(m[i]);
730 }
731 PCPU_INC(cnt.v_vnodein);
732 PCPU_INC(cnt.v_vnodepgsin);
733 error = vnode_pager_input_old(object, m[reqpage]);
734 VM_OBJECT_UNLOCK(object);
735 return (error);
736 } else if (error != 0) {
737 VM_OBJECT_LOCK(object);
738 for (i = 0; i < count; i++)
739 if (i != reqpage) {
740 vm_page_lock(m[i]);
743 vm_page_lock_queues();
744 vm_page_free(m[i]);
741 vm_page_free(m[i]);
745 vm_page_unlock_queues();
746 vm_page_unlock(m[i]);
747 }
748 VM_OBJECT_UNLOCK(object);
749 return (VM_PAGER_ERROR);
750
751 /*
752 * if the blocksize is smaller than a page size, then use
753 * special small filesystem code. NFS sometimes has a small
754 * blocksize, but it can handle large reads itself.
755 */
756 } else if ((PAGE_SIZE / bsize) > 1 &&
757 (vp->v_mount->mnt_stat.f_type != nfs_mount_type)) {
758 VM_OBJECT_LOCK(object);
759 for (i = 0; i < count; i++)
760 if (i != reqpage) {
761 vm_page_lock(m[i]);
742 vm_page_unlock(m[i]);
743 }
744 VM_OBJECT_UNLOCK(object);
745 return (VM_PAGER_ERROR);
746
747 /*
748 * if the blocksize is smaller than a page size, then use
749 * special small filesystem code. NFS sometimes has a small
750 * blocksize, but it can handle large reads itself.
751 */
752 } else if ((PAGE_SIZE / bsize) > 1 &&
753 (vp->v_mount->mnt_stat.f_type != nfs_mount_type)) {
754 VM_OBJECT_LOCK(object);
755 for (i = 0; i < count; i++)
756 if (i != reqpage) {
757 vm_page_lock(m[i]);
762 vm_page_lock_queues();
763 vm_page_free(m[i]);
758 vm_page_free(m[i]);
764 vm_page_unlock_queues();
765 vm_page_unlock(m[i]);
766 }
767 VM_OBJECT_UNLOCK(object);
768 PCPU_INC(cnt.v_vnodein);
769 PCPU_INC(cnt.v_vnodepgsin);
770 return vnode_pager_input_smlfs(object, m[reqpage]);
771 }
772
773 /*
774 * If we have a completely valid page available to us, we can
775 * clean up and return. Otherwise we have to re-read the
776 * media.
777 */
778 VM_OBJECT_LOCK(object);
779 if (m[reqpage]->valid == VM_PAGE_BITS_ALL) {
780 for (i = 0; i < count; i++)
781 if (i != reqpage) {
782 vm_page_lock(m[i]);
759 vm_page_unlock(m[i]);
760 }
761 VM_OBJECT_UNLOCK(object);
762 PCPU_INC(cnt.v_vnodein);
763 PCPU_INC(cnt.v_vnodepgsin);
764 return vnode_pager_input_smlfs(object, m[reqpage]);
765 }
766
767 /*
768 * If we have a completely valid page available to us, we can
769 * clean up and return. Otherwise we have to re-read the
770 * media.
771 */
772 VM_OBJECT_LOCK(object);
773 if (m[reqpage]->valid == VM_PAGE_BITS_ALL) {
774 for (i = 0; i < count; i++)
775 if (i != reqpage) {
776 vm_page_lock(m[i]);
783 vm_page_lock_queues();
784 vm_page_free(m[i]);
777 vm_page_free(m[i]);
785 vm_page_unlock_queues();
786 vm_page_unlock(m[i]);
787 }
788 VM_OBJECT_UNLOCK(object);
789 return VM_PAGER_OK;
790 } else if (reqblock == -1) {
791 pmap_zero_page(m[reqpage]);
792 KASSERT(m[reqpage]->dirty == 0,
793 ("vnode_pager_generic_getpages: page %p is dirty", m));
794 m[reqpage]->valid = VM_PAGE_BITS_ALL;
795 for (i = 0; i < count; i++)
796 if (i != reqpage) {
797 vm_page_lock(m[i]);
778 vm_page_unlock(m[i]);
779 }
780 VM_OBJECT_UNLOCK(object);
781 return VM_PAGER_OK;
782 } else if (reqblock == -1) {
783 pmap_zero_page(m[reqpage]);
784 KASSERT(m[reqpage]->dirty == 0,
785 ("vnode_pager_generic_getpages: page %p is dirty", m));
786 m[reqpage]->valid = VM_PAGE_BITS_ALL;
787 for (i = 0; i < count; i++)
788 if (i != reqpage) {
789 vm_page_lock(m[i]);
798 vm_page_lock_queues();
799 vm_page_free(m[i]);
790 vm_page_free(m[i]);
800 vm_page_unlock_queues();
801 vm_page_unlock(m[i]);
802 }
803 VM_OBJECT_UNLOCK(object);
804 return (VM_PAGER_OK);
805 }
806 m[reqpage]->valid = 0;
807 VM_OBJECT_UNLOCK(object);
808

--- 7 unchanged lines hidden (view full) ---

816 */
817 for (first = 0, i = 0; i < count; i = runend) {
818 if (vnode_pager_addr(vp, IDX_TO_OFF(m[i]->pindex), &firstaddr,
819 &runpg) != 0) {
820 VM_OBJECT_LOCK(object);
821 for (; i < count; i++)
822 if (i != reqpage) {
823 vm_page_lock(m[i]);
791 vm_page_unlock(m[i]);
792 }
793 VM_OBJECT_UNLOCK(object);
794 return (VM_PAGER_OK);
795 }
796 m[reqpage]->valid = 0;
797 VM_OBJECT_UNLOCK(object);
798

--- 7 unchanged lines hidden (view full) ---

806 */
807 for (first = 0, i = 0; i < count; i = runend) {
808 if (vnode_pager_addr(vp, IDX_TO_OFF(m[i]->pindex), &firstaddr,
809 &runpg) != 0) {
810 VM_OBJECT_LOCK(object);
811 for (; i < count; i++)
812 if (i != reqpage) {
813 vm_page_lock(m[i]);
824 vm_page_lock_queues();
825 vm_page_free(m[i]);
814 vm_page_free(m[i]);
826 vm_page_unlock_queues();
827 vm_page_unlock(m[i]);
828 }
829 VM_OBJECT_UNLOCK(object);
830 return (VM_PAGER_ERROR);
831 }
832 if (firstaddr == -1) {
833 VM_OBJECT_LOCK(object);
834 if (i == reqpage && foff < object->un_pager.vnp.vnp_size) {
835 panic("vnode_pager_getpages: unexpected missing page: firstaddr: %jd, foff: 0x%jx%08jx, vnp_size: 0x%jx%08jx",
836 (intmax_t)firstaddr, (uintmax_t)(foff >> 32),
837 (uintmax_t)foff,
838 (uintmax_t)
839 (object->un_pager.vnp.vnp_size >> 32),
840 (uintmax_t)object->un_pager.vnp.vnp_size);
841 }
842 vm_page_lock(m[i]);
815 vm_page_unlock(m[i]);
816 }
817 VM_OBJECT_UNLOCK(object);
818 return (VM_PAGER_ERROR);
819 }
820 if (firstaddr == -1) {
821 VM_OBJECT_LOCK(object);
822 if (i == reqpage && foff < object->un_pager.vnp.vnp_size) {
823 panic("vnode_pager_getpages: unexpected missing page: firstaddr: %jd, foff: 0x%jx%08jx, vnp_size: 0x%jx%08jx",
824 (intmax_t)firstaddr, (uintmax_t)(foff >> 32),
825 (uintmax_t)foff,
826 (uintmax_t)
827 (object->un_pager.vnp.vnp_size >> 32),
828 (uintmax_t)object->un_pager.vnp.vnp_size);
829 }
830 vm_page_lock(m[i]);
843 vm_page_lock_queues();
844 vm_page_free(m[i]);
831 vm_page_free(m[i]);
845 vm_page_unlock_queues();
846 vm_page_unlock(m[i]);
847 VM_OBJECT_UNLOCK(object);
848 runend = i + 1;
849 first = runend;
850 continue;
851 }
852 runend = i + runpg;
853 if (runend <= reqpage) {
854 VM_OBJECT_LOCK(object);
855 for (j = i; j < runend; j++) {
856 vm_page_lock(m[j]);
832 vm_page_unlock(m[i]);
833 VM_OBJECT_UNLOCK(object);
834 runend = i + 1;
835 first = runend;
836 continue;
837 }
838 runend = i + runpg;
839 if (runend <= reqpage) {
840 VM_OBJECT_LOCK(object);
841 for (j = i; j < runend; j++) {
842 vm_page_lock(m[j]);
857 vm_page_lock_queues();
858 vm_page_free(m[j]);
843 vm_page_free(m[j]);
859 vm_page_unlock_queues();
860 vm_page_unlock(m[j]);
861 }
862 VM_OBJECT_UNLOCK(object);
863 } else {
864 if (runpg < (count - first)) {
865 VM_OBJECT_LOCK(object);
866 for (i = first + runpg; i < count; i++) {
867 vm_page_lock(m[i]);
844 vm_page_unlock(m[j]);
845 }
846 VM_OBJECT_UNLOCK(object);
847 } else {
848 if (runpg < (count - first)) {
849 VM_OBJECT_LOCK(object);
850 for (i = first + runpg; i < count; i++) {
851 vm_page_lock(m[i]);
868 vm_page_lock_queues();
869 vm_page_free(m[i]);
852 vm_page_free(m[i]);
870 vm_page_unlock_queues();
871 vm_page_unlock(m[i]);
872 }
873 VM_OBJECT_UNLOCK(object);
874 count = first + runpg;
875 }
876 break;
877 }
878 first = runend;

--- 328 unchanged lines hidden ---
853 vm_page_unlock(m[i]);
854 }
855 VM_OBJECT_UNLOCK(object);
856 count = first + runpg;
857 }
858 break;
859 }
860 first = runend;

--- 328 unchanged lines hidden ---