cxgbe(4): Improvements in TID management.

- Ignore any type of TID where the start/end values are not in the
  correct order.  There are situations where the firmware isn't able to
  reserve room for the number requested in the config file but doesn't
  report a failure during configuration and instead sets end <= start.

- Track start/end in tid_tab and remove some redundant copies from
  adapter->params.

- Move all the start/end and other read-only parameters to a quiet part
  of tid_tab, away from the tid locks.

MFC after:	1 week
Sponsored by:	Chelsio Communications
This commit is contained in:
Navdeep Parhar 2018-08-02 22:52:05 +00:00
parent 01c0f8bef3
commit 0c71c9ccb2
3 changed files with 44 additions and 33 deletions

View file

@ -355,11 +355,6 @@ struct adapter_params {
unsigned short a_wnd[NCCTRL_WIN];
unsigned short b_wnd[NCCTRL_WIN];
u_int ftid_min;
u_int ftid_max;
u_int etid_min;
u_int etid_max;
unsigned int cim_la_size;
uint8_t nports; /* # of ethernet ports */
@ -442,14 +437,15 @@ struct link_config {
static inline int is_ftid(const struct adapter *sc, u_int tid)
{
return (tid >= sc->params.ftid_min && tid <= sc->params.ftid_max);
return (sc->tids.nftids > 0 && tid >= sc->tids.ftid_base &&
tid <= sc->tids.ftid_end);
}
static inline int is_etid(const struct adapter *sc, u_int tid)
{
return (sc->params.etid_min > 0 && tid >= sc->params.etid_min &&
tid <= sc->params.etid_max);
return (sc->tids.netids > 0 && tid >= sc->tids.etid_base &&
tid <= sc->tids.etid_end);
}
static inline int is_offload(const struct adapter *adap)

View file

@ -120,18 +120,27 @@ union etid_entry {
};
/*
* Holds the size, base address, free list start, etc of the TID, server TID,
* and active-open TID tables. The tables themselves are allocated dynamically.
* Holds the size, base address, start, end, etc. of various types of TIDs. The
* tables themselves are allocated dynamically.
*/
struct tid_info {
void **tid_tab;
u_int nstids;
u_int stid_base;
u_int natids;
u_int nftids;
u_int ftid_base;
u_int ftid_end;
u_int ntids;
u_int tids_in_use;
u_int netids;
u_int etid_base;
u_int etid_end;
struct mtx stid_lock __aligned(CACHE_LINE_SIZE);
struct listen_ctx **stid_tab;
u_int nstids;
u_int stid_base;
u_int stids_in_use;
u_int nstids_free_head; /* # of available stids at the beginning */
struct stid_head stids;
@ -139,26 +148,28 @@ struct tid_info {
struct mtx atid_lock __aligned(CACHE_LINE_SIZE);
union aopen_entry *atid_tab;
union aopen_entry *afree;
u_int natids;
u_int atids_in_use;
struct mtx ftid_lock __aligned(CACHE_LINE_SIZE);
struct cv ftid_cv;
struct filter_entry *ftid_tab;
u_int nftids;
u_int ftid_base;
u_int ftids_in_use;
/*
* hashfilter and TOE are mutually exclusive and both use ntids and
* tids_in_use. The lock and cv are used only by hashfilter.
*/
struct mtx hftid_lock __aligned(CACHE_LINE_SIZE);
struct cv hftid_cv;
void **hftid_tab;
/* ntids, tids_in_use */
union {
void **hftid_tab;
void **tid_tab;
};
u_int tids_in_use;
struct mtx etid_lock __aligned(CACHE_LINE_SIZE);
union etid_entry *etid_tab;
union etid_entry *efree;
u_int netids;
u_int etid_base;
u_int etids_in_use;
};

View file

@ -3841,10 +3841,11 @@ get_params__post_init(struct adapter *sc)
sc->sge.iq_start = val[0];
sc->sge.eq_start = val[1];
sc->tids.ftid_base = val[2];
sc->tids.nftids = val[3] - val[2] + 1;
sc->params.ftid_min = val[2];
sc->params.ftid_max = val[3];
if (val[3] > val[2]) {
sc->tids.ftid_base = val[2];
sc->tids.ftid_end = val[3];
sc->tids.nftids = val[3] - val[2] + 1;
}
sc->vres.l2t.start = val[4];
sc->vres.l2t.size = val[5] - val[4] + 1;
KASSERT(sc->vres.l2t.size <= L2T_SIZE,
@ -3928,12 +3929,13 @@ get_params__post_init(struct adapter *sc)
"failed to query NIC parameters: %d.\n", rc);
return (rc);
}
sc->tids.etid_base = val[0];
sc->params.etid_min = val[0];
sc->params.etid_max = val[1];
sc->tids.netids = val[1] - val[0] + 1;
sc->params.eo_wr_cred = val[2];
sc->params.ethoffload = 1;
if (val[1] > val[0]) {
sc->tids.etid_base = val[0];
sc->tids.etid_end = val[1];
sc->tids.netids = val[1] - val[0] + 1;
sc->params.eo_wr_cred = val[2];
sc->params.ethoffload = 1;
}
}
if (sc->toecaps) {
/* query offload-related parameters */
@ -3951,8 +3953,10 @@ get_params__post_init(struct adapter *sc)
}
sc->tids.ntids = val[0];
sc->tids.natids = min(sc->tids.ntids / 2, MAX_ATIDS);
sc->tids.stid_base = val[1];
sc->tids.nstids = val[2] - val[1] + 1;
if (val[2] > val[1]) {
sc->tids.stid_base = val[1];
sc->tids.nstids = val[2] - val[1] + 1;
}
sc->vres.ddp.start = val[3];
sc->vres.ddp.size = val[4] - val[3] + 1;
sc->params.ofldq_wr_cred = val[5];