Message ID | 20230125133436.447864-4-hch@lst.de (mailing list archive) |
---|---|
State | Accepted |
Commit | 14bd75f57400dba0e75eaee4dcb44ac52a46253f |
Headers | show |
Series | [1/7] mpage: stop using bdev_{read,write}_page | expand |
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@lst.de> > --- > 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@intel.com>
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);
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@lst.de> --- mm/page_io.c | 68 +++++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 33 deletions(-)