Date: Wed, 21 Aug 2002 07:51:45 -0700 From: Luigi Rizzo <rizzo@icir.org> To: Andre Song <song@rdsk.net> Cc: freebsd-net@FreeBSD.ORG Subject: fxp performance (was Re: m_getcl and end-to-end performance) Message-ID: <20020821075145.B57063@iguana.icir.org> In-Reply-To: <3D63A3C2.26A938D4@rdsk.net>; from song@rdsk.net on Wed, Aug 21, 2002 at 10:29:22PM %2B0800 References: <15714.27671.533860.408996@grasshopper.cs.duke.edu> <20020820093939.B48541@iguana.icir.org> <15714.39494.661931.882244@grasshopper.cs.duke.edu> <20020820132957.B49141@iguana.icir.org> <15714.43504.493596.791872@grasshopper.cs.duke.edu> <20020820135736.A50369@iguana.icir.org> <3D63A3C2.26A938D4@rdsk.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Aug 21, 2002 at 10:29:22PM +0800, Andre Song wrote: > Hi, Luigi > > Do you have any plan to publish these improvments (extended and > simplified > TxCB)? I'm very interesting in them. excended TxCB are already used by the driver in -current and -stable, if they are available on the hardware (apparently old chip revisions do not support them). The "simplified TxCB" is really just a trick to look good in benchmarks, but i do not plan to commit it -- it is just ugly and in the end it does not really help much, because the hardware seems unable to reach line speed anyways (and no, i am not running out of cpu, an "em" card on the same machine can push out almost 650kpps). Anyways, the code below should do -- you can enable/disable it at runtime with sysctl hw.fxp_tx_copy=1 cheers luigi > Regards, > song > > Luigi Rizzo wrote: > > > > > which gets you close to the max throughput for the chip (not the driver!) > > used by the "fxp" driver, which is: > > > > 103kpps with standard TxCB > > 113kpps with extended TxCB > > 127kpps if you know the above problem, so do not use buffer > > descriptors and copy (small) packets into the TxCB > > > > don't ask me why, i have no docs and no idea --- if_fxp.c Sun Aug 11 11:25:43 2002 +++ if_fxp.c.fast Fri Aug 9 03:50:47 2002 @@ -97,6 +97,9 @@ * (1536 bytes), if an underrun occurs. */ static int tx_threshold = 64; +static int tx_copy; +SYSCTL_INT(_hw, OID_AUTO, fxp_tx_copy, CTLFLAG_RW, + &tx_copy, 0, "fxp copy small bufs"); /* * The configuration byte map has several undefined fields which @@ -1046,6 +1051,22 @@ * the transmit buffer descriptors with the physical address * and size of the mbuf. */ +#if 1 + /* + * if it is small, use simple mode and put everything in + * the TxCB + */ + if (tx_copy && mb_head->m_next == NULL && mb_head->m_len < 128) { + int i = sc->flags & FXP_FLAG_EXT_TXCB ? 2 : 0; + + bcopy(mtod(mb_head, char *), + (char *)&(txp->tbd[i]), mb_head->m_len); + txp->byte_count = mb_head->m_len; + segment = 0; + txp->tbd_array_addr = 0xffffffff; + goto got_it; + } +#endif tbdinit: for (m = mb_head, segment = 0; m != NULL; m = m->m_next) { if (m->m_len != 0) { @@ -1086,16 +1107,24 @@ goto tbdinit; } + if (sc->flags & FXP_FLAG_EXT_TXCB) + txp->tbd_array_addr = vtophys(&txp->tbd[2]); + else + txp->tbd_array_addr = vtophys(&txp->tbd[0]); + txp->byte_count = 0; +got_it: txp->tbd_number = segment; txp->mb_head = mb_head; txp->cb_status = 0; if (sc->tx_queued != FXP_CXINT_THRESH - 1) { txp->cb_command = - FXP_CB_COMMAND_XMIT | FXP_CB_COMMAND_SF | + FXP_CB_COMMAND_XMIT | + (segment ? FXP_CB_COMMAND_SF:0) | FXP_CB_COMMAND_S; } else { txp->cb_command = - FXP_CB_COMMAND_XMIT | FXP_CB_COMMAND_SF | + FXP_CB_COMMAND_XMIT | + (segment ? FXP_CB_COMMAND_SF:0) | FXP_CB_COMMAND_S | FXP_CB_COMMAND_I; /* * Set a 5 second timer just in case we don't hear To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020821075145.B57063>