On Mon, Oct 17, 2022 at 01:06:25PM -0700, Dan Williams wrote: > Alistair Popple wrote: > > > > Dan Williams <dan.j.williams@xxxxxxxxx> writes: > > > > [...] > > > > > +/** > > > + * pgmap_request_folios - activate an contiguous span of folios in @pgmap > > > + * @pgmap: host page map for the folio array > > > + * @folio: start of the folio list, all subsequent folios have same folio_size() > > > + * > > > + * Caller is responsible for @pgmap remaining live for the duration of > > > + * this call. Caller is also responsible for not racing requests for the > > > + * same folios. > > > + */ > > > +bool pgmap_request_folios(struct dev_pagemap *pgmap, struct folio *folio, > > > + int nr_folios) > > > > All callers of pgmap_request_folios() I could see call this with > > nr_folios == 1 and pgmap == folio_pgmap(folio). Could we remove the > > redundant arguments and simplify it to > > pgmap_request_folios(struct folio *folio)? > > The rationale for the @pgmap argument being separate is to make clear > that the caller must assert that pgmap is alive before passing it to > pgmap_request_folios(), and that @pgmap is constant for the span of > folios requested. The api is kind of weird to take in a folio - it should take in the offset in bytes from the start of the pgmap and "create" usable non-free folios. A good design is that nothing has a struct folio * unless it can also prove it has a non-zero refcount on it, and that is simply impossible for any caller at this point. Jason