• Xi Wang's avatar
    RDMA/hns: Fix sg offset non-zero issue · 60c3becf
    Xi Wang authored
    When run perftest in many times, the system will report a BUG as follows:
    
       BUG: Bad rss-counter state mm:(____ptrval____) idx:0 val:-1
       BUG: Bad rss-counter state mm:(____ptrval____) idx:1 val:1
    
    We tested with different kernel version and found it started from the the
    following commit:
    
    commit d10bcf94 ("RDMA/umem: Combine contiguous PAGE_SIZE regions in
    SGEs")
    
    In this commit, the sg->offset is always 0 when sg_set_page() is called in
    ib_umem_get() and the drivers are not allowed to change the sgl, otherwise
    it will get bad page descriptor when unfolding SGEs in __ib_umem_release()
    as sg_page_count() will get wrong result while sgl->offset is not 0.
    
    However, there is a weird sgl usage in the current hns driver, the driver
    modified sg->offset after calling ib_umem_get(), which caused we iterate
    past the wrong number of pages in for_each_sg_page iterator.
    
    This patch fixes it by correcting the non-standard sgl usage found in the
    hns_roce_db_map_user() function.
    
    Fixes: d10bcf94 ("RDMA/umem: Combine contiguous PAGE_SIZE regions in SGEs")
    Fixes: 0425e3e6 ("RDMA/hns: Support flush cqe for hip08 in kernel space")
    Link: https://lore.kernel.org/r/1562808737-45723-1-git-send-email-oulijun@huawei.comSigned-off-by: default avatarXi Wang <wangxi11@huawei.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    60c3becf
hns_roce_db.c 3.91 KB