svn commit: r197391 - head/sys/dev/mxge
Robert Watson
rwatson at FreeBSD.org
Tue Sep 22 11:22:48 UTC 2009
On Mon, 21 Sep 2009, Andrew Gallatin wrote:
> Add support for throttling transmit bandwidth. This is most commonly
> used to reduce packet loss on high delay (WAN) paths with a
> slow link.
Hi Drew--
Could you say a little more about the situations in which this is used? I see
(or think I see) that the card supports internal throttling, but is there a
reason, other than the hardware supporting it, for not to do something like
this higher in the stack before cycles are burned and PCI bus bandwidth has
been wasted?
Robert N M Watson
Computer Laboratory
University of Cambridge
>
> Modified:
> head/sys/dev/mxge/if_mxge.c
> head/sys/dev/mxge/if_mxge_var.h
>
> Modified: head/sys/dev/mxge/if_mxge.c
> ==============================================================================
> --- head/sys/dev/mxge/if_mxge.c Mon Sep 21 13:09:56 2009 (r197390)
> +++ head/sys/dev/mxge/if_mxge.c Mon Sep 21 14:41:07 2009 (r197391)
> @@ -106,6 +106,7 @@ static int mxge_max_slices = 1;
> static int mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT;
> static int mxge_always_promisc = 0;
> static int mxge_initial_mtu = ETHERMTU_JUMBO;
> +static int mxge_throttle = 0;
> static char *mxge_fw_unaligned = "mxge_ethp_z8e";
> static char *mxge_fw_aligned = "mxge_eth_z8e";
> static char *mxge_fw_rss_aligned = "mxge_rss_eth_z8e";
> @@ -596,10 +597,13 @@ static int
> mxge_select_firmware(mxge_softc_t *sc)
> {
> int aligned = 0;
> + int force_firmware = mxge_force_firmware;
>
> + if (sc->throttle)
> + force_firmware = sc->throttle;
>
> - if (mxge_force_firmware != 0) {
> - if (mxge_force_firmware == 1)
> + if (force_firmware != 0) {
> + if (force_firmware == 1)
> aligned = 1;
> else
> aligned = 0;
> @@ -1314,10 +1318,48 @@ mxge_reset(mxge_softc_t *sc, int interru
> mxge_change_promisc(sc, sc->ifp->if_flags & IFF_PROMISC);
> mxge_change_pause(sc, sc->pause);
> mxge_set_multicast_list(sc);
> + if (sc->throttle) {
> + cmd.data0 = sc->throttle;
> + if (mxge_send_cmd(sc, MXGEFW_CMD_SET_THROTTLE_FACTOR,
> + &cmd)) {
> + device_printf(sc->dev,
> + "can't enable throttle\n");
> + }
> + }
> return status;
> }
>
> static int
> +mxge_change_throttle(SYSCTL_HANDLER_ARGS)
> +{
> + mxge_cmd_t cmd;
> + mxge_softc_t *sc;
> + int err;
> + unsigned int throttle;
> +
> + sc = arg1;
> + throttle = sc->throttle;
> + err = sysctl_handle_int(oidp, &throttle, arg2, req);
> + if (err != 0) {
> + return err;
> + }
> +
> + if (throttle == sc->throttle)
> + return 0;
> +
> + if (throttle < MXGE_MIN_THROTTLE || throttle > MXGE_MAX_THROTTLE)
> + return EINVAL;
> +
> + mtx_lock(&sc->driver_mtx);
> + cmd.data0 = throttle;
> + err = mxge_send_cmd(sc, MXGEFW_CMD_SET_THROTTLE_FACTOR, &cmd);
> + if (err == 0)
> + sc->throttle = throttle;
> + mtx_unlock(&sc->driver_mtx);
> + return err;
> +}
> +
> +static int
> mxge_change_intr_coal(SYSCTL_HANDLER_ARGS)
> {
> mxge_softc_t *sc;
> @@ -1505,6 +1547,12 @@ mxge_add_sysctls(mxge_softc_t *sc)
> "I", "interrupt coalescing delay in usecs");
>
> SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
> + "throttle",
> + CTLTYPE_INT|CTLFLAG_RW, sc,
> + 0, mxge_change_throttle,
> + "I", "transmit throttling");
> +
> + SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
> "flow_control_enabled",
> CTLTYPE_INT|CTLFLAG_RW, sc,
> 0, mxge_change_flow_control,
> @@ -4016,6 +4064,7 @@ mxge_fetch_tunables(mxge_softc_t *sc)
> TUNABLE_INT_FETCH("hw.mxge.rss_hash_type", &mxge_rss_hash_type);
> TUNABLE_INT_FETCH("hw.mxge.rss_hashtype", &mxge_rss_hash_type);
> TUNABLE_INT_FETCH("hw.mxge.initial_mtu", &mxge_initial_mtu);
> + TUNABLE_INT_FETCH("hw.mxge.throttle", &mxge_throttle);
> if (sc->lro_cnt != 0)
> mxge_lro_cnt = sc->lro_cnt;
>
> @@ -4033,6 +4082,12 @@ mxge_fetch_tunables(mxge_softc_t *sc)
> if (mxge_initial_mtu > ETHERMTU_JUMBO ||
> mxge_initial_mtu < ETHER_MIN_LEN)
> mxge_initial_mtu = ETHERMTU_JUMBO;
> +
> + if (mxge_throttle && mxge_throttle > MXGE_MAX_THROTTLE)
> + mxge_throttle = MXGE_MAX_THROTTLE;
> + if (mxge_throttle && mxge_throttle < MXGE_MIN_THROTTLE)
> + mxge_throttle = MXGE_MIN_THROTTLE;
> + sc->throttle = mxge_throttle;
> }
>
>
>
> Modified: head/sys/dev/mxge/if_mxge_var.h
> ==============================================================================
> --- head/sys/dev/mxge/if_mxge_var.h Mon Sep 21 13:09:56 2009 (r197390)
> +++ head/sys/dev/mxge/if_mxge_var.h Mon Sep 21 14:41:07 2009 (r197391)
> @@ -261,6 +261,7 @@ struct mxge_softc {
> int fw_multicast_support;
> int link_width;
> int max_mtu;
> + int throttle;
> int tx_defrag;
> int media_flags;
> int need_media_probe;
> @@ -286,6 +287,8 @@ struct mxge_softc {
> #define MXGE_PCI_REV_Z8ES 1
> #define MXGE_XFP_COMPLIANCE_BYTE 131
> #define MXGE_SFP_COMPLIANCE_BYTE 3
> +#define MXGE_MIN_THROTTLE 416
> +#define MXGE_MAX_THROTTLE 4096
>
> #define MXGE_HIGHPART_TO_U32(X) \
> (sizeof (X) == 8) ? ((uint32_t)((uint64_t)(X) >> 32)) : (0)
>
More information about the svn-src-all
mailing list