Commit bf13502e authored by Michal Wilczynski's avatar Michal Wilczynski Committed by Tony Nguyen

ice: Fix interrupt moderation settings getting cleared

Adaptive-rx and Adaptive-tx are interrupt moderation settings
that can be enabled/disabled using ethtool:
ethtool -C ethX adaptive-rx on/off adaptive-tx on/off

Unfortunately those settings are getting cleared after
changing number of queues, or in ethtool world 'channels':
ethtool -L ethX rx 1 tx 1

Clearing was happening due to introduction of bit fields
in ice_ring_container struct. This way only itr_setting
bits were rebuilt during ice_vsi_rebuild_set_coalesce().

Introduce an anonymous struct of bitfields and create a
union to refer to them as a single variable.
This way variable can be easily saved and restored.

Fixes: 61dc79ce ("ice: Restore interrupt throttle settings after VSI rebuild")
Signed-off-by: default avatarMichal Wilczynski <michal.wilczynski@intel.com>
Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 31b6298f
...@@ -3043,8 +3043,8 @@ ice_vsi_rebuild_get_coalesce(struct ice_vsi *vsi, ...@@ -3043,8 +3043,8 @@ ice_vsi_rebuild_get_coalesce(struct ice_vsi *vsi,
ice_for_each_q_vector(vsi, i) { ice_for_each_q_vector(vsi, i) {
struct ice_q_vector *q_vector = vsi->q_vectors[i]; struct ice_q_vector *q_vector = vsi->q_vectors[i];
coalesce[i].itr_tx = q_vector->tx.itr_setting; coalesce[i].itr_tx = q_vector->tx.itr_settings;
coalesce[i].itr_rx = q_vector->rx.itr_setting; coalesce[i].itr_rx = q_vector->rx.itr_settings;
coalesce[i].intrl = q_vector->intrl; coalesce[i].intrl = q_vector->intrl;
if (i < vsi->num_txq) if (i < vsi->num_txq)
...@@ -3100,21 +3100,21 @@ ice_vsi_rebuild_set_coalesce(struct ice_vsi *vsi, ...@@ -3100,21 +3100,21 @@ ice_vsi_rebuild_set_coalesce(struct ice_vsi *vsi,
*/ */
if (i < vsi->alloc_rxq && coalesce[i].rx_valid) { if (i < vsi->alloc_rxq && coalesce[i].rx_valid) {
rc = &vsi->q_vectors[i]->rx; rc = &vsi->q_vectors[i]->rx;
rc->itr_setting = coalesce[i].itr_rx; rc->itr_settings = coalesce[i].itr_rx;
ice_write_itr(rc, rc->itr_setting); ice_write_itr(rc, rc->itr_setting);
} else if (i < vsi->alloc_rxq) { } else if (i < vsi->alloc_rxq) {
rc = &vsi->q_vectors[i]->rx; rc = &vsi->q_vectors[i]->rx;
rc->itr_setting = coalesce[0].itr_rx; rc->itr_settings = coalesce[0].itr_rx;
ice_write_itr(rc, rc->itr_setting); ice_write_itr(rc, rc->itr_setting);
} }
if (i < vsi->alloc_txq && coalesce[i].tx_valid) { if (i < vsi->alloc_txq && coalesce[i].tx_valid) {
rc = &vsi->q_vectors[i]->tx; rc = &vsi->q_vectors[i]->tx;
rc->itr_setting = coalesce[i].itr_tx; rc->itr_settings = coalesce[i].itr_tx;
ice_write_itr(rc, rc->itr_setting); ice_write_itr(rc, rc->itr_setting);
} else if (i < vsi->alloc_txq) { } else if (i < vsi->alloc_txq) {
rc = &vsi->q_vectors[i]->tx; rc = &vsi->q_vectors[i]->tx;
rc->itr_setting = coalesce[0].itr_tx; rc->itr_settings = coalesce[0].itr_tx;
ice_write_itr(rc, rc->itr_setting); ice_write_itr(rc, rc->itr_setting);
} }
...@@ -3128,12 +3128,12 @@ ice_vsi_rebuild_set_coalesce(struct ice_vsi *vsi, ...@@ -3128,12 +3128,12 @@ ice_vsi_rebuild_set_coalesce(struct ice_vsi *vsi,
for (; i < vsi->num_q_vectors; i++) { for (; i < vsi->num_q_vectors; i++) {
/* transmit */ /* transmit */
rc = &vsi->q_vectors[i]->tx; rc = &vsi->q_vectors[i]->tx;
rc->itr_setting = coalesce[0].itr_tx; rc->itr_settings = coalesce[0].itr_tx;
ice_write_itr(rc, rc->itr_setting); ice_write_itr(rc, rc->itr_setting);
/* receive */ /* receive */
rc = &vsi->q_vectors[i]->rx; rc = &vsi->q_vectors[i]->rx;
rc->itr_setting = coalesce[0].itr_rx; rc->itr_settings = coalesce[0].itr_rx;
ice_write_itr(rc, rc->itr_setting); ice_write_itr(rc, rc->itr_setting);
vsi->q_vectors[i]->intrl = coalesce[0].intrl; vsi->q_vectors[i]->intrl = coalesce[0].intrl;
......
...@@ -384,9 +384,14 @@ struct ice_ring_container { ...@@ -384,9 +384,14 @@ struct ice_ring_container {
/* this matches the maximum number of ITR bits, but in usec /* this matches the maximum number of ITR bits, but in usec
* values, so it is shifted left one bit (bit zero is ignored) * values, so it is shifted left one bit (bit zero is ignored)
*/ */
union {
struct {
u16 itr_setting:13; u16 itr_setting:13;
u16 itr_reserved:2; u16 itr_reserved:2;
u16 itr_mode:1; u16 itr_mode:1;
};
u16 itr_settings;
};
enum ice_container_type type; enum ice_container_type type;
}; };
......
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