> -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Wednesday, June 5, 2019 3:35 AM > To: Rong, Leyi <leyi.r...@intel.com>; Zhang, Qi Z <qi.z.zh...@intel.com> > Cc: dev@dpdk.org; Sridhar, Vignesh <vignesh.srid...@intel.com>; Stillwell Jr, > Paul M <paul.m.stillwell...@intel.com> > Subject: Re: [dpdk-dev] [PATCH 14/49] net/ice/base: refactor HW table init > function > > > > On 6/4/19 7:42 AM, Leyi Rong wrote: > > 1. Separated the calls to initialize and allocate the HW XLT tables > > from call to fill table. This is to allow the ice_init_hw_tbls call to > > be made prior to package download so that all HW structures are > > correctly initialized. This will avoid any invalid memory references > > if package download fails on unloading the driver. > > 2. Fill HW tables with package content after successful package download. > > 3. Free HW table and flow profile allocations when unloading driver. > > 4. Add flag in block structure to check if lists in block are > > initialized. This is to avoid any NULL reference in releasing flow > > profiles that may have been freed in previous calls to free tables. > > > > Signed-off-by: Vignesh Sridhar <vignesh.srid...@intel.com> > > Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell...@intel.com> > > Signed-off-by: Leyi Rong <leyi.r...@intel.com> > > --- > > drivers/net/ice/base/ice_common.c | 6 +- > > drivers/net/ice/base/ice_flex_pipe.c | 284 ++++++++++++++------------- > > drivers/net/ice/base/ice_flex_pipe.h | 1 + > > drivers/net/ice/base/ice_flex_type.h | 1 + > > 4 files changed, 151 insertions(+), 141 deletions(-) > > > > diff --git a/drivers/net/ice/base/ice_common.c > > b/drivers/net/ice/base/ice_common.c > > index a0ab25aef..62c7fad0d 100644 > > --- a/drivers/net/ice/base/ice_common.c > > +++ b/drivers/net/ice/base/ice_common.c > > @@ -916,12 +916,13 @@ enum ice_status ice_init_hw(struct ice_hw *hw) > > > > ice_init_flex_flds(hw, ICE_RXDID_FLEX_NIC); > > ice_init_flex_flds(hw, ICE_RXDID_FLEX_NIC_2); > > - > > /* Obtain counter base index which would be used by flow director > */ > > status = ice_alloc_fd_res_cntr(hw, &hw->fd_ctr_base); > > if (status) > > goto err_unroll_fltr_mgmt_struct; > > - > > + status = ice_init_hw_tbls(hw); > > + if (status) > > + goto err_unroll_fltr_mgmt_struct; > > return ICE_SUCCESS; > > > > err_unroll_fltr_mgmt_struct: > > @@ -952,6 +953,7 @@ void ice_deinit_hw(struct ice_hw *hw) > > ice_sched_cleanup_all(hw); > > ice_sched_clear_agg(hw); > > ice_free_seg(hw); > > + ice_free_hw_tbls(hw); > > > > if (hw->port_info) { > > ice_free(hw, hw->port_info); > > diff --git a/drivers/net/ice/base/ice_flex_pipe.c > > b/drivers/net/ice/base/ice_flex_pipe.c > > index 8f0b513f4..93e056853 100644 > > --- a/drivers/net/ice/base/ice_flex_pipe.c > > +++ b/drivers/net/ice/base/ice_flex_pipe.c > > @@ -1375,10 +1375,12 @@ enum ice_status ice_init_pkg(struct ice_hw > > *hw, u8 *buf, u32 len) > > > > if (!status) { > > hw->seg = seg; > > - /* on successful package download, update other required > > - * registers to support the package > > + /* on successful package download update other required > > + * registers to support the package and fill HW tables > > + * with package content. > > */ > > ice_init_pkg_regs(hw); > > + ice_fill_blk_tbls(hw); > > } else { > > ice_debug(hw, ICE_DBG_INIT, "package load failed, %d\n", > > status); > > @@ -2755,6 +2757,65 @@ static const u32 > ice_blk_sids[ICE_BLK_COUNT][ICE_SID_OFF_COUNT] = { > > } > > }; > > > > +/** > > + * ice_init_sw_xlt1_db - init software XLT1 database from HW tables > > + * @hw: pointer to the hardware structure > > + * @blk: the HW block to initialize > > + */ > > +static > > +void ice_init_sw_xlt1_db(struct ice_hw *hw, enum ice_block blk) { > > + u16 pt; > > + > > + for (pt = 0; pt < hw->blk[blk].xlt1.count; pt++) { > > + u8 ptg; > > + > > + ptg = hw->blk[blk].xlt1.t[pt]; > > + if (ptg != ICE_DEFAULT_PTG) { > > + ice_ptg_alloc_val(hw, blk, ptg); > > + ice_ptg_add_mv_ptype(hw, blk, pt, ptg); > > ice_ptg_add_mv_ptype() can fail, error should be propagated.
You are correct that ice_ptg_add_mv_ptype() can fail, but it can never fail in this case. This function is called at init time when the HW has been loaded to a known good state and there is no chance it will fail this call. > > > + } > > + } > > +} > > + > > +/** > > + * ice_init_sw_xlt2_db - init software XLT2 database from HW tables > > + * @hw: pointer to the hardware structure > > + * @blk: the HW block to initialize > > + */ > > +static void ice_init_sw_xlt2_db(struct ice_hw *hw, enum ice_block > > +blk) { > > + u16 vsi; > > + > > + for (vsi = 0; vsi < hw->blk[blk].xlt2.count; vsi++) { > > + u16 vsig; > > + > > + vsig = hw->blk[blk].xlt2.t[vsi]; > > + if (vsig) { > > + ice_vsig_alloc_val(hw, blk, vsig); > > + ice_vsig_add_mv_vsi(hw, blk, vsi, vsig); > > Ditto Same issue here as above. > > > + /* no changes at this time, since this has been > > + * initialized from the original package > > + */ > > + hw->blk[blk].xlt2.vsis[vsi].changed = 0; > > + } > > + } > > +} > > + > > +/** > > + * ice_init_sw_db - init software database from HW tables > > + * @hw: pointer to the hardware structure */ static void > > +ice_init_sw_db(struct ice_hw *hw) { > > + u16 i; > > + > > + for (i = 0; i < ICE_BLK_COUNT; i++) { > > + ice_init_sw_xlt1_db(hw, (enum ice_block)i); > > + ice_init_sw_xlt2_db(hw, (enum ice_block)i); > > + } > > And so this function should also propagate the error. Same comment here. > > > +} > > + > > /** > > * ice_fill_tbl - Reads content of a single table type into database > > * @hw: pointer to the hardware structure @@ -2853,12 +2914,12 @@ > > static void ice_fill_tbl(struct ice_hw *hw, enum ice_block block_id, u32 > > sid) > > case ICE_SID_FLD_VEC_PE: > > es = (struct ice_sw_fv_section *)sect; > > src = (u8 *)es->fv; > > - sect_len = LE16_TO_CPU(es->count) * > > - hw->blk[block_id].es.fvw * > > + sect_len = (u32)(LE16_TO_CPU(es->count) * > > + hw->blk[block_id].es.fvw) * > > sizeof(*hw->blk[block_id].es.t); > > dst = (u8 *)hw->blk[block_id].es.t; > > - dst_len = hw->blk[block_id].es.count * > > - hw->blk[block_id].es.fvw * > > + dst_len = (u32)(hw->blk[block_id].es.count * > > + hw->blk[block_id].es.fvw) * > > sizeof(*hw->blk[block_id].es.t); > > break; > > default: > > @@ -2886,75 +2947,61 @@ static void ice_fill_tbl(struct ice_hw *hw, enum > ice_block block_id, u32 sid) > > } > > > > /** > > - * ice_fill_blk_tbls - Read package content for tables of a block > > + * ice_fill_blk_tbls - Read package context for tables > > * @hw: pointer to the hardware structure > > - * @block_id: The block ID which contains the tables to be copied > > * > > * Reads the current package contents and populates the driver > > - * database with the data it contains to allow for advanced driver > > - * features. > > - */ > > -static void ice_fill_blk_tbls(struct ice_hw *hw, enum ice_block > > block_id) -{ > > - ice_fill_tbl(hw, block_id, hw->blk[block_id].xlt1.sid); > > - ice_fill_tbl(hw, block_id, hw->blk[block_id].xlt2.sid); > > - ice_fill_tbl(hw, block_id, hw->blk[block_id].prof.sid); > > - ice_fill_tbl(hw, block_id, hw->blk[block_id].prof_redir.sid); > > - ice_fill_tbl(hw, block_id, hw->blk[block_id].es.sid); > > -} > > - > > -/** > > - * ice_free_flow_profs - free flow profile entries > > - * @hw: pointer to the hardware structure > > + * database with the data iteratively for all advanced feature > > + * blocks. Assume that the Hw tables have been allocated. > > */ > > -static void ice_free_flow_profs(struct ice_hw *hw) > > +void ice_fill_blk_tbls(struct ice_hw *hw) > > { > > u8 i; > > > > for (i = 0; i < ICE_BLK_COUNT; i++) { > > - struct ice_flow_prof *p, *tmp; > > - > > - if (!&hw->fl_profs[i]) > > - continue; > > - > > - /* This call is being made as part of resource deallocation > > - * during unload. Lock acquire and release will not be > > - * necessary here. > > - */ > > - LIST_FOR_EACH_ENTRY_SAFE(p, tmp, &hw->fl_profs[i], > > - ice_flow_prof, l_entry) { > > - struct ice_flow_entry *e, *t; > > - > > - LIST_FOR_EACH_ENTRY_SAFE(e, t, &p->entries, > > - ice_flow_entry, l_entry) > > - ice_flow_rem_entry(hw, > ICE_FLOW_ENTRY_HNDL(e)); > > - > > - LIST_DEL(&p->l_entry); > > - if (p->acts) > > - ice_free(hw, p->acts); > > - ice_free(hw, p); > > - } > > + enum ice_block blk_id = (enum ice_block)i; > > > > - ice_destroy_lock(&hw->fl_profs_locks[i]); > > + ice_fill_tbl(hw, blk_id, hw->blk[blk_id].xlt1.sid); > > + ice_fill_tbl(hw, blk_id, hw->blk[blk_id].xlt2.sid); > > + ice_fill_tbl(hw, blk_id, hw->blk[blk_id].prof.sid); > > + ice_fill_tbl(hw, blk_id, hw->blk[blk_id].prof_redir.sid); > > + ice_fill_tbl(hw, blk_id, hw->blk[blk_id].es.sid); > > > } > > + > > + ice_init_sw_db(hw); > > Propagate error once above is fixed. Same comment here > > > } > >