Print this page
XXXX give me a better summary


 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 {