* [PATCH] net: thunderx: correct bound check in nic_config_loopback
@ 2016-07-31 2:49 Levin, Alexander
2016-07-31 9:52 ` Sergei Shtylyov
2016-07-31 16:41 ` Sunil Kovvuri
0 siblings, 2 replies; 5+ messages in thread
From: Levin, Alexander @ 2016-07-31 2:49 UTC (permalink / raw)
To: sgoutham@cavium.com, rric@kernel.org
Cc: linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Levin, Alexander
Off by one in nic_config_loopback would access an invalid arrat variable when
vf id == MAX_LMAC.
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
---
drivers/net/ethernet/cavium/thunder/nic_main.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 16ed203..a70f50d 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -615,7 +615,7 @@ static int nic_config_loopback(struct nicpf *nic, struct set_loopback *lbk)
{
int bgx_idx, lmac_idx;
- if (lbk->vf_id > MAX_LMAC)
+ if (lbk->vf_id >= MAX_LMAC)
return -1;
bgx_idx = NIC_GET_BGX_FROM_VF_LMAC_MAP(nic->vf_lmac_map[lbk->vf_id]);
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] net: thunderx: correct bound check in nic_config_loopback
2016-07-31 2:49 [PATCH] net: thunderx: correct bound check in nic_config_loopback Levin, Alexander
@ 2016-07-31 9:52 ` Sergei Shtylyov
2016-07-31 16:41 ` Sunil Kovvuri
1 sibling, 0 replies; 5+ messages in thread
From: Sergei Shtylyov @ 2016-07-31 9:52 UTC (permalink / raw)
To: Levin, Alexander, sgoutham@cavium.com, rric@kernel.org
Cc: linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org
Hello.
On 7/31/2016 5:49 AM, Levin, Alexander wrote:
> Off by one in nic_config_loopback would access an invalid arrat variable when
Array?
> vf id == MAX_LMAC.
>
> Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
[...]
MBR, Sergei
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] net: thunderx: correct bound check in nic_config_loopback
2016-07-31 2:49 [PATCH] net: thunderx: correct bound check in nic_config_loopback Levin, Alexander
2016-07-31 9:52 ` Sergei Shtylyov
@ 2016-07-31 16:41 ` Sunil Kovvuri
2016-08-01 15:57 ` Levin, Alexander
1 sibling, 1 reply; 5+ messages in thread
From: Sunil Kovvuri @ 2016-07-31 16:41 UTC (permalink / raw)
To: Levin, Alexander
Cc: sgoutham@cavium.com, rric@kernel.org,
linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org
Thanks for finding.
A much better fix would be,
- if (lbk->vf_id > MAX_LMAC)
+ if (lbk->vf_id >= nic->num_vf_en)
return -1;
where 'num_vf_en' reflects the exact number of physical interfaces or
LMACs on the system.
Thanks,
Sunil.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] net: thunderx: correct bound check in nic_config_loopback
2016-07-31 16:41 ` Sunil Kovvuri
@ 2016-08-01 15:57 ` Levin, Alexander
2016-08-02 11:32 ` Sunil Kovvuri
0 siblings, 1 reply; 5+ messages in thread
From: Levin, Alexander @ 2016-08-01 15:57 UTC (permalink / raw)
To: Sunil Kovvuri, Levin, Alexander
Cc: netdev@vger.kernel.org, sgoutham@cavium.com, rric@kernel.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
On 07/31/2016 12:41 PM, Sunil Kovvuri wrote:
> Thanks for finding.
> A much better fix would be,
>
> - if (lbk->vf_id > MAX_LMAC)
> + if (lbk->vf_id >= nic->num_vf_en)
> return -1;
>
> where 'num_vf_en' reflects the exact number of physical interfaces or
> LMACs on the system.
Right. I see quite a few more places that compare to MAX_LMAC vs
num_vf_en. What was the reasoning behind it then?
Thanks,
Sasha
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] net: thunderx: correct bound check in nic_config_loopback
2016-08-01 15:57 ` Levin, Alexander
@ 2016-08-02 11:32 ` Sunil Kovvuri
0 siblings, 0 replies; 5+ messages in thread
From: Sunil Kovvuri @ 2016-08-02 11:32 UTC (permalink / raw)
To: Levin, Alexander
Cc: netdev@vger.kernel.org, sgoutham@cavium.com, rric@kernel.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
[-- Attachment #1: Type: text/plain, Size: 1315 bytes --]
Yes, it's incorrect at other places as well.
That went in the very early stages of development and didn't change it because
that out of bounds issue will never happen as no of logical interfaces
will never be
morethan MAX_LMAC i.e 8, so max vf_id will be 7.
But with addition of support for newer platforms with different set HW
capabilities we
are slowly getting rid of most of the macros i.e static info.
Attached is the patch which will get rid of MAX_LMAC and also allows
support for 16LMACs (supported on newer platforms) or more.
I hope currently you are not facing any issue with below check.
>>> if (lbk->vf_id > MAX_LMAC)
I will submit the attached patch along with other patches when net-next is open.
https://lkml.org/lkml/2016/7/15/362
Thanks,
Sunil.
On Mon, Aug 1, 2016 at 9:27 PM, Levin, Alexander
<alexander.levin@verizon.com> wrote:
> On 07/31/2016 12:41 PM, Sunil Kovvuri wrote:
>> Thanks for finding.
>> A much better fix would be,
>>
>> - if (lbk->vf_id > MAX_LMAC)
>> + if (lbk->vf_id >= nic->num_vf_en)
>> return -1;
>>
>> where 'num_vf_en' reflects the exact number of physical interfaces or
>> LMACs on the system.
>
> Right. I see quite a few more places that compare to MAX_LMAC vs
> num_vf_en. What was the reasoning behind it then?
>
>
> Thanks,
> Sasha
[-- Attachment #2: 0001-net-thunderx-Add-support-for-16-LMACs-of-83xx.patch --]
[-- Type: text/x-patch, Size: 5390 bytes --]
From cab9aff8c76fd34fdc252eba90ee1bb016c5829b Mon Sep 17 00:00:00 2001
From: Sunil Goutham <sgoutham@cavium.com>
Date: Tue, 2 Aug 2016 16:56:12 +0530
Subject: [PATCH] net: thunderx: Add support for 16 LMACs of 83xx
83xx will have 4 BGX blocks i.e 16 LMACs, to avoid changing
the same with every platform, nicpf struct elements which
track LMAC related info are now allocated runtime based
on platform's max possible BGX count.
Signed-off-by: Sunil Goutham <sgoutham@cavium.com>
---
drivers/net/ethernet/cavium/thunder/nic_main.c | 61 ++++++++++++++++++-----
drivers/net/ethernet/cavium/thunder/thunder_bgx.h | 2 -
2 files changed, 49 insertions(+), 14 deletions(-)
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 74bb811..0139186 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -53,12 +53,12 @@ struct nicpf {
#define NIC_SET_VF_LMAC_MAP(bgx, lmac) (((bgx & 0xF) << 4) | (lmac & 0xF))
#define NIC_GET_BGX_FROM_VF_LMAC_MAP(map) ((map >> 4) & 0xF)
#define NIC_GET_LMAC_FROM_VF_LMAC_MAP(map) (map & 0xF)
- u8 vf_lmac_map[MAX_LMAC];
+ u8 *vf_lmac_map;
struct delayed_work dwork;
struct workqueue_struct *check_link;
- u8 link[MAX_LMAC];
- u8 duplex[MAX_LMAC];
- u32 speed[MAX_LMAC];
+ u8 *link;
+ u8 *duplex;
+ u32 *speed;
u16 cpi_base[MAX_NUM_VFS_SUPPORTED];
u16 rssi_base[MAX_NUM_VFS_SUPPORTED];
bool mbx_lock[MAX_NUM_VFS_SUPPORTED];
@@ -185,7 +185,7 @@ static void nic_mbx_send_ready(struct nicpf *nic, int vf)
mbx.nic_cfg.sqs_mode = (vf >= nic->num_vf_en) ? true : false;
mbx.nic_cfg.node_id = nic->node;
- mbx.nic_cfg.loopback_supported = vf < MAX_LMAC;
+ mbx.nic_cfg.loopback_supported = vf < nic->num_vf_en;
nic_send_msg_to_vf(nic, vf, &mbx);
}
@@ -336,8 +336,17 @@ static void nic_set_lmac_vf_mapping(struct nicpf *nic)
}
}
-static void nic_get_hw_info(struct nicpf *nic)
+static void nic_free_lmacmem(struct nicpf *nic)
{
+ kfree(nic->vf_lmac_map);
+ kfree(nic->link);
+ kfree(nic->duplex);
+ kfree(nic->speed);
+}
+
+static int nic_get_hw_info(struct nicpf *nic)
+{
+ u8 max_lmac;
u16 sdevid;
struct hw_info *hw = nic->hw;
@@ -385,18 +394,40 @@ static void nic_get_hw_info(struct nicpf *nic)
break;
}
hw->tl4_cnt = MAX_QUEUES_PER_QSET * pci_sriov_get_totalvfs(nic->pdev);
+
+ /* Allocate memory for LMAC tracking elements */
+ max_lmac = hw->bgx_cnt * MAX_LMAC_PER_BGX;
+ nic->vf_lmac_map = kmalloc_array(max_lmac, sizeof(u8), GFP_KERNEL);
+ if (!nic->vf_lmac_map)
+ goto error;
+ nic->link = kmalloc_array(max_lmac, sizeof(u8), GFP_KERNEL);
+ if (!nic->link)
+ goto error;
+ nic->duplex = kmalloc_array(max_lmac, sizeof(u8), GFP_KERNEL);
+ if (!nic->duplex)
+ goto error;
+ nic->speed = kmalloc_array(max_lmac, sizeof(u32), GFP_KERNEL);
+ if (!nic->speed)
+ goto error;
+ return 0;
+
+error:
+ nic_free_lmacmem(nic);
+ return -ENOMEM;
}
#define BGX0_BLOCK 8
#define BGX1_BLOCK 9
-static void nic_init_hw(struct nicpf *nic)
+static int nic_init_hw(struct nicpf *nic)
{
- int i;
+ int i, err;
u64 cqm_cfg;
/* Get HW capability info */
- nic_get_hw_info(nic);
+ err = nic_get_hw_info(nic);
+ if (err)
+ return err;
/* Enable NIC HW block */
nic_reg_write(nic, NIC_PF_CFG, 0x3);
@@ -442,6 +473,8 @@ static void nic_init_hw(struct nicpf *nic)
cqm_cfg = nic_reg_read(nic, NIC_PF_CQM_CFG);
if (cqm_cfg < NICPF_CQM_MIN_DROP_LEVEL)
nic_reg_write(nic, NIC_PF_CQM_CFG, NICPF_CQM_MIN_DROP_LEVEL);
+
+ return 0;
}
/* Channel parse index configuration */
@@ -741,7 +774,7 @@ static int nic_config_loopback(struct nicpf *nic, struct set_loopback *lbk)
{
int bgx_idx, lmac_idx;
- if (lbk->vf_id > MAX_LMAC)
+ if (lbk->vf_id >= nic->num_vf_en)
return -1;
bgx_idx = NIC_GET_BGX_FROM_VF_LMAC_MAP(nic->vf_lmac_map[lbk->vf_id]);
@@ -837,7 +870,7 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
switch (mbx.msg.msg) {
case NIC_MBOX_MSG_READY:
nic_mbx_send_ready(nic, vf);
- if (vf < MAX_LMAC) {
+ if (vf < nic->num_vf_en) {
nic->link[vf] = 0;
nic->duplex[vf] = 0;
nic->speed[vf] = 0;
@@ -1240,7 +1273,9 @@ static int nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
nic->node = nic_get_node_id(pdev);
/* Initialize hardware */
- nic_init_hw(nic);
+ err = nic_init_hw(nic);
+ if (err)
+ goto err_release_regions;
nic_set_lmac_vf_mapping(nic);
@@ -1275,6 +1310,7 @@ err_unregister_interrupts:
err_release_regions:
pci_release_regions(pdev);
err_disable_device:
+ nic_free_lmacmem(nic);
devm_kfree(dev, nic->hw);
devm_kfree(dev, nic);
pci_disable_device(pdev);
@@ -1298,6 +1334,7 @@ static void nic_remove(struct pci_dev *pdev)
nic_unregister_interrupts(nic);
pci_release_regions(pdev);
+ nic_free_lmacmem(nic);
devm_kfree(&pdev->dev, nic->hw);
devm_kfree(&pdev->dev, nic);
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
index 6225ff4..c7d7cc6 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
@@ -29,8 +29,6 @@
#define MAX_DMAC_PER_LMAC_TNS_BYPASS_MODE 2
-#define MAX_LMAC (MAX_BGX_PER_CN88XX * MAX_LMAC_PER_BGX)
-
/* Registers */
#define BGX_CMRX_CFG 0x00
#define CMR_PKT_TX_EN BIT_ULL(13)
--
2.7.4
[-- Attachment #3: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-08-02 11:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-07-31 2:49 [PATCH] net: thunderx: correct bound check in nic_config_loopback Levin, Alexander
2016-07-31 9:52 ` Sergei Shtylyov
2016-07-31 16:41 ` Sunil Kovvuri
2016-08-01 15:57 ` Levin, Alexander
2016-08-02 11:32 ` Sunil Kovvuri
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).