svn commit: r339626 - head/sys/dev/cxgbe

Rodney W. Grimes freebsd at pdx.rh.CN85.dnsmgr.net
Mon Oct 22 23:36:13 UTC 2018


> Author: np
> Date: Mon Oct 22 23:06:23 2018
> New Revision: 339626
> URL: https://svnweb.freebsd.org/changeset/base/339626
> 
> Log:
>   cxgbe(4): Use automatic cidx updates with ofld and ctrl queues.
>   
>   The bits that explicitly request cidx updates do not work reliably with
>   all possible WRs that can be sent over the queue.  The F_FW_WR_EQUIQ
>   requests that still remain may also have to be replaced with explicit
>   credit flush WRs in the future.
>   
>   MFC after:	2 days

Please note in your RFA to re@ your reasons for requesting early
merge to a frozen stable branch.  I see good reason for this to
be approved as it would be good to get this in the next snapshot,
but it usually would be rejected if there is not a reason given.

(There is a normal 3 day minimum on MFC after to a frozen branch)


Thanks,
Rod <RE

>   Sponsored by:	Chelsio Communications
> 
> Modified:
>   head/sys/dev/cxgbe/t4_sge.c
> 
> Modified: head/sys/dev/cxgbe/t4_sge.c
> ==============================================================================
> --- head/sys/dev/cxgbe/t4_sge.c	Mon Oct 22 22:24:32 2018	(r339625)
> +++ head/sys/dev/cxgbe/t4_sge.c	Mon Oct 22 23:06:23 2018	(r339626)
> @@ -2089,12 +2089,13 @@ drain_wrq_wr_list(struct adapter *sc, struct sge_wrq *
>  
>  		if (available < eq->sidx / 4 &&
>  		    atomic_cmpset_int(&eq->equiq, 0, 1)) {
> +				/*
> +				 * XXX: This is not 100% reliable with some
> +				 * types of WRs.  But this is a very unusual
> +				 * situation for an ofld/ctrl queue anyway.
> +				 */
>  			dst->equiq_to_len16 |= htobe32(F_FW_WR_EQUIQ |
>  			    F_FW_WR_EQUEQ);
> -			eq->equeqidx = eq->pidx;
> -		} else if (IDXDIFF(eq->pidx, eq->equeqidx, eq->sidx) >= 32) {
> -			dst->equiq_to_len16 |= htobe32(F_FW_WR_EQUEQ);
> -			eq->equeqidx = eq->pidx;
>  		}
>  
>  		dbdiff += n;
> @@ -2644,12 +2645,13 @@ commit_wrq_wr(struct sge_wrq *wrq, void *w, struct wrq
>  			available = IDXDIFF(eq->cidx, eq->pidx, eq->sidx) - 1;
>  			if (available < eq->sidx / 4 &&
>  			    atomic_cmpset_int(&eq->equiq, 0, 1)) {
> +				/*
> +				 * XXX: This is not 100% reliable with some
> +				 * types of WRs.  But this is a very unusual
> +				 * situation for an ofld/ctrl queue anyway.
> +				 */
>  				dst->equiq_to_len16 |= htobe32(F_FW_WR_EQUIQ |
>  				    F_FW_WR_EQUEQ);
> -				eq->equeqidx = pidx;
> -			} else if (IDXDIFF(eq->pidx, eq->equeqidx, eq->sidx) >= 32) {
> -				dst->equiq_to_len16 |= htobe32(F_FW_WR_EQUEQ);
> -				eq->equeqidx = pidx;
>  			}
>  
>  			ring_eq_db(wrq->adapter, eq, ndesc);
> @@ -3584,6 +3586,23 @@ free_nm_txq(struct vi_info *vi, struct sge_nm_txq *nm_
>  }
>  #endif
>  
> +/*
> + * Returns a reasonable automatic cidx flush threshold for a given queue size.
> + */
> +static u_int
> +qsize_to_fthresh(int qsize)
> +{
> +	u_int fthresh;
> +
> +	while (!powerof2(qsize))
> +		qsize++;
> +	fthresh = ilog2(qsize);
> +	if (fthresh > X_CIDXFLUSHTHRESH_128)
> +		fthresh = X_CIDXFLUSHTHRESH_128;
> +
> +	return (fthresh);
> +}
> +
>  static int
>  ctrl_eq_alloc(struct adapter *sc, struct sge_eq *eq)
>  {
> @@ -3607,7 +3626,7 @@ ctrl_eq_alloc(struct adapter *sc, struct sge_eq *eq)
>  	c.dcaen_to_eqsize =
>  	    htobe32(V_FW_EQ_CTRL_CMD_FBMIN(X_FETCHBURSTMIN_64B) |
>  		V_FW_EQ_CTRL_CMD_FBMAX(X_FETCHBURSTMAX_512B) |
> -		V_FW_EQ_CTRL_CMD_CIDXFTHRESH(X_CIDXFLUSHTHRESH_32) |
> +		V_FW_EQ_CTRL_CMD_CIDXFTHRESH(qsize_to_fthresh(qsize)) |
>  		V_FW_EQ_CTRL_CMD_EQSIZE(qsize));
>  	c.eqaddr = htobe64(eq->ba);
>  
> @@ -3689,12 +3708,13 @@ ofld_eq_alloc(struct adapter *sc, struct vi_info *vi, 
>  	c.alloc_to_len16 = htonl(F_FW_EQ_OFLD_CMD_ALLOC |
>  	    F_FW_EQ_OFLD_CMD_EQSTART | FW_LEN16(c));
>  	c.fetchszm_to_iqid =
> -		htonl(V_FW_EQ_OFLD_CMD_HOSTFCMODE(X_HOSTFCMODE_NONE) |
> +		htonl(V_FW_EQ_OFLD_CMD_HOSTFCMODE(X_HOSTFCMODE_STATUS_PAGE) |
>  		    V_FW_EQ_OFLD_CMD_PCIECHN(eq->tx_chan) |
>  		    F_FW_EQ_OFLD_CMD_FETCHRO | V_FW_EQ_OFLD_CMD_IQID(eq->iqid));
>  	c.dcaen_to_eqsize =
>  	    htobe32(V_FW_EQ_OFLD_CMD_FBMIN(X_FETCHBURSTMIN_64B) |
>  		V_FW_EQ_OFLD_CMD_FBMAX(X_FETCHBURSTMAX_512B) |
> +		V_FW_EQ_OFLD_CMD_CIDXFTHRESH(qsize_to_fthresh(qsize)) |
>  		V_FW_EQ_OFLD_CMD_EQSIZE(qsize));
>  	c.eqaddr = htobe64(eq->ba);
>  
> @@ -3732,8 +3752,9 @@ alloc_eq(struct adapter *sc, struct vi_info *vi, struc
>  	if (rc)
>  		return (rc);
>  
> -	eq->pidx = eq->cidx = 0;
> -	eq->equeqidx = eq->dbidx = 0;
> +	eq->pidx = eq->cidx = eq->dbidx = 0;
> +	/* Note that equeqidx is not used with sge_wrq (OFLD/CTRL) queues. */
> +	eq->equeqidx = 0;
>  	eq->doorbells = sc->doorbells;
>  
>  	switch (eq->flags & EQ_TYPEMASK) {
> 
> 

-- 
Rod Grimes                                                 rgrimes at freebsd.org


More information about the svn-src-head mailing list