提交 d5f397c1 编写于 作者: H Hao Lan 提交者: Jiantao Xiao

net: hns3: fix the imp capability bit cannot exceed 32 bits issue

mainline inclusion
from mainline-v6.5-rc4
commit b27d0232e8897f7c896dc8ad80c9907dd57fd3f3
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7ON9Y
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b27d0232e8897f7c896dc8ad80c9907dd57fd3f3

----------------------------------------------------------------------

Current only the first 32 bits of the capability flag bit are considered.
When the matching capability flag bit is greater than 31 bits,
it will get an error bit.This patch use bitmap to solve this issue.
It can handle each capability bit whitout bit width limit.

Fixes: da77aef9 ("net: hns3: create common cmdq resource allocate/free/query APIs")
Signed-off-by: NHao Lan <lanhao@huawei.com>
Signed-off-by: NJijie Shao <shaojijie@huawei.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
Signed-off-by: NJiantao Xiao <xiaojiantao1@h-partners.com>
上级 a21b75c3
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/pkt_sched.h> #include <linux/pkt_sched.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/bitmap.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#define HNAE3_MOD_VERSION "1.0" #define HNAE3_MOD_VERSION "1.0"
...@@ -421,7 +422,7 @@ struct hnae3_ae_dev { ...@@ -421,7 +422,7 @@ struct hnae3_ae_dev {
unsigned long hw_err_reset_req; unsigned long hw_err_reset_req;
struct hnae3_dev_specs dev_specs; struct hnae3_dev_specs dev_specs;
u32 dev_version; u32 dev_version;
unsigned long caps[BITS_TO_LONGS(HNAE3_DEV_CAPS_MAX_NUM)]; DECLARE_BITMAP(caps, HNAE3_DEV_CAPS_MAX_NUM);
void *priv; void *priv;
}; };
......
...@@ -172,6 +172,20 @@ static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = { ...@@ -172,6 +172,20 @@ static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = {
{HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B}, {HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B},
}; };
static void
hclge_comm_capability_to_bitmap(unsigned long *bitmap, __le32 *caps)
{
const unsigned int words = HCLGE_COMM_QUERY_CAP_LENGTH;
u32 val[HCLGE_COMM_QUERY_CAP_LENGTH];
unsigned int i;
for (i = 0; i < words; i++)
val[i] = __le32_to_cpu(caps[i]);
bitmap_from_arr32(bitmap, val,
HCLGE_COMM_QUERY_CAP_LENGTH * BITS_PER_TYPE(u32));
}
static void static void
hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf, hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf,
struct hclge_comm_query_version_cmd *cmd) struct hclge_comm_query_version_cmd *cmd)
...@@ -180,11 +194,12 @@ hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf, ...@@ -180,11 +194,12 @@ hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf,
is_pf ? hclge_pf_cmd_caps : hclge_vf_cmd_caps; is_pf ? hclge_pf_cmd_caps : hclge_vf_cmd_caps;
u32 size = is_pf ? ARRAY_SIZE(hclge_pf_cmd_caps) : u32 size = is_pf ? ARRAY_SIZE(hclge_pf_cmd_caps) :
ARRAY_SIZE(hclge_vf_cmd_caps); ARRAY_SIZE(hclge_vf_cmd_caps);
u32 caps, i; DECLARE_BITMAP(caps, HCLGE_COMM_QUERY_CAP_LENGTH * BITS_PER_TYPE(u32));
u32 i;
caps = __le32_to_cpu(cmd->caps[0]); hclge_comm_capability_to_bitmap(caps, cmd->caps);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
if (hnae3_get_bit(caps, caps_map[i].imp_bit)) if (test_bit(caps_map[i].imp_bit, caps))
set_bit(caps_map[i].local_bit, ae_dev->caps); set_bit(caps_map[i].local_bit, ae_dev->caps);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册