On Fri, Jul 11, 2025 at 07:46:32PM +0200, Oleg Nesterov wrote:
> On 07/11, Jiri Olsa wrote:
> >
> > +static unsigned long find_nearest_trampoline(unsigned long vaddr)
> > +{
> > +   struct vm_unmapped_area_info info = {
> > +           .length     = PAGE_SIZE,
> > +           .align_mask = ~PAGE_MASK,
> > +   };
> > +   unsigned long low_limit, high_limit;
> > +   unsigned long low_tramp, high_tramp;
> > +   unsigned long call_end = vaddr + 5;
> > +
> > +   if (check_add_overflow(call_end, INT_MIN, &low_limit))
> > +           low_limit = PAGE_SIZE;
> > +
> > +   high_limit = call_end + INT_MAX;
> > +
> > +   /* Search up from the caller address. */
> > +   info.low_limit = call_end;
> > +   info.high_limit = min(high_limit, TASK_SIZE);
> > +   high_tramp = vm_unmapped_area(&info);
> > +
> > +   /* Search down from the caller address. */
> > +   info.low_limit = max(low_limit, PAGE_SIZE);
> > +   info.high_limit = call_end;
> > +   info.flags = VM_UNMAPPED_AREA_TOPDOWN;
> > +   low_tramp = vm_unmapped_area(&info);
> > +
> > +   if (IS_ERR_VALUE(high_tramp) && IS_ERR_VALUE(low_tramp))
> > +           return -ENOMEM;
> > +   if (IS_ERR_VALUE(high_tramp))
> > +           return low_tramp;
> > +   if (IS_ERR_VALUE(low_tramp))
> > +           return high_tramp;
> > +
> > +   /* Return address that's closest to the caller address. */
> > +   if (call_end - low_tramp < high_tramp - call_end)
> > +           return low_tramp;
> > +   return high_tramp;
> > +}
> 
> IIUC, nothing else has changed since I've acked the previous version?
> Then my ack still stands,

correct, just the find_nearest_trampoline function

> 
> Acked-by: Oleg Nesterov <o...@redhat.com>
> 

thanks,
jirka

Reply via email to