On 3/4/19 3:11 PM, John Hubbard wrote: > On 3/3/19 8:55 AM, Ira Weiny wrote: >> On Sun, Mar 03, 2019 at 11:52:41AM +0200, Artemy Kovalyov wrote: >>> >>> >>> On 02/03/2019 21:44, Ira Weiny wrote: >>>> >>>> On Sat, Mar 02, 2019 at 12:24:35PM -0800, john.hubb...@gmail.com wrote: >>>>> From: John Hubbard <jhubb...@nvidia.com> >>>>> >>>>> ... >>>>> 3. Dead code removal: the check for (user_virt & ~page_mask) >>>>> is checking for a condition that can never happen, >>>>> because earlier: >>>>> >>>>> user_virt = user_virt & page_mask; >>>>> >>>>> ...so, remove that entire phrase. >>>>> >>>>> bcnt -= min_t(size_t, npages << PAGE_SHIFT, bcnt); >>>>> mutex_lock(&umem_odp->umem_mutex); >>>>> for (j = 0; j < npages; j++, user_virt += PAGE_SIZE) { >>>>> - if (user_virt & ~page_mask) { >>>>> - p += PAGE_SIZE; >>>>> - if (page_to_phys(local_page_list[j]) != p) { >>>>> - ret = -EFAULT; >>>>> - break; >>>>> - } >>>>> - put_page(local_page_list[j]); >>>>> - continue; >>>>> - } >>>>> - >>>> >>>> I think this is trying to account for compound pages. (ie page_mask could >>>> represent more than PAGE_SIZE which is what user_virt is being incrimented >>>> by.) >>>> But putting the page in that case seems to be the wrong thing to do? >>>> >>>> Yes this was added by Artemy[1] now cc'ed. >>> >>> Right, this is for huge pages, please keep it. >>> put_page() needed to decrement refcount of the head page. >> >> You mean decrement the refcount of the _non_-head pages? >> >> Ira >> > > Actually, I'm sure Artemy means head page, because put_page() always > operates on the head page. > > And this reminds me that I have a problem to solve nearby: get_user_pages > on huge pages increments the page->_refcount *for each tail page* as well. > That's a minor problem for my put_user_page() > patchset, because my approach so far assumed that I could just change us > over to: > > get_user_page(): increments page->_refcount by a large amount (1024) > > put_user_page(): decrements page->_refcount by a large amount (1024) > > ...and just stop doing the odd (to me) technique of incrementing once for > each tail page. I cannot see any reason why that's actually required, as > opposed to just "raise the page->_refcount enough to avoid losing the head > page too soon". > > However, it may be tricky to do this in one pass. Probably at first, I'll have > to do this horrible thing approach: > > get_user_page(): increments page->_refcount by a large amount (1024) > > put_user_page(): decrements page->_refcount by a large amount (1024) > MULTIPLIED > by the number of tail pages. argghhh that's ugly. >
I see that this is still not stated quite right. ...to clarify, I mean to leave the existing behavior alone. So it would be the call sites (not put_user_page as the above says) that would be doing all that decrementing. The call sites know how many decrements are appropriate. Unless someone thinks of a clever way to clean this up in one shot. I'm not really seeing any way. thanks, -- John Hubbard NVIDIA