On Thu, Jul 25, 2019 at 04:39:59PM -0700, Andrew Morton wrote: > On Thu, 25 Jul 2019 15:02:59 -0700 Randy Dunlap <rdunlap@xxxxxxxxxxxxx> wrote: > > > On 7/24/19 9:40 PM, akpm@xxxxxxxxxxxxxxxxxxxx wrote: > > > The mm-of-the-moment snapshot 2019-07-24-21-39 has been uploaded to > > > > > > http://www.ozlabs.org/~akpm/mmotm/ > > > > > > mmotm-readme.txt says > > > > > > README for mm-of-the-moment: > > > > > > http://www.ozlabs.org/~akpm/mmotm/ > > > > > > This is a snapshot of my -mm patch queue. Uploaded at random hopefully > > > more than once a week. > > > > > > You will need quilt to apply these patches to the latest Linus release (5.x > > > or 5.x-rcY). The series file is in broken-out.tar.gz and is duplicated in > > > http://ozlabs.org/~akpm/mmotm/series > > > > > > > on i386: > > > > ld: mm/memcontrol.o: in function `mem_cgroup_handle_over_high': > > memcontrol.c:(.text+0x6235): undefined reference to `__udivdi3' > > Thanks. This? > > --- a/mm/memcontrol.c~mm-throttle-allocators-when-failing-reclaim-over-memoryhigh-fix-fix > +++ a/mm/memcontrol.c > @@ -2414,8 +2414,9 @@ void mem_cgroup_handle_over_high(void) > */ > clamped_high = max(high, 1UL); > > - overage = ((u64)(usage - high) << MEMCG_DELAY_PRECISION_SHIFT) > - / clamped_high; > + overage = (u64)(usage - high) << MEMCG_DELAY_PRECISION_SHIFT; > + do_div(overage, clamped_high); > + > penalty_jiffies = ((u64)overage * overage * HZ) > >> (MEMCG_DELAY_PRECISION_SHIFT + MEMCG_DELAY_SCALING_SHIFT); > > _ > This causes a build error on arm: In file included from ../arch/arm/include/asm/div64.h:127, from ../include/linux/kernel.h:18, from ../include/linux/page_counter.h:6, from ../mm/memcontrol.c:25: ../mm/memcontrol.c: In function 'mem_cgroup_handle_over_high': ../include/asm-generic/div64.h:222:28: warning: comparison of distinct pointer types lacks a cast 222 | (void)(((typeof((n)) *)0) == ((uint64_t *)0)); \ | ^~ ../mm/memcontrol.c:2423:2: note: in expansion of macro 'do_div' 2423 | do_div(overage, clamped_high); | ^~~~~~ In file included from ../arch/arm/include/asm/atomic.h:11, from ../include/linux/atomic.h:7, from ../include/linux/page_counter.h:5, from ../mm/memcontrol.c:25: ../include/asm-generic/div64.h:235:25: warning: right shift count >= width of type [-Wshift-count-overflow] 235 | } else if (likely(((n) >> 32) == 0)) { \ | ^~ ../include/linux/compiler.h:77:40: note: in definition of macro 'likely' 77 | # define likely(x) __builtin_expect(!!(x), 1) | ^ ../mm/memcontrol.c:2423:2: note: in expansion of macro 'do_div' 2423 | do_div(overage, clamped_high); | ^~~~~~ In file included from ../arch/arm/include/asm/div64.h:127, from ../include/linux/kernel.h:18, from ../include/linux/page_counter.h:6, from ../mm/memcontrol.c:25: ../include/asm-generic/div64.h:239:22: error: passing argument 1 of '__div64_32' from incompatible pointer type [-Werror=incompatible-pointer-types] 239 | __rem = __div64_32(&(n), __base); \ | ^~~~ | | | long unsigned int * ../mm/memcontrol.c:2423:2: note: in expansion of macro 'do_div' 2423 | do_div(overage, clamped_high); | ^~~~~~ In file included from ../include/linux/kernel.h:18, from ../include/linux/page_counter.h:6, from ../mm/memcontrol.c:25: ../arch/arm/include/asm/div64.h:33:45: note: expected 'uint64_t *' {aka 'long long unsigned int *'} but argument is of type 'long unsigned int *' 33 | static inline uint32_t __div64_32(uint64_t *n, uint32_t base) | ~~~~~~~~~~^ cc1: some warnings being treated as errors make[3]: *** [../scripts/Makefile.build:274: mm/memcontrol.o] Error 1 make[2]: *** [../Makefile:1768: mm/memcontrol.o] Error 2 make[1]: *** [/home/nathan/cbl/linux-next/Makefile:330: __build_one_by_one] Error 2 make: *** [Makefile:179: sub-make] Error 2 I fixed it up like so but no idea if that is the ideal function to use. diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 5c7b9facb0eb..04b621f1cb6b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2419,8 +2419,8 @@ void mem_cgroup_handle_over_high(void) */ clamped_high = max(high, 1UL); - overage = (u64)(usage - high) << MEMCG_DELAY_PRECISION_SHIFT; - do_div(overage, clamped_high); + overage = div64_u64((u64)(usage - high) << MEMCG_DELAY_PRECISION_SHIFT, + clamped_high); penalty_jiffies = ((u64)overage * overage * HZ) >> (MEMCG_DELAY_PRECISION_SHIFT + MEMCG_DELAY_SCALING_SHIFT);