On Thu, Apr 11, 2019 at 05:08:19PM -0400, jglisse@xxxxxxxxxx wrote: > From: Jérôme Glisse <jglisse@xxxxxxxxxx> > > This patchset depends on various small fixes [1] and also on patchset > which introduce put_user_page*() [2] and thus is 5.3 material as those > pre-requisite will get in 5.2 at best. Nonetheless i am posting it now > so that it can get review and comments on how and what should be done > to test things. > > For various reasons [2] [3] we want to track page reference through GUP > differently than "regular" page reference. Thus we need to keep track > of how we got a page within the block and fs layer. To do so this patch- > set change the bio_bvec struct to store a pfn and flags instead of a > direct pointer to a page. This way we can flag page that are coming from > GUP. > > This patchset is divided as follow: > - First part of the patchset is just small cleanup i believe they > can go in as his assuming people are ok with them. > - Second part convert bio_vec->bv_page to bio_vec->bv_pfn this is > done in multi-step, first we replace all direct dereference of > the field by call to inline helper, then we introduce macro for > bio_bvec that are initialized on the stack. Finaly we change the > bv_page field to bv_pfn. Why do we need a bv_pfn. Why not just use the lowest bit of the page-ptr as a flag (pointer always aligned to 64 bytes in our case). So yes we need an inline helper for reference of the page but is it not clearer that we assume a page* and not any kind of pfn ? It will not be the first place using low bits of a pointer for flags. That said. Why we need it at all? I mean why not have it as a bio flag. If it exist at all that a user has a GUP and none-GUP pages to IO at the same request he/she can just submit them as two separate BIOs (chained at the block layer). Many users just submit one page bios and let elevator merge them any way. Cheers Boaz > - Third part replace put_page(bv_page(bio_vec)) with a new helper > which will use put_user_page() when the page in the bio_vec is > coming from GUP. > - Fourth part update BIO to use bv_set_user_page() for page that > are coming from GUP this means updating bio_add_page*() to pass > down the origin of the page (GUP or not). > - Fith part convert few more places that directly use bvec_io or > BIO. >