On Thu 05-07-18 14:17:19, Christopher Lameter wrote: > On Wed, 4 Jul 2018, Jan Kara wrote: > > > > So this seems unsolvable without having the caller specify that it knows the > > > page type, and that it is therefore safe to decrement page->dma_pinned_count. > > > I was hoping I'd found a way, but clearly I haven't. :) > > > > Well, I think the misconception is that "pinned" is a fundamental property > > of a page. It is not. "pinned" is a property of a page reference (i.e., a > > kind of reference that can be used for DMA access) and page gets into > > "pinned" state if it has any reference of "pinned" type. And when you > > realize this, it is obvious that you just have to have a special api for > > getting and dropping references of this "pinned" type. For getting we > > already have get_user_pages(), for putting we have to create the api... > > Maybe we can do something by creating a special "pinned" bit in the pte? > If it is a RDMA reference then set that pinned bit there. > > Thus any of the references could cause a pin. Since the page struct does > not contain that information we therefore have to scan through the ptes to > figure out if a page is pinned? > > If so then we would not need a special function for dropping the > reference. I don't really see how a PTE bit would help in getting rid of the special function for dropping "pinned" reference. You still need to distinguish preexisting page references (and corresponding page ref drops which must not unpin the page) from the references acquired after transitioning PTE to the pinned state... Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR