mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-25 00:52:45 -04:00
ionic: dynamic interrupt moderation
Use the dim library to manage dynamic interrupt moderation in ionic. v3: rebase v2: untangled declarations in ionic_dim_work() Signed-off-by: Shannon Nelson <snelson@pensando.io> Acked-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
ddcc9b7feb
commit
04a834592b
@@ -406,6 +406,13 @@ static int ionic_get_coalesce(struct net_device *netdev,
|
||||
coalesce->tx_coalesce_usecs = lif->tx_coalesce_usecs;
|
||||
coalesce->rx_coalesce_usecs = lif->rx_coalesce_usecs;
|
||||
|
||||
if (test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state))
|
||||
coalesce->use_adaptive_tx_coalesce = test_bit(IONIC_LIF_F_TX_DIM_INTR, lif->state);
|
||||
else
|
||||
coalesce->use_adaptive_tx_coalesce = 0;
|
||||
|
||||
coalesce->use_adaptive_rx_coalesce = test_bit(IONIC_LIF_F_RX_DIM_INTR, lif->state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -414,10 +421,9 @@ static int ionic_set_coalesce(struct net_device *netdev,
|
||||
{
|
||||
struct ionic_lif *lif = netdev_priv(netdev);
|
||||
struct ionic_identity *ident;
|
||||
struct ionic_qcq *qcq;
|
||||
u32 rx_coal, rx_dim;
|
||||
u32 tx_coal, tx_dim;
|
||||
unsigned int i;
|
||||
u32 rx_coal;
|
||||
u32 tx_coal;
|
||||
|
||||
ident = &lif->ionic->ident;
|
||||
if (ident->dev.intr_coal_div == 0) {
|
||||
@@ -426,10 +432,11 @@ static int ionic_set_coalesce(struct net_device *netdev,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Tx normally shares Rx interrupt, so only change Rx */
|
||||
/* Tx normally shares Rx interrupt, so only change Rx if not split */
|
||||
if (!test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state) &&
|
||||
coalesce->tx_coalesce_usecs != lif->rx_coalesce_usecs) {
|
||||
netdev_warn(netdev, "only the rx-usecs can be changed\n");
|
||||
(coalesce->tx_coalesce_usecs != lif->rx_coalesce_usecs ||
|
||||
coalesce->use_adaptive_tx_coalesce)) {
|
||||
netdev_warn(netdev, "only rx parameters can be changed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -449,32 +456,44 @@ static int ionic_set_coalesce(struct net_device *netdev,
|
||||
|
||||
/* Save the new values */
|
||||
lif->rx_coalesce_usecs = coalesce->rx_coalesce_usecs;
|
||||
if (rx_coal != lif->rx_coalesce_hw) {
|
||||
lif->rx_coalesce_hw = rx_coal;
|
||||
|
||||
if (test_bit(IONIC_LIF_F_UP, lif->state)) {
|
||||
for (i = 0; i < lif->nxqs; i++) {
|
||||
qcq = lif->rxqcqs[i];
|
||||
ionic_intr_coal_init(lif->ionic->idev.intr_ctrl,
|
||||
qcq->intr.index,
|
||||
lif->rx_coalesce_hw);
|
||||
}
|
||||
}
|
||||
}
|
||||
lif->rx_coalesce_hw = rx_coal;
|
||||
|
||||
if (test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state))
|
||||
lif->tx_coalesce_usecs = coalesce->tx_coalesce_usecs;
|
||||
else
|
||||
lif->tx_coalesce_usecs = coalesce->rx_coalesce_usecs;
|
||||
if (tx_coal != lif->tx_coalesce_hw) {
|
||||
lif->tx_coalesce_hw = tx_coal;
|
||||
lif->tx_coalesce_hw = tx_coal;
|
||||
|
||||
if (test_bit(IONIC_LIF_F_UP, lif->state)) {
|
||||
for (i = 0; i < lif->nxqs; i++) {
|
||||
qcq = lif->txqcqs[i];
|
||||
if (coalesce->use_adaptive_rx_coalesce) {
|
||||
set_bit(IONIC_LIF_F_RX_DIM_INTR, lif->state);
|
||||
rx_dim = rx_coal;
|
||||
} else {
|
||||
clear_bit(IONIC_LIF_F_RX_DIM_INTR, lif->state);
|
||||
rx_dim = 0;
|
||||
}
|
||||
|
||||
if (coalesce->use_adaptive_tx_coalesce) {
|
||||
set_bit(IONIC_LIF_F_TX_DIM_INTR, lif->state);
|
||||
tx_dim = tx_coal;
|
||||
} else {
|
||||
clear_bit(IONIC_LIF_F_TX_DIM_INTR, lif->state);
|
||||
tx_dim = 0;
|
||||
}
|
||||
|
||||
if (test_bit(IONIC_LIF_F_UP, lif->state)) {
|
||||
for (i = 0; i < lif->nxqs; i++) {
|
||||
if (lif->rxqcqs[i]->flags & IONIC_QCQ_F_INTR) {
|
||||
ionic_intr_coal_init(lif->ionic->idev.intr_ctrl,
|
||||
qcq->intr.index,
|
||||
lif->rxqcqs[i]->intr.index,
|
||||
lif->rx_coalesce_hw);
|
||||
lif->rxqcqs[i]->intr.dim_coal_hw = rx_dim;
|
||||
}
|
||||
|
||||
if (lif->txqcqs[i]->flags & IONIC_QCQ_F_INTR) {
|
||||
ionic_intr_coal_init(lif->ionic->idev.intr_ctrl,
|
||||
lif->txqcqs[i]->intr.index,
|
||||
lif->tx_coalesce_hw);
|
||||
lif->txqcqs[i]->intr.dim_coal_hw = tx_dim;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -850,7 +869,9 @@ static int ionic_nway_reset(struct net_device *netdev)
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ionic_ethtool_ops = {
|
||||
.supported_coalesce_params = ETHTOOL_COALESCE_USECS,
|
||||
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
|
||||
ETHTOOL_COALESCE_USE_ADAPTIVE_RX |
|
||||
ETHTOOL_COALESCE_USE_ADAPTIVE_TX,
|
||||
.get_drvinfo = ionic_get_drvinfo,
|
||||
.get_regs_len = ionic_get_regs_len,
|
||||
.get_regs = ionic_get_regs,
|
||||
|
||||
Reference in New Issue
Block a user