Christoph Hellwig wrote: > Split the block device case from swap_readpage into a separate helper, > following the abstraction for file based swap and frontswap. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- > mm/page_io.c | 68 +++++++++++++++++++++++++++------------------------- > 1 file changed, 35 insertions(+), 33 deletions(-) > > diff --git a/mm/page_io.c b/mm/page_io.c > index 6f7166fdc4b2bb..ce0b3638094f85 100644 > --- a/mm/page_io.c > +++ b/mm/page_io.c > @@ -445,44 +445,15 @@ static void swap_readpage_fs(struct page *page, > *plug = sio; > } > > -void swap_readpage(struct page *page, bool synchronous, struct swap_iocb **plug) > +static void swap_readpage_bdev(struct page *page, bool synchronous, > + struct swap_info_struct *sis) > { > struct bio *bio; > - struct swap_info_struct *sis = page_swap_info(page); > - bool workingset = PageWorkingset(page); > - unsigned long pflags; > - bool in_thrashing; > - > - VM_BUG_ON_PAGE(!PageSwapCache(page) && !synchronous, page); > - VM_BUG_ON_PAGE(!PageLocked(page), page); > - VM_BUG_ON_PAGE(PageUptodate(page), page); > - > - /* > - * Count submission time as memory stall and delay. When the device > - * is congested, or the submitting cgroup IO-throttled, submission > - * can be a significant part of overall IO time. > - */ > - if (workingset) { > - delayacct_thrashing_start(&in_thrashing); > - psi_memstall_enter(&pflags); > - } > - delayacct_swapin_start(); > - > - if (frontswap_load(page) == 0) { > - SetPageUptodate(page); > - unlock_page(page); > - goto out; > - } > - > - if (data_race(sis->flags & SWP_FS_OPS)) { > - swap_readpage_fs(page, plug); > - goto out; > - } > > if ((sis->flags & SWP_SYNCHRONOUS_IO) && > !bdev_read_page(sis->bdev, swap_page_sector(page), page)) { > count_vm_event(PSWPIN); > - goto out; > + return; > } > > bio = bio_alloc(sis->bdev, 1, REQ_OP_READ, GFP_KERNEL); > @@ -509,8 +480,39 @@ void swap_readpage(struct page *page, bool synchronous, struct swap_iocb **plug) > } > __set_current_state(TASK_RUNNING); > bio_put(bio); > +} > + > +void swap_readpage(struct page *page, bool synchronous, struct swap_iocb **plug) > +{ > + struct swap_info_struct *sis = page_swap_info(page); > + bool workingset = PageWorkingset(page); > + unsigned long pflags; > + bool in_thrashing; > + > + VM_BUG_ON_PAGE(!PageSwapCache(page) && !synchronous, page); > + VM_BUG_ON_PAGE(!PageLocked(page), page); > + VM_BUG_ON_PAGE(PageUptodate(page), page); > + > + /* > + * Count submission time as memory stall and delay. When the device > + * is congested, or the submitting cgroup IO-throttled, submission > + * can be a significant part of overall IO time. > + */ > + if (workingset) { > + delayacct_thrashing_start(&in_thrashing); > + psi_memstall_enter(&pflags); > + } > + delayacct_swapin_start(); > + > + if (frontswap_load(page) == 0) { > + SetPageUptodate(page); > + unlock_page(page); > + } else if (data_race(sis->flags & SWP_FS_OPS)) { > + swap_readpage_fs(page, plug); > + } else { > + swap_readpage_bdev(page, synchronous, sis); > + } > > -out: > if (workingset) { > delayacct_thrashing_end(&in_thrashing); > psi_memstall_leave(&pflags); Looks good, passes tests, Reviewed-by: Dan Williams <dan.j.williams@xxxxxxxxx>