On 10/08/2013 12:48 PM, Robert Jennings wrote: > * Dave Hansen (dave@xxxxxxxx) wrote: >> On 10/07/2013 01:21 PM, Robert C Jennings wrote: >>> + } else { >>> + if (vma) >>> + zap_page_range(vma, >>> + user_start, >>> + (user_end - >>> + user_start), >>> + NULL); >>> + vma = find_vma_intersection( >>> + current->mm, >>> + useraddr, >>> + (useraddr + >>> + PAGE_SIZE)); >>> + if (!IS_ERR_OR_NULL(vma)) { >>> + user_start = useraddr; >>> + user_end = (useraddr + >>> + PAGE_SIZE); >>> + } else >>> + vma = NULL; >>> + } >> >> This is pretty unspeakably hideous. Was there truly no better way to do >> this? > > I was hoping to find a better way to coalesce pipe buffers and zap > entire VMAs (and it needs better documentation but your argument is with > structure and I agree). I would love suggestions for improving this but > that is not to say that I've abandoned it; I'm still looking for ways > to make this cleaner. Doing the VMA search each and every time seems a bit silly. Do one find_vma(), the look at the _end_ virtual address of the VMA. You can continue to collect your set of zap_page_range() addresses as long as you do not hit the end of that address range. If and only if you hit the end of the vma, do the zap_page_range(), and then look up the VMA again. Storing the .useraddr still seems odd to me, and you haven't fully explained why you're doing it or how it is safe, or why you store both virtual addresses and file locations in it. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>