Huang Shijie d8f0a87f20 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:10:16 +01:00
..
2018-08-22 10:52:48 -07:00
2017-12-01 13:09:40 -08:00
2017-12-01 13:09:40 -08:00
2018-10-12 09:17:46 +02:00
2018-08-16 12:14:42 -07:00
2017-12-01 13:09:40 -08:00
2018-02-06 18:32:44 -08:00
2018-08-22 10:52:48 -07:00
2019-04-20 09:16:05 +02:00
2017-10-07 10:45:14 -06:00
2017-02-24 17:46:57 -08:00
2019-05-22 07:37:45 +02:00
2018-08-18 11:44:53 -07:00
2018-04-12 09:41:19 -07:00
2018-06-12 16:19:22 -07:00
2017-12-01 13:09:40 -08:00
2017-12-01 13:09:40 -08:00
2016-12-06 10:17:03 +02:00
2018-07-17 09:27:43 +02:00
2020-11-05 11:08:45 +01:00
2020-10-01 13:14:25 +02:00
2018-06-27 18:58:49 +03:00
2018-10-15 16:31:29 -04:00
2018-04-23 16:39:35 +01:00
2017-08-15 09:02:07 -07:00