]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
net: hns3: fix a SSU buffer checking bug
authorYunsheng Lin <linyunsheng@huawei.com>
Tue, 18 Dec 2018 11:37:59 +0000 (19:37 +0800)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Mon, 14 Jan 2019 09:28:55 +0000 (09:28 +0000)
BugLink: https://bugs.launchpad.net/bugs/1810457
When caculating the SSU buffer, it first allocate tx and
rx private buffer, then the remaining buffer is for rx
shared buffer. The remaining buffer size should be at
least bigger than or equal to the shared_std, which is the
minimum shared buffer size required by the driver, but
currently if the remaining buffer size is equal to the
shared_std, it returns failure, which causes SSU buffer
allocation failure problem.

This patch fixes this problem by rounding up shared_std before
checking the the remaining buffer size bigger than or equal to
the shared_std.

Fixes: 46a3df9f9718 ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support")
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit af854724e51e4047f534ac6d19b3ef9fb3c35c49)
Signed-off-by: dann frazier <dann.frazier@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index 42603742f760460650e4cea1e8dd87e3ed8af514..aec1039d2707c9808400051d540e7b8c36933448 100644 (file)
@@ -1403,10 +1403,11 @@ static bool  hclge_is_rx_buf_ok(struct hclge_dev *hdev,
        shared_buf_tc = pfc_enable_num * aligned_mps +
                        (tc_num - pfc_enable_num) * aligned_mps / 2 +
                        aligned_mps;
-       shared_std = max_t(u32, shared_buf_min, shared_buf_tc);
+       shared_std = roundup(max_t(u32, shared_buf_min, shared_buf_tc),
+                            HCLGE_BUF_SIZE_UNIT);
 
        rx_priv = hclge_get_rx_priv_buff_alloced(buf_alloc);
-       if (rx_all <= rx_priv + shared_std)
+       if (rx_all < rx_priv + shared_std)
                return false;
 
        shared_buf = rounddown(rx_all - rx_priv, HCLGE_BUF_SIZE_UNIT);