Re: [PATCH for-next 4/7] RDMA/bnxt_re: Refactor net ring allocation function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jan 27, 2020 at 6:14 PM Leon Romanovsky <leon@xxxxxxxxxx> wrote:
>
> On Mon, Jan 27, 2020 at 04:55:07PM +0530, Devesh Sharma wrote:
> > On Mon, Jan 27, 2020 at 1:32 PM Leon Romanovsky <leon@xxxxxxxxxx> wrote:
> > >
> > > On Mon, Jan 27, 2020 at 01:10:10PM +0530, Devesh Sharma wrote:
> > > > On Sun, Jan 26, 2020 at 7:59 PM Leon Romanovsky <leon@xxxxxxxxxx> wrote:
> > > > >
> > > > > On Fri, Jan 24, 2020 at 12:52:42AM -0500, Devesh Sharma wrote:
> > > > > > Introducing a new attribute structure to reduce
> > > > > > the long list of arguments passed in bnxt_re_net_ring_alloc()
> > > > > > function.
> > > > > >
> > > > > > The caller of bnxt_re_net_ring_alloc should fill in
> > > > > > the list of attributes in bnxt_re_ring_attr structure
> > > > > > and then pass the pointer to the function.
> > > > > >
> > > > > > Signed-off-by: Naresh Kumar PBS <nareshkumar.pbs@xxxxxxxxxxxx>
> > > > > > Signed-off-by: Selvin Xavier <selvin.xavier@xxxxxxxxxxxx>
> > > > > > Signed-off-by: Devesh Sharma <devesh.sharma@xxxxxxxxxxxx>
> > > > > > ---
> > > > > >  drivers/infiniband/hw/bnxt_re/bnxt_re.h |  9 +++++
> > > > > >  drivers/infiniband/hw/bnxt_re/main.c    | 65 ++++++++++++++++++---------------
> > > > > >  2 files changed, 45 insertions(+), 29 deletions(-)
> > > > > >
> > > > > > diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > > > > > index 86274f4..c736e82 100644
> > > > > > --- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > > > > > +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> > > > > > @@ -89,6 +89,15 @@
> > > > > >
> > > > > >  #define BNXT_RE_DEFAULT_ACK_DELAY    16
> > > > > >
> > > > > > +struct bnxt_re_ring_attr {
> > > > > > +     dma_addr_t      *dma_arr;
> > > > > > +     int             pages;
> > > > > > +     int             type;
> > > > > > +     u32             depth;
> > > > > > +     u32             lrid; /* Logical ring id */
> > > > > > +     u8              mode;
> > > > > > +};
> > > > > > +
> > > > > >  struct bnxt_re_work {
> > > > > >       struct work_struct      work;
> > > > > >       unsigned long           event;
> > > > > > diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> > > > > > index a966c68..648a5ea 100644
> > > > > > --- a/drivers/infiniband/hw/bnxt_re/main.c
> > > > > > +++ b/drivers/infiniband/hw/bnxt_re/main.c
> > > > > > @@ -427,9 +427,9 @@ static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev,
> > > > > >       return rc;
> > > > > >  }
> > > > > >
> > > > > > -static int bnxt_re_net_ring_alloc(struct bnxt_re_dev *rdev, dma_addr_t *dma_arr,
> > > > > > -                               int pages, int type, u32 ring_mask,
> > > > > > -                               u32 map_index, u16 *fw_ring_id)
> > > > > > +static int bnxt_re_net_ring_alloc(struct bnxt_re_dev *rdev,
> > > > > > +                               struct bnxt_re_ring_attr *ring_attr,
> > > > > > +                               u16 *fw_ring_id)
> > > > > >  {
> > > > > >       struct bnxt_en_dev *en_dev = rdev->en_dev;
> > > > > >       struct hwrm_ring_alloc_input req = {0};
> > > > > > @@ -443,18 +443,18 @@ static int bnxt_re_net_ring_alloc(struct bnxt_re_dev *rdev, dma_addr_t *dma_arr,
> > > > > >       memset(&fw_msg, 0, sizeof(fw_msg));
> > > > > >       bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_RING_ALLOC, -1, -1);
> > > > > >       req.enables = 0;
> > > > > > -     req.page_tbl_addr =  cpu_to_le64(dma_arr[0]);
> > > > > > -     if (pages > 1) {
> > > > > > +     req.page_tbl_addr =  cpu_to_le64(ring_attr->dma_arr[0]);
> > > > > > +     if (ring_attr->pages > 1) {
> > > > > >               /* Page size is in log2 units */
> > > > > >               req.page_size = BNXT_PAGE_SHIFT;
> > > > > >               req.page_tbl_depth = 1;
> > > > > >       }
> > > > > >       req.fbo = 0;
> > > > > >       /* Association of ring index with doorbell index and MSIX number */
> > > > > > -     req.logical_id = cpu_to_le16(map_index);
> > > > > > -     req.length = cpu_to_le32(ring_mask + 1);
> > > > > > -     req.ring_type = type;
> > > > > > -     req.int_mode = RING_ALLOC_REQ_INT_MODE_MSIX;
> > > > > > +     req.logical_id = cpu_to_le16(ring_attr->lrid);
> > > > > > +     req.length = cpu_to_le32(ring_attr->depth + 1);
> > > > > > +     req.ring_type = ring_attr->type;
> > > > > > +     req.int_mode = ring_attr->mode;
> > > > > >       bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
> > > > > >                           sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
> > > > > >       rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
> > > > > > @@ -1006,12 +1006,13 @@ static void bnxt_re_free_res(struct bnxt_re_dev *rdev)
> > > > > >
> > > > > >  static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev)
> > > > > >  {
> > > > > > +     struct bnxt_qplib_ctx *qplib_ctx;
> > > > > > +     struct bnxt_re_ring_attr rattr;
> > > > > >       int num_vec_created = 0;
> > > > > > -     dma_addr_t *pg_map;
> > > > > >       int rc = 0, i;
> > > > > > -     int pages;
> > > > > >       u8 type;
> > > > > >
> > > > > > +     memset(&rattr, 0, sizeof(rattr));
> > > > >
> > > > > Initialize rattr to zero from the beginning and save call to memset.
> > > > I moved from static initialization to memset due to some sparse/smatch
> > > > warnings, rattr has a "pointer member".
> > >
> > > Can you share the error and tool version, because it is pretty common
> > > way to initialize variables? Also "= {0}" would solve your checker
> > > warning.
> > I will have to duplicate it again to report the precise warning but
> > based on my memory, sparse or smatch was shouting about "pointer
> > converted to integer without cast"
> > I guess that was because rattr.dma_arr is a pointer and static
> > initialization was assigning value 0 while it should had been NULL. If
> > you insist I would send you exact warning msg and tool-version-number
> > soon.
>
> Yes, please, because NULL is 0 and has special meaning in C standard.
This is what sparse warns about:
make C=2 CHECK="/data2/upstream/tools/sparse/sparse"
CF="-D__CHECK_ENDIAN__" drivers/infiniband/hw/bnxt_re/
  CHECK   drivers/infiniband/hw/bnxt_re/main.c
drivers/infiniband/hw/bnxt_re/main.c:1010:43: warning: Using plain
integer as NULL pointer

sparse version used:
v0.6.1-131-g22978b6b
>
> > >
> > > Thanks



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux