* [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors
@ 2018-07-26 2:40 Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 1/4] nfp: don't fail probe on pci_sriov_set_totalvfs() errors Jakub Kicinski
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Jakub Kicinski @ 2018-07-26 2:40 UTC (permalink / raw)
To: davem; +Cc: oss-drivers, netdev, Jakub Kicinski
Hi!
This small set changes the handling of pci_sriov_set_totalvfs() errors.
nfp is the only driver which fails probe on pci_sriov_set_totalvfs()
errors. It turns out some BIOS configurations may break SR-IOV and
users who don't use that feature should not suffer.
Remaining patches makes sure we use overflow-safe function for ring
allocation, even though ring sizes are limited. It won't hurt and
we can also enable fallback to vmalloc() if memory is tight while
at it.
Jakub Kicinski (4):
nfp: don't fail probe on pci_sriov_set_totalvfs() errors
nfp: use kvcalloc() to allocate SW buffer descriptor arrays
nfp: restore correct ordering of fields in rx ring structure
nfp: protect from theoretical size overflows on HW descriptor ring
drivers/net/ethernet/netronome/nfp/nfp_main.c | 20 +++++++++------
drivers/net/ethernet/netronome/nfp/nfp_net.h | 9 ++++---
.../ethernet/netronome/nfp/nfp_net_common.c | 25 ++++++++++---------
3 files changed, 30 insertions(+), 24 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next 1/4] nfp: don't fail probe on pci_sriov_set_totalvfs() errors
2018-07-26 2:40 [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors Jakub Kicinski
@ 2018-07-26 2:40 ` Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 2/4] nfp: use kvcalloc() to allocate SW buffer descriptor arrays Jakub Kicinski
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Jakub Kicinski @ 2018-07-26 2:40 UTC (permalink / raw)
To: davem; +Cc: oss-drivers, netdev, Jakub Kicinski
On machines with buggy ACPI tables or when SR-IOV is already enabled
we may not be able to set the SR-IOV VF limit in sysfs, it's not fatal
because the limit is imposed by the driver anyway. Only the sysfs
'sriov_totalvfs' attribute will be too high. Print an error to inform
user about the failure but allow probe to continue.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
---
drivers/net/ethernet/netronome/nfp/nfp_main.c | 20 +++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
index 152283d7e59c..4a540c5e27fe 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
@@ -236,16 +236,20 @@ static int nfp_pcie_sriov_read_nfd_limit(struct nfp_pf *pf)
int err;
pf->limit_vfs = nfp_rtsym_read_le(pf->rtbl, "nfd_vf_cfg_max_vfs", &err);
- if (!err)
- return pci_sriov_set_totalvfs(pf->pdev, pf->limit_vfs);
+ if (err) {
+ /* For backwards compatibility if symbol not found allow all */
+ pf->limit_vfs = ~0;
+ if (err == -ENOENT)
+ return 0;
- pf->limit_vfs = ~0;
- /* Allow any setting for backwards compatibility if symbol not found */
- if (err == -ENOENT)
- return 0;
+ nfp_warn(pf->cpp, "Warning: VF limit read failed: %d\n", err);
+ return err;
+ }
- nfp_warn(pf->cpp, "Warning: VF limit read failed: %d\n", err);
- return err;
+ err = pci_sriov_set_totalvfs(pf->pdev, pf->limit_vfs);
+ if (err)
+ nfp_warn(pf->cpp, "Failed to set VF count in sysfs: %d\n", err);
+ return 0;
}
static int nfp_pcie_sriov_enable(struct pci_dev *pdev, int num_vfs)
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 2/4] nfp: use kvcalloc() to allocate SW buffer descriptor arrays
2018-07-26 2:40 [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 1/4] nfp: don't fail probe on pci_sriov_set_totalvfs() errors Jakub Kicinski
@ 2018-07-26 2:40 ` Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 3/4] nfp: restore correct ordering of fields in rx ring structure Jakub Kicinski
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Jakub Kicinski @ 2018-07-26 2:40 UTC (permalink / raw)
To: davem; +Cc: oss-drivers, netdev, Jakub Kicinski
Use kvcalloc() instead of tmp variable + kzalloc() when allocating
SW buffer information to allow falling back to vmalloc and to protect
from theoretical integer overflow.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
---
.../net/ethernet/netronome/nfp/nfp_net_common.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index cf1704e972b7..d02baefcb350 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -53,6 +53,7 @@
#include <linux/interrupt.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
+#include <linux/mm.h>
#include <linux/page_ref.h>
#include <linux/pci.h>
#include <linux/pci_regs.h>
@@ -2126,7 +2127,7 @@ static void nfp_net_tx_ring_free(struct nfp_net_tx_ring *tx_ring)
struct nfp_net_r_vector *r_vec = tx_ring->r_vec;
struct nfp_net_dp *dp = &r_vec->nfp_net->dp;
- kfree(tx_ring->txbufs);
+ kvfree(tx_ring->txbufs);
if (tx_ring->txds)
dma_free_coherent(dp->dev, tx_ring->size,
@@ -2150,7 +2151,6 @@ static int
nfp_net_tx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_tx_ring *tx_ring)
{
struct nfp_net_r_vector *r_vec = tx_ring->r_vec;
- int sz;
tx_ring->cnt = dp->txd_cnt;
@@ -2160,8 +2160,8 @@ nfp_net_tx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_tx_ring *tx_ring)
if (!tx_ring->txds)
goto err_alloc;
- sz = sizeof(*tx_ring->txbufs) * tx_ring->cnt;
- tx_ring->txbufs = kzalloc(sz, GFP_KERNEL);
+ tx_ring->txbufs = kvcalloc(tx_ring->cnt, sizeof(*tx_ring->txbufs),
+ GFP_KERNEL);
if (!tx_ring->txbufs)
goto err_alloc;
@@ -2275,7 +2275,7 @@ static void nfp_net_rx_ring_free(struct nfp_net_rx_ring *rx_ring)
if (dp->netdev)
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
- kfree(rx_ring->rxbufs);
+ kvfree(rx_ring->rxbufs);
if (rx_ring->rxds)
dma_free_coherent(dp->dev, rx_ring->size,
@@ -2298,7 +2298,7 @@ static void nfp_net_rx_ring_free(struct nfp_net_rx_ring *rx_ring)
static int
nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring)
{
- int sz, err;
+ int err;
if (dp->netdev) {
err = xdp_rxq_info_reg(&rx_ring->xdp_rxq, dp->netdev,
@@ -2314,8 +2314,8 @@ nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring)
if (!rx_ring->rxds)
goto err_alloc;
- sz = sizeof(*rx_ring->rxbufs) * rx_ring->cnt;
- rx_ring->rxbufs = kzalloc(sz, GFP_KERNEL);
+ rx_ring->rxbufs = kvcalloc(rx_ring->cnt, sizeof(*rx_ring->rxbufs),
+ GFP_KERNEL);
if (!rx_ring->rxbufs)
goto err_alloc;
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 3/4] nfp: restore correct ordering of fields in rx ring structure
2018-07-26 2:40 [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 1/4] nfp: don't fail probe on pci_sriov_set_totalvfs() errors Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 2/4] nfp: use kvcalloc() to allocate SW buffer descriptor arrays Jakub Kicinski
@ 2018-07-26 2:40 ` Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 4/4] nfp: protect from theoretical size overflows on HW descriptor ring Jakub Kicinski
2018-07-26 5:18 ` [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors David Miller
4 siblings, 0 replies; 6+ messages in thread
From: Jakub Kicinski @ 2018-07-26 2:40 UTC (permalink / raw)
To: davem; +Cc: oss-drivers, netdev, Jakub Kicinski
Commit 7f1c684a8966 ("nfp: setup xdp_rxq_info") mixed the cache
cold and cache hot data in the nfp_net_rx_ring structure (ignoring
the feedback), to try to fit the structure into 2 cache lines
after struct xdp_rxq_info was added. Now that we are about to add
a new field the structure will grow back to 3 cache lines, so
order the members correctly.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
---
drivers/net/ethernet/netronome/nfp/nfp_net.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net.h b/drivers/net/ethernet/netronome/nfp/nfp_net.h
index 8970ec981e11..607896910fb0 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net.h
@@ -350,9 +350,9 @@ struct nfp_net_rx_buf {
* @qcp_fl: Pointer to base of the QCP freelist queue
* @rxbufs: Array of transmitted FL/RX buffers
* @rxds: Virtual address of FL/RX ring in host memory
+ * @xdp_rxq: RX-ring info avail for XDP
* @dma: DMA address of the FL/RX ring
* @size: Size, in bytes, of the FL/RX ring (needed to free)
- * @xdp_rxq: RX-ring info avail for XDP
*/
struct nfp_net_rx_ring {
struct nfp_net_r_vector *r_vec;
@@ -364,14 +364,15 @@ struct nfp_net_rx_ring {
u32 idx;
int fl_qcidx;
- unsigned int size;
u8 __iomem *qcp_fl;
struct nfp_net_rx_buf *rxbufs;
struct nfp_net_rx_desc *rxds;
- dma_addr_t dma;
struct xdp_rxq_info xdp_rxq;
+
+ dma_addr_t dma;
+ unsigned int size;
} ____cacheline_aligned;
/**
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 4/4] nfp: protect from theoretical size overflows on HW descriptor ring
2018-07-26 2:40 [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors Jakub Kicinski
` (2 preceding siblings ...)
2018-07-26 2:40 ` [PATCH net-next 3/4] nfp: restore correct ordering of fields in rx ring structure Jakub Kicinski
@ 2018-07-26 2:40 ` Jakub Kicinski
2018-07-26 5:18 ` [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors David Miller
4 siblings, 0 replies; 6+ messages in thread
From: Jakub Kicinski @ 2018-07-26 2:40 UTC (permalink / raw)
To: davem; +Cc: oss-drivers, netdev, Jakub Kicinski
Use array_size() and store the size as full size_t to protect from
theoretical size overflow when handling HW descriptor rings.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
---
drivers/net/ethernet/netronome/nfp/nfp_net.h | 4 ++--
drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 9 +++++----
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net.h b/drivers/net/ethernet/netronome/nfp/nfp_net.h
index 607896910fb0..439e6ffe2f05 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net.h
@@ -250,7 +250,7 @@ struct nfp_net_tx_ring {
struct nfp_net_tx_desc *txds;
dma_addr_t dma;
- unsigned int size;
+ size_t size;
bool is_xdp;
} ____cacheline_aligned;
@@ -372,7 +372,7 @@ struct nfp_net_rx_ring {
struct xdp_rxq_info xdp_rxq;
dma_addr_t dma;
- unsigned int size;
+ size_t size;
} ____cacheline_aligned;
/**
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index d02baefcb350..7c1a921d178d 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -54,6 +54,7 @@
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/mm.h>
+#include <linux/overflow.h>
#include <linux/page_ref.h>
#include <linux/pci.h>
#include <linux/pci_regs.h>
@@ -1121,7 +1122,7 @@ nfp_net_tx_ring_reset(struct nfp_net_dp *dp, struct nfp_net_tx_ring *tx_ring)
tx_ring->rd_p++;
}
- memset(tx_ring->txds, 0, sizeof(*tx_ring->txds) * tx_ring->cnt);
+ memset(tx_ring->txds, 0, tx_ring->size);
tx_ring->wr_p = 0;
tx_ring->rd_p = 0;
tx_ring->qcp_rd_p = 0;
@@ -1301,7 +1302,7 @@ static void nfp_net_rx_ring_reset(struct nfp_net_rx_ring *rx_ring)
rx_ring->rxbufs[last_idx].dma_addr = 0;
rx_ring->rxbufs[last_idx].frag = NULL;
- memset(rx_ring->rxds, 0, sizeof(*rx_ring->rxds) * rx_ring->cnt);
+ memset(rx_ring->rxds, 0, rx_ring->size);
rx_ring->wr_p = 0;
rx_ring->rd_p = 0;
}
@@ -2154,7 +2155,7 @@ nfp_net_tx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_tx_ring *tx_ring)
tx_ring->cnt = dp->txd_cnt;
- tx_ring->size = sizeof(*tx_ring->txds) * tx_ring->cnt;
+ 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)
@@ -2308,7 +2309,7 @@ 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 = sizeof(*rx_ring->rxds) * rx_ring->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)
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors
2018-07-26 2:40 [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors Jakub Kicinski
` (3 preceding siblings ...)
2018-07-26 2:40 ` [PATCH net-next 4/4] nfp: protect from theoretical size overflows on HW descriptor ring Jakub Kicinski
@ 2018-07-26 5:18 ` David Miller
4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2018-07-26 5:18 UTC (permalink / raw)
To: jakub.kicinski; +Cc: oss-drivers, netdev
From: Jakub Kicinski <jakub.kicinski@netronome.com>
Date: Wed, 25 Jul 2018 19:40:33 -0700
> This small set changes the handling of pci_sriov_set_totalvfs() errors.
> nfp is the only driver which fails probe on pci_sriov_set_totalvfs()
> errors. It turns out some BIOS configurations may break SR-IOV and
> users who don't use that feature should not suffer.
>
> Remaining patches makes sure we use overflow-safe function for ring
> allocation, even though ring sizes are limited. It won't hurt and
> we can also enable fallback to vmalloc() if memory is tight while
> at it.
Series applied, thanks Jakub.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-07-26 6:33 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-26 2:40 [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 1/4] nfp: don't fail probe on pci_sriov_set_totalvfs() errors Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 2/4] nfp: use kvcalloc() to allocate SW buffer descriptor arrays Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 3/4] nfp: restore correct ordering of fields in rx ring structure Jakub Kicinski
2018-07-26 2:40 ` [PATCH net-next 4/4] nfp: protect from theoretical size overflows on HW descriptor ring Jakub Kicinski
2018-07-26 5:18 ` [PATCH net-next 0/4] nfp: protect from theoretical size overflows and SR-IOV errors David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).