@@ -394,7 +394,7 @@ page_busy(vnode_t *vp, int64_t start, int64_t off, int64_t nbytes)
394
394
nbytes = end - off ;
395
395
396
396
obj = vp -> v_object ;
397
- zfs_vmobject_assert_wlocked (obj );
397
+ zfs_vmobject_assert_wlocked_12 (obj );
398
398
#if __FreeBSD_version < 1300050
399
399
for (;;) {
400
400
if ((pp = vm_page_lookup (obj , OFF_TO_IDX (start ))) != NULL &&
@@ -427,8 +427,9 @@ page_busy(vnode_t *vp, int64_t start, int64_t off, int64_t nbytes)
427
427
break ;
428
428
}
429
429
#else
430
- vm_page_grab_valid (& pp , obj , OFF_TO_IDX (start ), VM_ALLOC_NOCREAT |
431
- VM_ALLOC_SBUSY | VM_ALLOC_NORMAL | VM_ALLOC_IGN_SBUSY );
430
+ vm_page_grab_valid_unlocked (& pp , obj , OFF_TO_IDX (start ),
431
+ VM_ALLOC_NOCREAT | VM_ALLOC_SBUSY | VM_ALLOC_NORMAL |
432
+ VM_ALLOC_IGN_SBUSY );
432
433
if (pp != NULL ) {
433
434
ASSERT3U (pp -> valid , = = , VM_PAGE_BITS_ALL );
434
435
vm_object_pip_add (obj , 1 );
@@ -460,10 +461,9 @@ page_hold(vnode_t *vp, int64_t start)
460
461
vm_page_t m ;
461
462
462
463
obj = vp -> v_object ;
463
- zfs_vmobject_assert_wlocked (obj );
464
-
465
- vm_page_grab_valid (& m , obj , OFF_TO_IDX (start ), VM_ALLOC_NOCREAT |
466
- VM_ALLOC_WIRED | VM_ALLOC_IGN_SBUSY | VM_ALLOC_NOBUSY );
464
+ vm_page_grab_valid_unlocked (& m , obj , OFF_TO_IDX (start ),
465
+ VM_ALLOC_NOCREAT | VM_ALLOC_WIRED | VM_ALLOC_IGN_SBUSY |
466
+ VM_ALLOC_NOBUSY );
467
467
return (m );
468
468
}
469
469
#else
@@ -541,7 +541,7 @@ update_pages(vnode_t *vp, int64_t start, int len, objset_t *os, uint64_t oid,
541
541
ASSERT (obj != NULL );
542
542
543
543
off = start & PAGEOFFSET ;
544
- zfs_vmobject_wlock (obj );
544
+ zfs_vmobject_wlock_12 (obj );
545
545
#if __FreeBSD_version >= 1300041
546
546
vm_object_pip_add (obj , 1 );
547
547
#endif
@@ -550,14 +550,14 @@ update_pages(vnode_t *vp, int64_t start, int len, objset_t *os, uint64_t oid,
550
550
int nbytes = imin (PAGESIZE - off , len );
551
551
552
552
if ((pp = page_busy (vp , start , off , nbytes )) != NULL ) {
553
- zfs_vmobject_wunlock (obj );
553
+ zfs_vmobject_wunlock_12 (obj );
554
554
555
555
va = zfs_map_page (pp , & sf );
556
556
(void ) dmu_read (os , oid , start + off , nbytes ,
557
557
va + off , DMU_READ_PREFETCH );
558
558
zfs_unmap_page (sf );
559
559
560
- zfs_vmobject_wlock (obj );
560
+ zfs_vmobject_wlock_12 (obj );
561
561
page_unbusy (pp );
562
562
}
563
563
len -= nbytes ;
@@ -568,7 +568,7 @@ update_pages(vnode_t *vp, int64_t start, int len, objset_t *os, uint64_t oid,
568
568
#else
569
569
vm_object_pip_wakeupn (obj , 0 );
570
570
#endif
571
- zfs_vmobject_wunlock (obj );
571
+ zfs_vmobject_wunlock_12 (obj );
572
572
}
573
573
574
574
/*
@@ -599,36 +599,37 @@ mappedread_sf(vnode_t *vp, int nbytes, uio_t *uio)
599
599
ASSERT (obj != NULL );
600
600
ASSERT ((uio -> uio_loffset & PAGEOFFSET ) == 0 );
601
601
602
- zfs_vmobject_wlock (obj );
602
+ zfs_vmobject_wlock_12 (obj );
603
603
for (start = uio -> uio_loffset ; len > 0 ; start += PAGESIZE ) {
604
604
int bytes = MIN (PAGESIZE , len );
605
605
606
- pp = vm_page_grab (obj , OFF_TO_IDX (start ), VM_ALLOC_SBUSY |
607
- VM_ALLOC_NORMAL | VM_ALLOC_IGN_SBUSY );
606
+ pp = vm_page_grab_unlocked (obj , OFF_TO_IDX (start ),
607
+ VM_ALLOC_SBUSY | VM_ALLOC_NORMAL | VM_ALLOC_IGN_SBUSY );
608
608
if (vm_page_none_valid (pp )) {
609
- zfs_vmobject_wunlock (obj );
609
+ zfs_vmobject_wunlock_12 (obj );
610
610
va = zfs_map_page (pp , & sf );
611
611
error = dmu_read (os , zp -> z_id , start , bytes , va ,
612
612
DMU_READ_PREFETCH );
613
613
if (bytes != PAGESIZE && error == 0 )
614
614
bzero (va + bytes , PAGESIZE - bytes );
615
615
zfs_unmap_page (sf );
616
- zfs_vmobject_wlock (obj );
617
- vm_page_do_sunbusy (pp );
618
- #if __FreeBSD_version >= 1300047 && __FreeBSD_version < 1300051
619
- #error "unsupported version window"
620
- #elif __FreeBSD_version >= 1300051
616
+ zfs_vmobject_wlock_12 (obj );
617
+ #if __FreeBSD_version >= 1300081
621
618
if (error == 0 ) {
622
619
vm_page_valid (pp );
623
- vm_page_lock (pp );
624
620
vm_page_activate (pp );
625
- vm_page_unlock (pp );
621
+ vm_page_do_sunbusy (pp );
622
+ } else {
623
+ zfs_vmobject_wlock (obj );
624
+ if (!vm_page_wired (pp ) && pp -> valid == 0 &&
625
+ vm_page_busy_tryupgrade (pp ))
626
+ vm_page_free (pp );
627
+ else
628
+ vm_page_sunbusy (pp );
629
+ zfs_vmobject_wunlock (obj );
626
630
}
627
- vm_page_do_sunbusy (pp );
628
- if (error != 0 && !vm_page_wired (pp ) == 0 &&
629
- pp -> valid == 0 && vm_page_tryxbusy (pp ))
630
- vm_page_free (pp );
631
631
#else
632
+ vm_page_do_sunbusy (pp );
632
633
vm_page_lock (pp );
633
634
if (error ) {
634
635
if (pp -> wire_count == 0 && pp -> valid == 0 &&
@@ -650,7 +651,7 @@ mappedread_sf(vnode_t *vp, int nbytes, uio_t *uio)
650
651
uio -> uio_offset += bytes ;
651
652
len -= bytes ;
652
653
}
653
- zfs_vmobject_wunlock (obj );
654
+ zfs_vmobject_wunlock_12 (obj );
654
655
return (error );
655
656
}
656
657
@@ -680,7 +681,7 @@ mappedread(vnode_t *vp, int nbytes, uio_t *uio)
680
681
681
682
start = uio -> uio_loffset ;
682
683
off = start & PAGEOFFSET ;
683
- zfs_vmobject_wlock (obj );
684
+ zfs_vmobject_wlock_12 (obj );
684
685
for (start &= PAGEMASK ; len > 0 ; start += PAGESIZE ) {
685
686
vm_page_t pp ;
686
687
uint64_t bytes = MIN (PAGESIZE - off , len );
@@ -689,24 +690,24 @@ mappedread(vnode_t *vp, int nbytes, uio_t *uio)
689
690
struct sf_buf * sf ;
690
691
caddr_t va ;
691
692
692
- zfs_vmobject_wunlock (obj );
693
+ zfs_vmobject_wunlock_12 (obj );
693
694
va = zfs_map_page (pp , & sf );
694
695
error = vn_io_fault_uiomove (va + off , bytes , uio );
695
696
zfs_unmap_page (sf );
696
- zfs_vmobject_wlock (obj );
697
+ zfs_vmobject_wlock_12 (obj );
697
698
page_unhold (pp );
698
699
} else {
699
- zfs_vmobject_wunlock (obj );
700
+ zfs_vmobject_wunlock_12 (obj );
700
701
error = dmu_read_uio_dbuf (sa_get_db (zp -> z_sa_hdl ),
701
702
uio , bytes );
702
- zfs_vmobject_wlock (obj );
703
+ zfs_vmobject_wlock_12 (obj );
703
704
}
704
705
len -= bytes ;
705
706
off = 0 ;
706
707
if (error )
707
708
break ;
708
709
}
709
- zfs_vmobject_wunlock (obj );
710
+ zfs_vmobject_wunlock_12 (obj );
710
711
return (error );
711
712
}
712
713
0 commit comments