Commit 4bccfc03 authored by Rahul Lakkireddy's avatar Rahul Lakkireddy Committed by David S. Miller

cxgb4: tune burst buffer size for TC-MQPRIO offload

For each traffic class, firmware handles up to 4 * MTU amount of data
per burst cycle. Under heavy load, this small buffer size is a
bottleneck when buffering large TSO packets in <= 1500 MTU case.
Increase the burst buffer size to 8 * MTU when supported.

Also, keep the driver's traffic class configuration API similar to
the firmware API counterpart.
Signed-off-by: default avatarRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4f1d9726
...@@ -1125,19 +1125,20 @@ struct adapter { ...@@ -1125,19 +1125,20 @@ struct adapter {
* programmed with various parameters. * programmed with various parameters.
*/ */
struct ch_sched_params { struct ch_sched_params {
s8 type; /* packet or flow */ u8 type; /* packet or flow */
union { union {
struct { struct {
s8 level; /* scheduler hierarchy level */ u8 level; /* scheduler hierarchy level */
s8 mode; /* per-class or per-flow */ u8 mode; /* per-class or per-flow */
s8 rateunit; /* bit or packet rate */ u8 rateunit; /* bit or packet rate */
s8 ratemode; /* %port relative or kbps absolute */ u8 ratemode; /* %port relative or kbps absolute */
s8 channel; /* scheduler channel [0..N] */ u8 channel; /* scheduler channel [0..N] */
s8 class; /* scheduler class [0..N] */ u8 class; /* scheduler class [0..N] */
s32 minrate; /* minimum rate */ u32 minrate; /* minimum rate */
s32 maxrate; /* maximum rate */ u32 maxrate; /* maximum rate */
s16 weight; /* percent weight */ u16 weight; /* percent weight */
s16 pktsize; /* average packet size */ u16 pktsize; /* average packet size */
u16 burstsize; /* burst buffer size */
} params; } params;
} u; } u;
}; };
...@@ -1952,9 +1953,10 @@ int t4_sge_ctxt_rd(struct adapter *adap, unsigned int mbox, unsigned int cid, ...@@ -1952,9 +1953,10 @@ int t4_sge_ctxt_rd(struct adapter *adap, unsigned int mbox, unsigned int cid,
enum ctxt_type ctype, u32 *data); enum ctxt_type ctype, u32 *data);
int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid, int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid,
enum ctxt_type ctype, u32 *data); enum ctxt_type ctype, u32 *data);
int t4_sched_params(struct adapter *adapter, int type, int level, int mode, int t4_sched_params(struct adapter *adapter, u8 type, u8 level, u8 mode,
int rateunit, int ratemode, int channel, int class, u8 rateunit, u8 ratemode, u8 channel, u8 class,
int minrate, int maxrate, int weight, int pktsize); u32 minrate, u32 maxrate, u16 weight, u16 pktsize,
u16 burstsize);
void t4_sge_decode_idma_state(struct adapter *adapter, int state); void t4_sge_decode_idma_state(struct adapter *adapter, int state);
void t4_idma_monitor_init(struct adapter *adapter, void t4_idma_monitor_init(struct adapter *adapter,
struct sge_idma_monitor_state *idma); struct sge_idma_monitor_state *idma);
......
...@@ -3021,7 +3021,7 @@ static int cxgb4_mgmt_set_vf_rate(struct net_device *dev, int vf, ...@@ -3021,7 +3021,7 @@ static int cxgb4_mgmt_set_vf_rate(struct net_device *dev, int vf,
SCHED_CLASS_RATEUNIT_BITS, SCHED_CLASS_RATEUNIT_BITS,
SCHED_CLASS_RATEMODE_ABS, SCHED_CLASS_RATEMODE_ABS,
pi->tx_chan, class_id, 0, pi->tx_chan, class_id, 0,
max_tx_rate * 1000, 0, pktsize); max_tx_rate * 1000, 0, pktsize, 0);
if (ret) { if (ret) {
dev_err(adap->pdev_dev, "Err %d for Traffic Class config\n", dev_err(adap->pdev_dev, "Err %d for Traffic Class config\n",
ret); ret);
......
...@@ -342,6 +342,13 @@ static int cxgb4_mqprio_alloc_tc(struct net_device *dev, ...@@ -342,6 +342,13 @@ static int cxgb4_mqprio_alloc_tc(struct net_device *dev,
p.u.params.minrate = div_u64(mqprio->min_rate[i] * 8, 1000); p.u.params.minrate = div_u64(mqprio->min_rate[i] * 8, 1000);
p.u.params.maxrate = div_u64(mqprio->max_rate[i] * 8, 1000); p.u.params.maxrate = div_u64(mqprio->max_rate[i] * 8, 1000);
/* Request larger burst buffer for smaller MTU, so
* that hardware can work on more data per burst
* cycle.
*/
if (dev->mtu <= ETH_DATA_LEN)
p.u.params.burstsize = 8 * dev->mtu;
e = cxgb4_sched_class_alloc(dev, &p); e = cxgb4_sched_class_alloc(dev, &p);
if (!e) { if (!e) {
ret = -ENOMEM; ret = -ENOMEM;
......
...@@ -57,7 +57,8 @@ static int t4_sched_class_fw_cmd(struct port_info *pi, ...@@ -57,7 +57,8 @@ static int t4_sched_class_fw_cmd(struct port_info *pi,
p->u.params.ratemode, p->u.params.ratemode,
p->u.params.channel, e->idx, p->u.params.channel, e->idx,
p->u.params.minrate, p->u.params.maxrate, p->u.params.minrate, p->u.params.maxrate,
p->u.params.weight, p->u.params.pktsize); p->u.params.weight, p->u.params.pktsize,
p->u.params.burstsize);
break; break;
default: default:
err = -ENOTSUPP; err = -ENOTSUPP;
......
...@@ -10361,9 +10361,10 @@ int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid, ...@@ -10361,9 +10361,10 @@ int t4_sge_ctxt_rd_bd(struct adapter *adap, unsigned int cid,
return ret; return ret;
} }
int t4_sched_params(struct adapter *adapter, int type, int level, int mode, int t4_sched_params(struct adapter *adapter, u8 type, u8 level, u8 mode,
int rateunit, int ratemode, int channel, int class, u8 rateunit, u8 ratemode, u8 channel, u8 class,
int minrate, int maxrate, int weight, int pktsize) u32 minrate, u32 maxrate, u16 weight, u16 pktsize,
u16 burstsize)
{ {
struct fw_sched_cmd cmd; struct fw_sched_cmd cmd;
...@@ -10385,6 +10386,7 @@ int t4_sched_params(struct adapter *adapter, int type, int level, int mode, ...@@ -10385,6 +10386,7 @@ int t4_sched_params(struct adapter *adapter, int type, int level, int mode,
cmd.u.params.max = cpu_to_be32(maxrate); cmd.u.params.max = cpu_to_be32(maxrate);
cmd.u.params.weight = cpu_to_be16(weight); cmd.u.params.weight = cpu_to_be16(weight);
cmd.u.params.pktsize = cpu_to_be16(pktsize); cmd.u.params.pktsize = cpu_to_be16(pktsize);
cmd.u.params.burstsize = cpu_to_be16(burstsize);
return t4_wr_mbox_meat(adapter, adapter->mbox, &cmd, sizeof(cmd), return t4_wr_mbox_meat(adapter, adapter->mbox, &cmd, sizeof(cmd),
NULL, 1); NULL, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment