Huang Shijie 8532d3ec57 lib/genalloc: fix the overflow when size is too big
[ Upstream commit 36845663843fc59c5d794e3dc0641472e3e572da ]

Some graphic card has very big memory on chip, such as 32G bytes.

In the following case, it will cause overflow:

    pool = gen_pool_create(PAGE_SHIFT, NUMA_NO_NODE);
    ret = gen_pool_add(pool, 0x1000000, SZ_32G, NUMA_NO_NODE);

    va = gen_pool_alloc(pool, SZ_4G);

The overflow occurs in gen_pool_alloc_algo_owner():

		....
		size = nbits << order;
		....

The @nbits is "int" type, so it will overflow.
Then the gen_pool_avail() will return the wrong value.

This patch converts some "int" to "unsigned long", and
changes the compare code in while.

Link: https://lkml.kernel.org/r/20201229060657.3389-1-sjhuang@iluvatar.ai
Signed-off-by: Huang Shijie <sjhuang@iluvatar.ai>
Reported-by: Shi Jiasheng <jiasheng.shi@iluvatar.ai>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2021-01-12 20:18:16 +01:00
..
2020-10-18 14:45:59 -07:00
2020-08-09 14:10:26 -07:00
2020-08-14 19:56:56 -07:00
2020-05-24 20:48:11 +02:00
2020-10-16 11:11:19 -07:00
2018-08-16 12:14:42 -07:00
2020-06-01 08:23:42 -04:00
2020-10-20 14:39:37 -07:00
2020-10-13 18:38:32 -07:00
2020-05-07 14:54:26 +08:00
2020-12-11 14:02:14 -08:00
2018-10-16 13:45:44 +02:00
2020-10-20 14:39:37 -07:00
2020-06-15 18:22:43 -07:00
2019-07-11 15:17:41 -07:00
2020-09-26 10:33:57 -07:00
2020-06-29 10:02:23 +02:00
2018-10-15 16:31:29 -04:00
2020-06-07 10:53:36 -07:00
2020-10-20 14:39:37 -07:00
2020-06-04 19:06:28 -07:00
2020-10-20 14:39:37 -07:00