Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1532393 > unrolled thread
| Started by | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> |
|---|---|
| First post | 2016-11-29 16:10 +0100 |
| Last post | 2016-12-06 14:40 +0100 |
| Articles | 7 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH 0/5] cpsw: add per channel shaper configuration Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> - 2016-11-29 16:10 +0100
[PATCH 1/5] net: ethernet: ti: davinci_cpdma: add weight function for channels Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> - 2016-11-29 16:10 +0100
[PATCH 3/5] net: ethernet: ti: cpsw: add .ndo to set per-queue rate Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> - 2016-11-29 16:10 +0100
Re: [PATCH 0/5] cpsw: add per channel shaper configuration David Miller <davem@davemloft.net> - 2016-11-30 20:40 +0100
Re: [PATCH 0/5] cpsw: add per channel shaper configuration Grygorii Strashko <grygorii.strashko@ti.com> - 2016-12-05 21:40 +0100
Re: [PATCH 0/5] cpsw: add per channel shaper configuration Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> - 2016-12-05 22:00 +0100
Re: [PATCH 0/5] cpsw: add per channel shaper configuration Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> - 2016-12-06 14:40 +0100
| From | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> |
|---|---|
| Date | 2016-11-29 16:10 +0100 |
| Subject | [PATCH 0/5] cpsw: add per channel shaper configuration |
| Message-ID | <sIScG-1DN-25@gated-at.bofh.it> |
This series is intended to allow user to set rate for per channel shapers at cpdma level. This patchset doesn't have impact on performance. The rate can be set with: echo 100 > /sys/class/net/ethX/queues/tx-0/tx_maxrate Tested on am572xx Based on net-next/master Ivan Khoronzhuk (5): net: ethernet: ti: davinci_cpdma: add weight function for channels net: ethernet: ti: davinci_cpdma: add set rate for a channel net: ethernet: ti: cpsw: add .ndo to set per-queue rate net: ethernet: ti: cpsw: optimize end of poll cycle net: ethernet: ti: cpsw: split tx budget according between channels drivers/net/ethernet/ti/cpsw.c | 264 +++++++++++++++---- drivers/net/ethernet/ti/davinci_cpdma.c | 453 ++++++++++++++++++++++++++++---- drivers/net/ethernet/ti/davinci_cpdma.h | 6 + 3 files changed, 624 insertions(+), 99 deletions(-) -- 2.7.4
[toc] | [next] | [standalone]
| From | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> |
|---|---|
| Date | 2016-11-29 16:10 +0100 |
| Subject | [PATCH 1/5] net: ethernet: ti: davinci_cpdma: add weight function for channels |
| Message-ID | <sIScH-1DN-51@gated-at.bofh.it> |
| In reply to | #1532393 |
The weight of a channel is needed to split descriptors between
channels. The weight can depend on maximum rate of channels, maximum
rate of an interface or other reasons. The channel weight is in
percentage and is independent for rx and tx channels.
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
---
drivers/net/ethernet/ti/davinci_cpdma.c | 124 +++++++++++++++++++++++++++++---
drivers/net/ethernet/ti/davinci_cpdma.h | 1 +
2 files changed, 115 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c
index 56708a7..87456a9 100644
--- a/drivers/net/ethernet/ti/davinci_cpdma.c
+++ b/drivers/net/ethernet/ti/davinci_cpdma.c
@@ -122,6 +122,7 @@ struct cpdma_chan {
struct cpdma_chan_stats stats;
/* offsets into dmaregs */
int int_set, int_clear, td;
+ int weight;
};
struct cpdma_control_info {
@@ -474,29 +475,131 @@ u32 cpdma_ctrl_txchs_state(struct cpdma_ctlr *ctlr)
}
EXPORT_SYMBOL_GPL(cpdma_ctrl_txchs_state);
+static void cpdma_chan_set_descs(struct cpdma_ctlr *ctlr,
+ int rx, int desc_num,
+ int per_ch_desc)
+{
+ struct cpdma_chan *chan, *most_chan = NULL;
+ int desc_cnt = desc_num;
+ int most_dnum = 0;
+ int min, max, i;
+
+ if (!desc_num)
+ return;
+
+ if (rx) {
+ min = rx_chan_num(0);
+ max = rx_chan_num(CPDMA_MAX_CHANNELS);
+ } else {
+ min = tx_chan_num(0);
+ max = tx_chan_num(CPDMA_MAX_CHANNELS);
+ }
+
+ for (i = min; i < max; i++) {
+ chan = ctlr->channels[i];
+ if (!chan)
+ continue;
+
+ if (chan->weight)
+ chan->desc_num = (chan->weight * desc_num) / 100;
+ else
+ chan->desc_num = per_ch_desc;
+
+ desc_cnt -= chan->desc_num;
+
+ if (most_dnum < chan->desc_num) {
+ most_dnum = chan->desc_num;
+ most_chan = chan;
+ }
+ }
+ /* use remains */
+ most_chan->desc_num += desc_cnt;
+}
+
/**
* cpdma_chan_split_pool - Splits ctrl pool between all channels.
* Has to be called under ctlr lock
*/
-static void cpdma_chan_split_pool(struct cpdma_ctlr *ctlr)
+static int cpdma_chan_split_pool(struct cpdma_ctlr *ctlr)
{
+ int tx_per_ch_desc = 0, rx_per_ch_desc = 0;
struct cpdma_desc_pool *pool = ctlr->pool;
+ int free_rx_num = 0, free_tx_num = 0;
+ int rx_weight = 0, tx_weight = 0;
+ int tx_desc_num, rx_desc_num;
struct cpdma_chan *chan;
- int ch_desc_num;
- int i;
+ int i, tx_num = 0;
if (!ctlr->chan_num)
- return;
-
- /* calculate average size of pool slice */
- ch_desc_num = pool->num_desc / ctlr->chan_num;
+ return 0;
- /* split ctlr pool */
for (i = 0; i < ARRAY_SIZE(ctlr->channels); i++) {
chan = ctlr->channels[i];
- if (chan)
- chan->desc_num = ch_desc_num;
+ if (!chan)
+ continue;
+
+ if (is_rx_chan(chan)) {
+ if (!chan->weight)
+ free_rx_num++;
+ rx_weight += chan->weight;
+ } else {
+ if (!chan->weight)
+ free_tx_num++;
+ tx_weight += chan->weight;
+ tx_num++;
+ }
+ }
+
+ if (rx_weight > 100 || tx_weight > 100)
+ return -EINVAL;
+
+ tx_desc_num = (tx_num * pool->num_desc) / ctlr->chan_num;
+ rx_desc_num = pool->num_desc - tx_desc_num;
+
+ if (free_tx_num) {
+ tx_per_ch_desc = tx_desc_num - (tx_weight * tx_desc_num) / 100;
+ tx_per_ch_desc /= free_tx_num;
+ }
+ if (free_rx_num) {
+ rx_per_ch_desc = rx_desc_num - (rx_weight * rx_desc_num) / 100;
+ rx_per_ch_desc /= free_rx_num;
}
+
+ cpdma_chan_set_descs(ctlr, 0, tx_desc_num, tx_per_ch_desc);
+ cpdma_chan_set_descs(ctlr, 1, rx_desc_num, rx_per_ch_desc);
+
+ return 0;
+}
+
+/* cpdma_chan_set_weight - set weight of a channel in percentage.
+ * Tx and Rx channels have separate weights. That is 100% for RX
+ * and 100% for Tx. The weight is used to split cpdma resources
+ * in correct proportion required by the channels, including number
+ * of descriptors. The channel rate is not enough to know the
+ * weight of a channel as the maximum rate of an interface is needed.
+ * If weight = 0, then channel uses rest of descriptors leaved by
+ * weighted channels.
+ */
+int cpdma_chan_set_weight(struct cpdma_chan *ch, int weight)
+{
+ struct cpdma_ctlr *ctlr = ch->ctlr;
+ unsigned long flags, ch_flags;
+ int ret;
+
+ spin_lock_irqsave(&ctlr->lock, flags);
+ spin_lock_irqsave(&ch->lock, ch_flags);
+ if (ch->weight == weight) {
+ spin_unlock_irqrestore(&ch->lock, ch_flags);
+ spin_unlock_irqrestore(&ctlr->lock, flags);
+ return 0;
+ }
+ ch->weight = weight;
+ spin_unlock_irqrestore(&ch->lock, ch_flags);
+
+ /* re-split pool using new channel weight */
+ ret = cpdma_chan_split_pool(ctlr);
+ spin_unlock_irqrestore(&ctlr->lock, flags);
+ return ret;
}
struct cpdma_chan *cpdma_chan_create(struct cpdma_ctlr *ctlr, int chan_num,
@@ -527,6 +630,7 @@ struct cpdma_chan *cpdma_chan_create(struct cpdma_ctlr *ctlr, int chan_num,
chan->chan_num = chan_num;
chan->handler = handler;
chan->desc_num = ctlr->pool->num_desc / 2;
+ chan->weight = 0;
if (is_rx_chan(chan)) {
chan->hdp = ctlr->params.rxhdp + offset;
diff --git a/drivers/net/ethernet/ti/davinci_cpdma.h b/drivers/net/ethernet/ti/davinci_cpdma.h
index a07b22b..629020c 100644
--- a/drivers/net/ethernet/ti/davinci_cpdma.h
+++ b/drivers/net/ethernet/ti/davinci_cpdma.h
@@ -90,6 +90,7 @@ int cpdma_chan_int_ctrl(struct cpdma_chan *chan, bool enable);
u32 cpdma_ctrl_rxchs_state(struct cpdma_ctlr *ctlr);
u32 cpdma_ctrl_txchs_state(struct cpdma_ctlr *ctlr);
bool cpdma_check_free_tx_desc(struct cpdma_chan *chan);
+int cpdma_chan_set_weight(struct cpdma_chan *ch, int weight);
enum cpdma_control {
CPDMA_CMD_IDLE, /* write-only */
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> |
|---|---|
| Date | 2016-11-29 16:10 +0100 |
| Subject | [PATCH 3/5] net: ethernet: ti: cpsw: add .ndo to set per-queue rate |
| Message-ID | <sIScH-1DN-59@gated-at.bofh.it> |
| In reply to | #1532393 |
This patch allows to rate limit queues tx queues for cpsw interface.
The rate is set in absolute Mb/s units and cannot be more a speed
an interface is connected with.
The rate for a tx queue can be tested with:
ethtool -L eth0 rx 4 tx 4
echo 100 > /sys/class/net/eth0/queues/tx-0/tx_maxrate
echo 200 > /sys/class/net/eth0/queues/tx-1/tx_maxrate
echo 50 > /sys/class/net/eth0/queues/tx-2/tx_maxrate
echo 30 > /sys/class/net/eth0/queues/tx-3/tx_maxrate
tc qdisc add dev eth0 root handle 1: multiq
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip\
dport 5001 0xffff action skbedit queue_mapping 0
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip\
dport 5002 0xffff action skbedit queue_mapping 1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip\
dport 5003 0xffff action skbedit queue_mapping 2
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip\
dport 5004 0xffff action skbedit queue_mapping 3
iperf -c 192.168.2.1 -b 110M -p 5001 -f m -t 60
iperf -c 192.168.2.1 -b 215M -p 5002 -f m -t 60
iperf -c 192.168.2.1 -b 55M -p 5003 -f m -t 60
iperf -c 192.168.2.1 -b 32M -p 5004 -f m -t 60
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
---
drivers/net/ethernet/ti/cpsw.c | 87 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 87 insertions(+)
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index da40ea5..c102675 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -1872,6 +1872,88 @@ static int cpsw_ndo_vlan_rx_kill_vid(struct net_device *ndev,
return ret;
}
+static int cpsw_ndo_set_tx_maxrate(struct net_device *ndev, int queue, u32 rate)
+{
+ struct cpsw_priv *priv = netdev_priv(ndev);
+ int tx_ch_num = ndev->real_num_tx_queues;
+ u32 consumed_rate, min_rate, max_rate;
+ struct cpsw_common *cpsw = priv->cpsw;
+ struct cpsw_slave *slave;
+ int ret, i, weight;
+ int rlim_num = 0;
+ u32 ch_rate;
+
+ ch_rate = netdev_get_tx_queue(ndev, queue)->tx_maxrate;
+ if (ch_rate == rate)
+ return 0;
+
+ if (cpsw->data.dual_emac)
+ slave = &cpsw->slaves[priv->emac_port];
+ else
+ slave = &cpsw->slaves[cpsw->data.active_slave];
+ max_rate = slave->phy->speed;
+
+ consumed_rate = 0;
+ for (i = 0; i < tx_ch_num; i++) {
+ if (i == queue)
+ ch_rate = rate;
+ else
+ ch_rate = netdev_get_tx_queue(ndev, i)->tx_maxrate;
+
+ if (!ch_rate)
+ continue;
+
+ rlim_num++;
+ consumed_rate += ch_rate;
+ }
+
+ if (consumed_rate > max_rate)
+ dev_info(priv->dev, "The common rate shouldn't be more than %dMbps",
+ max_rate);
+
+ if (consumed_rate > max_rate) {
+ if (max_rate == 10 && consumed_rate <= 100) {
+ max_rate = 100;
+ } else if (max_rate <= 100 && consumed_rate <= 1000) {
+ max_rate = 1000;
+ } else {
+ dev_err(priv->dev, "The common rate cannot be more than %dMbps",
+ max_rate);
+ return -EINVAL;
+ }
+ }
+
+ if (consumed_rate > max_rate) {
+ dev_err(priv->dev, "The common rate cannot be more than %dMbps",
+ max_rate);
+ return -EINVAL;
+ }
+
+ rate *= 1000;
+ min_rate = cpdma_chan_get_min_rate(cpsw->dma);
+ if ((rate < min_rate && rate)) {
+ dev_err(priv->dev, "The common rate cannot be less than %dMbps",
+ min_rate);
+ return -EINVAL;
+ }
+
+ ret = pm_runtime_get_sync(cpsw->dev);
+ if (ret < 0) {
+ pm_runtime_put_noidle(cpsw->dev);
+ return ret;
+ }
+
+ if (rlim_num == tx_ch_num)
+ max_rate = consumed_rate;
+
+ weight = (rate * 100) / (max_rate * 1000);
+ cpdma_chan_set_weight(cpsw->txch[queue], weight);
+
+ ret = cpdma_chan_set_rate(cpsw->txch[queue], rate);
+ pm_runtime_put(cpsw->dev);
+ return ret;
+}
+
static const struct net_device_ops cpsw_netdev_ops = {
.ndo_open = cpsw_ndo_open,
.ndo_stop = cpsw_ndo_stop,
@@ -1881,6 +1963,7 @@ static const struct net_device_ops cpsw_netdev_ops = {
.ndo_validate_addr = eth_validate_addr,
.ndo_tx_timeout = cpsw_ndo_tx_timeout,
.ndo_set_rx_mode = cpsw_ndo_set_rx_mode,
+ .ndo_set_tx_maxrate = cpsw_ndo_set_tx_maxrate,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = cpsw_ndo_poll_controller,
#endif
@@ -2100,6 +2183,7 @@ static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx)
int (*poll)(struct napi_struct *, int);
struct cpsw_common *cpsw = priv->cpsw;
void (*handler)(void *, int, int);
+ struct netdev_queue *queue;
struct cpdma_chan **chan;
int ret, *ch;
@@ -2117,6 +2201,8 @@ static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx)
while (*ch < ch_num) {
chan[*ch] = cpdma_chan_create(cpsw->dma, *ch, handler, rx);
+ queue = netdev_get_tx_queue(priv->ndev, *ch);
+ queue->tx_maxrate = 0;
if (IS_ERR(chan[*ch]))
return PTR_ERR(chan[*ch]);
@@ -2752,6 +2838,7 @@ static int cpsw_probe(struct platform_device *pdev)
dma_params.desc_align = 16;
dma_params.has_ext_regs = true;
dma_params.desc_hw_addr = dma_params.desc_mem_phys;
+ dma_params.bus_freq_mhz = cpsw->bus_freq_mhz;
cpsw->dma = cpdma_ctlr_create(&dma_params);
if (!cpsw->dma) {
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | David Miller <davem@davemloft.net> |
|---|---|
| Date | 2016-11-30 20:40 +0100 |
| Message-ID | <sJiTw-1Nf-33@gated-at.bofh.it> |
| In reply to | #1532393 |
From: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> Date: Tue, 29 Nov 2016 17:00:46 +0200 > This series is intended to allow user to set rate for per channel > shapers at cpdma level. This patchset doesn't have impact on performance. > The rate can be set with: > > echo 100 > /sys/class/net/ethX/queues/tx-0/tx_maxrate > > Tested on am572xx > Based on net-next/master Series applied, thanks.
[toc] | [prev] | [next] | [standalone]
| From | Grygorii Strashko <grygorii.strashko@ti.com> |
|---|---|
| Date | 2016-12-05 21:40 +0100 |
| Message-ID | <sL8dj-QU-25@gated-at.bofh.it> |
| In reply to | #1532393 |
Hi Ivan, On 11/29/2016 09:00 AM, Ivan Khoronzhuk wrote: > This series is intended to allow user to set rate for per channel > shapers at cpdma level. This patchset doesn't have impact on performance. > The rate can be set with: > > echo 100 > /sys/class/net/ethX/queues/tx-0/tx_maxrate > > Tested on am572xx > Based on net-next/master > > Ivan Khoronzhuk (5): > net: ethernet: ti: davinci_cpdma: add weight function for channels > net: ethernet: ti: davinci_cpdma: add set rate for a channel > net: ethernet: ti: cpsw: add .ndo to set per-queue rate > net: ethernet: ti: cpsw: optimize end of poll cycle > net: ethernet: ti: cpsw: split tx budget according between channels > > drivers/net/ethernet/ti/cpsw.c | 264 +++++++++++++++---- > drivers/net/ethernet/ti/davinci_cpdma.c | 453 ++++++++++++++++++++++++++++---- > drivers/net/ethernet/ti/davinci_cpdma.h | 6 + > 3 files changed, 624 insertions(+), 99 deletions(-) > I've just tried net-next on BBB and got below back-trace: INIT: Entering runlevel: 5 Configuring network interfaces... [ 15.018356] net eth0: initializing cpsw version 1.12 (0) [ 15.120153] SMSC LAN8710/LAN8720 4a101000.mdio:00: attached PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=4a101000.mdio:00, irq=-1) [ 15.138578] Division by zero in kernel. [ 15.142667] CPU: 0 PID: 755 Comm: ifconfig Not tainted 4.9.0-rc7-01617-g6ea3f00 #5 [ 15.150277] Hardware name: Generic AM33XX (Flattened Device Tree) [ 15.156399] Backtrace: [ 15.158898] [<c010bbf8>] (dump_backtrace) from [<c010beb4>] (show_stack+0x18/0x1c) [ 15.166508] r7:00000000 r6:600f0013 r5:00000000 r4:c0d395d0 [ 15.172200] [<c010be9c>] (show_stack) from [<c03ce6cc>] (dump_stack+0x8c/0xa0) [ 15.179460] [<c03ce640>] (dump_stack) from [<c010bd60>] (__div0+0x1c/0x20) [ 15.186368] r7:00000000 r6:ddf1c010 r5:00000001 r4:00000001 [ 15.192068] [<c010bd44>] (__div0) from [<c03cd17c>] (Ldiv0+0x8/0x14) [ 15.198503] [<bf07ba38>] (cpsw_split_budget [ti_cpsw]) from [<bf07ee8c>] (cpsw_ndo_open+0x4b8/0x5e4 [ti_cpsw]) [ 15.208554] r10:ddf1c010 r9:00000000 r8:00000000 r7:ddf1c010 r6:dcc88000 r5:dcc88500 [ 15.216418] r4:ddf1c0b0 [ 15.218985] [<bf07e9d4>] (cpsw_ndo_open [ti_cpsw]) from [<c0731c68>] (__dev_open+0xb0/0x114) [ 15.227466] r10:00000000 r9:00000000 r8:00000000 r7:dcc88030 r6:bf080364 r5:00000000 [ 15.235330] r4:dcc88000 [ 15.237880] [<c0731bb8>] (__dev_open) from [<c0731f24>] (__dev_change_flags+0x9c/0x14c) [ 15.245923] r7:00001002 r6:00000001 r5:00001043 r4:dcc88000 [ 15.251613] [<c0731e88>] (__dev_change_flags) from [<c0731ff4>] (dev_change_flags+0x20/0x50) [ 15.260093] r9:00000000 r8:00000000 r7:dcbabf0c r6:00001002 r5:dcc8813c r4:dcc88000 [ 15.267886] [<c0731fd4>] (dev_change_flags) from [<c07a3168>] (devinet_ioctl+0x6d4/0x794) [ 15.276105] r9:00000000 r8:bee8cc64 r7:dcbabf0c r6:00000000 r5:dc921e80 r4:00000000 [ 15.283891] [<c07a2a94>] (devinet_ioctl) from [<c07a54bc>] (inet_ioctl+0x19c/0x1c8) [ 15.291587] r10:00000000 r9:dc920000 r8:bee8cc64 r7:c0d64bc0 r6:bee8cc64 r5:dd2728e0 [ 15.299450] r4:00008914 [ 15.302002] [<c07a5320>] (inet_ioctl) from [<c07112dc>] (sock_ioctl+0x14c/0x300) [ 15.309443] [<c0711190>] (sock_ioctl) from [<c0241868>] (do_vfs_ioctl+0xa8/0x98c) [ 15.316962] r7:00000003 r6:ddf0a780 r5:dd2728e0 r4:bee8cc64 [ 15.322653] [<c02417c0>] (do_vfs_ioctl) from [<c0242188>] (SyS_ioctl+0x3c/0x64) [ 15.330000] r10:00000000 r9:dc920000 r8:bee8cc64 r7:00008914 r6:ddf0a780 r5:00000003 [ 15.337864] r4:ddf0a780 [ 15.340416] [<c024214c>] (SyS_ioctl) from [<c0107d60>] (ret_fast_syscall+0x0/0x3c) [ 15.348024] r9:dc920000 r8:c0107f24 r7:00000036 r6:bee8cf4d r5:bee8ce4c r4:000949f0 [ 15.361174] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready udhcpc (v1.23.1) started -- regards, -grygorii
[toc] | [prev] | [next] | [standalone]
| From | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> |
|---|---|
| Date | 2016-12-05 22:00 +0100 |
| Message-ID | <sL8wF-Xr-1@gated-at.bofh.it> |
| In reply to | #1536400 |
On Mon, Dec 05, 2016 at 02:33:40PM -0600, Grygorii Strashko wrote: > Hi Ivan, > > On 11/29/2016 09:00 AM, Ivan Khoronzhuk wrote: > > This series is intended to allow user to set rate for per channel > > shapers at cpdma level. This patchset doesn't have impact on performance. > > The rate can be set with: > > > > echo 100 > /sys/class/net/ethX/queues/tx-0/tx_maxrate > > > > Tested on am572xx > > Based on net-next/master > > > > Ivan Khoronzhuk (5): > > net: ethernet: ti: davinci_cpdma: add weight function for channels > > net: ethernet: ti: davinci_cpdma: add set rate for a channel > > net: ethernet: ti: cpsw: add .ndo to set per-queue rate > > net: ethernet: ti: cpsw: optimize end of poll cycle > > net: ethernet: ti: cpsw: split tx budget according between channels > > > > drivers/net/ethernet/ti/cpsw.c | 264 +++++++++++++++---- > > drivers/net/ethernet/ti/davinci_cpdma.c | 453 ++++++++++++++++++++++++++++---- > > drivers/net/ethernet/ti/davinci_cpdma.h | 6 + > > 3 files changed, 624 insertions(+), 99 deletions(-) > > > > > I've just tried net-next on BBB and got below back-trace: I'd not tested on BBB, and expected some review before apply. Seems that's because of phy speed, let me finish a fix patch. Thanks. > INIT: Entering runlevel: 5 > Configuring network interfaces... [ 15.018356] net eth0: initializing cpsw version 1.12 (0) > [ 15.120153] SMSC LAN8710/LAN8720 4a101000.mdio:00: attached PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=4a101000.mdio:00, irq=-1) > [ 15.138578] Division by zero in kernel. > [ 15.142667] CPU: 0 PID: 755 Comm: ifconfig Not tainted 4.9.0-rc7-01617-g6ea3f00 #5 > [ 15.150277] Hardware name: Generic AM33XX (Flattened Device Tree) > [ 15.156399] Backtrace: > [ 15.158898] [<c010bbf8>] (dump_backtrace) from [<c010beb4>] (show_stack+0x18/0x1c) > [ 15.166508] r7:00000000 r6:600f0013 r5:00000000 r4:c0d395d0 > [ 15.172200] [<c010be9c>] (show_stack) from [<c03ce6cc>] (dump_stack+0x8c/0xa0) > [ 15.179460] [<c03ce640>] (dump_stack) from [<c010bd60>] (__div0+0x1c/0x20) > [ 15.186368] r7:00000000 r6:ddf1c010 r5:00000001 r4:00000001 > [ 15.192068] [<c010bd44>] (__div0) from [<c03cd17c>] (Ldiv0+0x8/0x14) > [ 15.198503] [<bf07ba38>] (cpsw_split_budget [ti_cpsw]) from [<bf07ee8c>] (cpsw_ndo_open+0x4b8/0x5e4 [ti_cpsw]) > [ 15.208554] r10:ddf1c010 r9:00000000 r8:00000000 r7:ddf1c010 r6:dcc88000 r5:dcc88500 > [ 15.216418] r4:ddf1c0b0 > [ 15.218985] [<bf07e9d4>] (cpsw_ndo_open [ti_cpsw]) from [<c0731c68>] (__dev_open+0xb0/0x114) > [ 15.227466] r10:00000000 r9:00000000 r8:00000000 r7:dcc88030 r6:bf080364 r5:00000000 > [ 15.235330] r4:dcc88000 > [ 15.237880] [<c0731bb8>] (__dev_open) from [<c0731f24>] (__dev_change_flags+0x9c/0x14c) > [ 15.245923] r7:00001002 r6:00000001 r5:00001043 r4:dcc88000 > [ 15.251613] [<c0731e88>] (__dev_change_flags) from [<c0731ff4>] (dev_change_flags+0x20/0x50) > [ 15.260093] r9:00000000 r8:00000000 r7:dcbabf0c r6:00001002 r5:dcc8813c r4:dcc88000 > [ 15.267886] [<c0731fd4>] (dev_change_flags) from [<c07a3168>] (devinet_ioctl+0x6d4/0x794) > [ 15.276105] r9:00000000 r8:bee8cc64 r7:dcbabf0c r6:00000000 r5:dc921e80 r4:00000000 > [ 15.283891] [<c07a2a94>] (devinet_ioctl) from [<c07a54bc>] (inet_ioctl+0x19c/0x1c8) > [ 15.291587] r10:00000000 r9:dc920000 r8:bee8cc64 r7:c0d64bc0 r6:bee8cc64 r5:dd2728e0 > [ 15.299450] r4:00008914 > [ 15.302002] [<c07a5320>] (inet_ioctl) from [<c07112dc>] (sock_ioctl+0x14c/0x300) > [ 15.309443] [<c0711190>] (sock_ioctl) from [<c0241868>] (do_vfs_ioctl+0xa8/0x98c) > [ 15.316962] r7:00000003 r6:ddf0a780 r5:dd2728e0 r4:bee8cc64 > [ 15.322653] [<c02417c0>] (do_vfs_ioctl) from [<c0242188>] (SyS_ioctl+0x3c/0x64) > [ 15.330000] r10:00000000 r9:dc920000 r8:bee8cc64 r7:00008914 r6:ddf0a780 r5:00000003 > [ 15.337864] r4:ddf0a780 > [ 15.340416] [<c024214c>] (SyS_ioctl) from [<c0107d60>] (ret_fast_syscall+0x0/0x3c) > [ 15.348024] r9:dc920000 r8:c0107f24 r7:00000036 r6:bee8cf4d r5:bee8ce4c r4:000949f0 > [ 15.361174] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready > udhcpc (v1.23.1) started > > > -- > regards, > -grygorii
[toc] | [prev] | [next] | [standalone]
| From | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> |
|---|---|
| Date | 2016-12-06 14:40 +0100 |
| Message-ID | <sLo8q-2Cu-37@gated-at.bofh.it> |
| In reply to | #1536400 |
On Mon, Dec 05, 2016 at 02:33:40PM -0600, Grygorii Strashko wrote: > Hi Ivan, Hi, Grygorii I've sent patch that fixes issue in question. https://lkml.org/lkml/2016/12/5/811 Could you please review it. Also I'm preparing several patches to sophisticate cases with unexpected speed value. > > On 11/29/2016 09:00 AM, Ivan Khoronzhuk wrote: > > This series is intended to allow user to set rate for per channel > > shapers at cpdma level. This patchset doesn't have impact on performance. > > The rate can be set with: > > > > echo 100 > /sys/class/net/ethX/queues/tx-0/tx_maxrate > > > > Tested on am572xx > > Based on net-next/master > > > > Ivan Khoronzhuk (5): > > net: ethernet: ti: davinci_cpdma: add weight function for channels > > net: ethernet: ti: davinci_cpdma: add set rate for a channel > > net: ethernet: ti: cpsw: add .ndo to set per-queue rate > > net: ethernet: ti: cpsw: optimize end of poll cycle > > net: ethernet: ti: cpsw: split tx budget according between channels > > > > drivers/net/ethernet/ti/cpsw.c | 264 +++++++++++++++---- > > drivers/net/ethernet/ti/davinci_cpdma.c | 453 ++++++++++++++++++++++++++++---- > > drivers/net/ethernet/ti/davinci_cpdma.h | 6 + > > 3 files changed, 624 insertions(+), 99 deletions(-) > > > > > I've just tried net-next on BBB and got below back-trace: > INIT: Entering runlevel: 5 > Configuring network interfaces... [ 15.018356] net eth0: initializing cpsw version 1.12 (0) > [ 15.120153] SMSC LAN8710/LAN8720 4a101000.mdio:00: attached PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=4a101000.mdio:00, irq=-1) > [ 15.138578] Division by zero in kernel. > [ 15.142667] CPU: 0 PID: 755 Comm: ifconfig Not tainted 4.9.0-rc7-01617-g6ea3f00 #5 > [ 15.150277] Hardware name: Generic AM33XX (Flattened Device Tree) > [ 15.156399] Backtrace: > [ 15.158898] [<c010bbf8>] (dump_backtrace) from [<c010beb4>] (show_stack+0x18/0x1c) > [ 15.166508] r7:00000000 r6:600f0013 r5:00000000 r4:c0d395d0 > [ 15.172200] [<c010be9c>] (show_stack) from [<c03ce6cc>] (dump_stack+0x8c/0xa0) > [ 15.179460] [<c03ce640>] (dump_stack) from [<c010bd60>] (__div0+0x1c/0x20) > [ 15.186368] r7:00000000 r6:ddf1c010 r5:00000001 r4:00000001 > [ 15.192068] [<c010bd44>] (__div0) from [<c03cd17c>] (Ldiv0+0x8/0x14) > [ 15.198503] [<bf07ba38>] (cpsw_split_budget [ti_cpsw]) from [<bf07ee8c>] (cpsw_ndo_open+0x4b8/0x5e4 [ti_cpsw]) > [ 15.208554] r10:ddf1c010 r9:00000000 r8:00000000 r7:ddf1c010 r6:dcc88000 r5:dcc88500 > [ 15.216418] r4:ddf1c0b0 > [ 15.218985] [<bf07e9d4>] (cpsw_ndo_open [ti_cpsw]) from [<c0731c68>] (__dev_open+0xb0/0x114) > [ 15.227466] r10:00000000 r9:00000000 r8:00000000 r7:dcc88030 r6:bf080364 r5:00000000 > [ 15.235330] r4:dcc88000 > [ 15.237880] [<c0731bb8>] (__dev_open) from [<c0731f24>] (__dev_change_flags+0x9c/0x14c) > [ 15.245923] r7:00001002 r6:00000001 r5:00001043 r4:dcc88000 > [ 15.251613] [<c0731e88>] (__dev_change_flags) from [<c0731ff4>] (dev_change_flags+0x20/0x50) > [ 15.260093] r9:00000000 r8:00000000 r7:dcbabf0c r6:00001002 r5:dcc8813c r4:dcc88000 > [ 15.267886] [<c0731fd4>] (dev_change_flags) from [<c07a3168>] (devinet_ioctl+0x6d4/0x794) > [ 15.276105] r9:00000000 r8:bee8cc64 r7:dcbabf0c r6:00000000 r5:dc921e80 r4:00000000 > [ 15.283891] [<c07a2a94>] (devinet_ioctl) from [<c07a54bc>] (inet_ioctl+0x19c/0x1c8) > [ 15.291587] r10:00000000 r9:dc920000 r8:bee8cc64 r7:c0d64bc0 r6:bee8cc64 r5:dd2728e0 > [ 15.299450] r4:00008914 > [ 15.302002] [<c07a5320>] (inet_ioctl) from [<c07112dc>] (sock_ioctl+0x14c/0x300) > [ 15.309443] [<c0711190>] (sock_ioctl) from [<c0241868>] (do_vfs_ioctl+0xa8/0x98c) > [ 15.316962] r7:00000003 r6:ddf0a780 r5:dd2728e0 r4:bee8cc64 > [ 15.322653] [<c02417c0>] (do_vfs_ioctl) from [<c0242188>] (SyS_ioctl+0x3c/0x64) > [ 15.330000] r10:00000000 r9:dc920000 r8:bee8cc64 r7:00008914 r6:ddf0a780 r5:00000003 > [ 15.337864] r4:ddf0a780 > [ 15.340416] [<c024214c>] (SyS_ioctl) from [<c0107d60>] (ret_fast_syscall+0x0/0x3c) > [ 15.348024] r9:dc920000 r8:c0107f24 r7:00000036 r6:bee8cf4d r5:bee8ce4c r4:000949f0 > [ 15.361174] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready > udhcpc (v1.23.1) started > > > -- > regards, > -grygorii
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web