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