| From cd94155c7cc20aa525dec4229a96af874ec6d8d7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 19 Sep 2018 14:42:50 -0700 |
| Subject: nfp: provide a better warning when ring allocation fails |
| |
| From: Jakub Kicinski <jakub.kicinski@netronome.com> |
| |
| [ Upstream commit 23d9f5531c7c28546954b0bf332134a9b8a38c0a ] |
| |
| NFP supports fairly enormous ring sizes (up to 256k descriptors). |
| In commit 466271703867 ("nfp: use kvcalloc() to allocate SW buffer |
| descriptor arrays") we have started using kvcalloc() functions to |
| make sure the allocation of software state arrays doesn't hit |
| the MAX_ORDER limit. Unfortunately, we can't use virtual mappings |
| for the DMA region holding HW descriptors. In case this allocation |
| fails instead of the generic (and fairly scary) warning/splat in |
| the logs print a helpful message explaining what happened and |
| suggesting how to fix it. |
| |
| Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> |
| Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../net/ethernet/netronome/nfp/nfp_net_common.c | 16 ++++++++++++---- |
| 1 file changed, 12 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c |
| index c6d29fdbb880f..d288c7eebacd8 100644 |
| --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c |
| +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c |
| @@ -2187,9 +2187,13 @@ nfp_net_tx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_tx_ring *tx_ring) |
| |
| tx_ring->size = array_size(tx_ring->cnt, sizeof(*tx_ring->txds)); |
| tx_ring->txds = dma_zalloc_coherent(dp->dev, tx_ring->size, |
| - &tx_ring->dma, GFP_KERNEL); |
| - if (!tx_ring->txds) |
| + &tx_ring->dma, |
| + GFP_KERNEL | __GFP_NOWARN); |
| + if (!tx_ring->txds) { |
| + netdev_warn(dp->netdev, "failed to allocate TX descriptor ring memory, requested descriptor count: %d, consider lowering descriptor count\n", |
| + tx_ring->cnt); |
| goto err_alloc; |
| + } |
| |
| tx_ring->txbufs = kvcalloc(tx_ring->cnt, sizeof(*tx_ring->txbufs), |
| GFP_KERNEL); |
| @@ -2341,9 +2345,13 @@ nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring) |
| rx_ring->cnt = dp->rxd_cnt; |
| rx_ring->size = array_size(rx_ring->cnt, sizeof(*rx_ring->rxds)); |
| rx_ring->rxds = dma_zalloc_coherent(dp->dev, rx_ring->size, |
| - &rx_ring->dma, GFP_KERNEL); |
| - if (!rx_ring->rxds) |
| + &rx_ring->dma, |
| + GFP_KERNEL | __GFP_NOWARN); |
| + if (!rx_ring->rxds) { |
| + netdev_warn(dp->netdev, "failed to allocate RX descriptor ring memory, requested descriptor count: %d, consider lowering descriptor count\n", |
| + rx_ring->cnt); |
| goto err_alloc; |
| + } |
| |
| rx_ring->rxbufs = kvcalloc(rx_ring->cnt, sizeof(*rx_ring->rxbufs), |
| GFP_KERNEL); |
| -- |
| 2.20.1 |
| |