From: Baoquan He <baoquan.he@linux.dev>
To: Barry Song <baohua@kernel.org>
Cc: linux-mm@kvack.org, akpm@linux-foundation.org, chrisl@kernel.org,
usama.arif@linux.dev, kasong@tencent.com, nphamcs@gmail.com,
shikemeng@huaweicloud.com, youngjun.park@lge.com,
hch@infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v7 3/3] mm/swap: add unplug callback to swap_ops to fix leaky abstraction
Date: Fri, 15 May 2026 13:43:18 +0800 [thread overview]
Message-ID: <agaydgMX_-db-OQL@MiWiFi-R3L-srv> (raw)
In-Reply-To: <CAGsJ_4wNtLaq1e=8YUTMtro+4oxSrue1OdpuyzyiNWt=RZC+dA@mail.gmail.com>
On 05/15/26 at 12:39pm, Barry Song wrote:
> On Fri, May 15, 2026 at 9:58 AM Baoquan He <baoquan.he@linux.dev> wrote:
> >
> > When swap_ops was introduced, the FS-swap batch submission remained
> > as a standalone swap_write_unplug() that directly called
> > mapping->a_ops->swap_rw(). This meant callers still had implicit
> > knowledge of filesystem internals rather than going through the
> > swap_ops abstraction.
> >
> > Fix this by adding an unplug callback to struct swap_ops.
> > Each ops table provides its own implementation:
> > - bdev_fs_swap_ops uses the existing FS batch-submission logic
> > - bdev_sync/bdev_async_swap_ops leave it NULL since block-layer
> > plugging handles their I/O
> >
> > The swap_iocb now carries a pointer to its ops table so that
> > swap_write_unplug() can dispatch through the callback without
> > the caller needing to know the swap device type.
> >
> > Signed-off-by: Baoquan He <baoquan.he@linux.dev>
> > ---
> > mm/page_io.c | 11 ++++++++++-
> > mm/swap.h | 1 +
> > 2 files changed, 11 insertions(+), 1 deletion(-)
> >
> > diff --git a/mm/page_io.c b/mm/page_io.c
> > index 38b94c560c37..2c36d261ad98 100644
> > --- a/mm/page_io.c
> > +++ b/mm/page_io.c
> > @@ -329,6 +329,7 @@ static void bio_associate_blkg_from_page(struct bio *bio, struct folio *folio)
> >
> > struct swap_iocb {
> > struct kiocb iocb;
> > + const struct swap_ops *ops;
> > struct bio_vec bvec[SWAP_CLUSTER_MAX];
> > int pages;
> > int len;
> > @@ -401,6 +402,7 @@ static void swap_fs_write_folio(struct swap_info_struct *sis,
> > init_sync_kiocb(&sio->iocb, swap_file);
> > sio->iocb.ki_complete = sio_write_complete;
> > sio->iocb.ki_pos = pos;
> > + sio->ops = sis->ops;
> > sio->pages = 0;
> > sio->len = 0;
> > }
> > @@ -454,7 +456,7 @@ static void swap_bdev_async_write_folio(struct swap_info_struct *sis,
> > submit_bio(bio);
> > }
> >
> > -void swap_write_unplug(struct swap_iocb *sio)
> > +static void swap_fs_write_folio_unplug(struct swap_iocb *sio)
> > {
> > struct iov_iter from;
> > struct address_space *mapping = sio->iocb.ki_filp->f_mapping;
> > @@ -466,6 +468,12 @@ void swap_write_unplug(struct swap_iocb *sio)
> > sio_write_complete(&sio->iocb, ret);
> > }
> >
> > +void swap_write_unplug(struct swap_iocb *sio)
> > +{
> > + if (sio->ops && sio->ops->unplug)
> > + sio->ops->unplug(sio);
> > +}
> > +
>
> Hi Baoquan,
>
> we have already "sis->ops" check in init_swap_ops, do we need !sis->ops
> again?
That's a good point, and no, I dont' think we need it. I will fix it in
v8. Thanks.
>
> +int init_swap_ops(struct swap_info_struct *sis)
> +{
> + ...
> +
> + if (!sis->ops || !sis->ops->read_folio || !sis->ops->write_folio)
> + return -EINVAL;
> +
> + return 0;
> +}
next prev parent reply other threads:[~2026-05-15 5:43 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-15 1:57 [PATCH v7 0/3] [PATCH v7 0/3] mm/swap: use swap_ops to register swap device's methods Baoquan He
2026-05-15 1:57 ` [PATCH v7 1/3] " Baoquan He
2026-05-15 1:57 ` [PATCH v7 2/3] mm/page_io.c: rename page_io functions to consistent naming Baoquan He
2026-05-15 1:57 ` [PATCH v7 3/3] mm/swap: add unplug callback to swap_ops to fix leaky abstraction Baoquan He
2026-05-15 4:39 ` Barry Song
2026-05-15 5:43 ` Baoquan He [this message]
2026-05-15 5:51 ` Baoquan He
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=agaydgMX_-db-OQL@MiWiFi-R3L-srv \
--to=baoquan.he@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=chrisl@kernel.org \
--cc=hch@infradead.org \
--cc=kasong@tencent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nphamcs@gmail.com \
--cc=shikemeng@huaweicloud.com \
--cc=usama.arif@linux.dev \
--cc=youngjun.park@lge.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.