"'Ian Lance Taylor <i...@google.com>' via gofrontend-dev"
<gofrontend-...@googlegroups.com> writes:

> This patch from Anton Blanchard fixes libgo to adjust to the system page
> size when calling madvise.  Bootstrapped and ran Go testsuite on
> x86_64-unknown-linux-gnu.  Committed to mainline and 4.9 branch.

Hi, I think this patch will make my Canonical colleagues very happy (and
me when I get around to building a 64k page arm64 kernel...).  It looks
to me like this is also a problem in the gc runtime library though --
should the patch be sent there too?  (Apologies if it already has and I
missed it, I did look though).

Cheers,
mwh

> Ian
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "gofrontend-dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to gofrontend-dev+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
> diff -r 3a53301d24d7 libgo/runtime/mheap.c
> --- a/libgo/runtime/mheap.c   Tue Apr 22 16:43:35 2014 -0700
> +++ b/libgo/runtime/mheap.c   Thu Apr 24 21:18:35 2014 -0700
> @@ -387,7 +387,7 @@
>  static uintptr
>  scavengelist(MSpan *list, uint64 now, uint64 limit)
>  {
> -     uintptr released, sumreleased;
> +     uintptr released, sumreleased, start, end, pagesize;
>       MSpan *s;
>  
>       if(runtime_MSpanList_IsEmpty(list))
> @@ -400,7 +400,17 @@
>                       mstats.heap_released += released;
>                       sumreleased += released;
>                       s->npreleased = s->npages;
> -                     runtime_SysUnused((void*)(s->start << PageShift), 
> s->npages << PageShift);
> +
> +                     start = s->start << PageShift;
> +                     end = start + (s->npages << PageShift);
> +
> +                     // Round start up and end down to ensure we
> +                     // are acting on entire pages.
> +                     pagesize = getpagesize();
> +                     start = ROUND(start, pagesize);
> +                     end &= ~(pagesize - 1);
> +                     if(end > start)
> +                             runtime_SysUnused((void*)start, end - start);
>               }
>       }
>       return sumreleased;

Reply via email to