| From 1d56f03a483b939714d6b6a0ed55d425722be2ed Mon Sep 17 00:00:00 2001 |
| From: Varun Prakash <varun@chelsio.com> |
| Date: Wed, 3 Apr 2019 17:30:14 +0530 |
| Subject: libcxgb: fix incorrect ppmax calculation |
| |
| [ Upstream commit cc5a726c79158bd307150e8d4176ec79b52001ea ] |
| |
| BITS_TO_LONGS() uses DIV_ROUND_UP() because of |
| this ppmax value can be greater than available |
| per cpu page pods. |
| |
| This patch removes BITS_TO_LONGS() to fix this |
| issue. |
| |
| Signed-off-by: Varun Prakash <varun@chelsio.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin (Microsoft) <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c b/drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c |
| index 74849be5f004..e2919005ead3 100644 |
| --- a/drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c |
| +++ b/drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c |
| @@ -354,7 +354,10 @@ static struct cxgbi_ppm_pool *ppm_alloc_cpu_pool(unsigned int *total, |
| ppmax = max; |
| |
| /* pool size must be multiple of unsigned long */ |
| - bmap = BITS_TO_LONGS(ppmax); |
| + bmap = ppmax / BITS_PER_TYPE(unsigned long); |
| + if (!bmap) |
| + return NULL; |
| + |
| ppmax = (bmap * sizeof(unsigned long)) << 3; |
| |
| alloc_sz = sizeof(*pools) + sizeof(unsigned long) * bmap; |
| @@ -402,6 +405,10 @@ int cxgbi_ppm_init(void **ppm_pp, struct net_device *ndev, |
| if (reserve_factor) { |
| ppmax_pool = ppmax / reserve_factor; |
| pool = ppm_alloc_cpu_pool(&ppmax_pool, &pool_index_max); |
| + if (!pool) { |
| + ppmax_pool = 0; |
| + reserve_factor = 0; |
| + } |
| |
| pr_debug("%s: ppmax %u, cpu total %u, per cpu %u.\n", |
| ndev->name, ppmax, ppmax_pool, pool_index_max); |
| -- |
| 2.20.1 |
| |