mirror of https://gitee.com/openkylin/linux.git
mlx5-fixes-2019-01-18
-----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJcQmwjAAoJEEg/ir3gV/o+aBEIAIE8q3gEonMEPLnRoYSBlgUy ZBl7/51yzC8CVdsdO7hx5dyyiI+gYq10Jp6TVpqA2i/V8P871T/u6+xRhP3T7dOc Fq2YE70NdkCqFkpyc0QONzMC7ypwVqIEJrX7KnuLi5Ybsm9+tDia8AgC0NX/0H3U bRgfzpupfK0TiLgtBe7kqC2WTo+bPzu0cEUu7xjQqUgZZie5QPyzW/6cEtn/V75+ A3btMNS5w0cfYK4mR4MMuc+UT4rSbsdyIZQrzICo75C2UnVMlojDf90+RuW4JFVw tuOMA1LCB5l3lphgEEEerV2dZvs0ZJEuoYoFUkfgu2QEFSOMhod71t8/rurih0s= =f23b -----END PGP SIGNATURE----- Merge tag 'mlx5-fixes-2019-01-18' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux Saeed Mahameed says: ==================== Mellanox, mlx5 fixes 2019-01-18 This series introduces some fixes to mlx5 driver. Please pull and let me know if there is any problem. For -stable v4.18 ('net/mlx5e: Force CHECKSUM_UNNECESSARY for short ethernet frames') The patch doesn't apply cleanly to 4.18.y, but it is very simple to resolve, what should be the procedure here ? ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
8a7fa0c350
|
@ -844,9 +844,12 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
|
|||
ethtool_link_ksettings_add_link_mode(link_ksettings, supported,
|
||||
Autoneg);
|
||||
|
||||
if (get_fec_supported_advertised(mdev, link_ksettings))
|
||||
err = get_fec_supported_advertised(mdev, link_ksettings);
|
||||
if (err) {
|
||||
netdev_dbg(priv->netdev, "%s: FEC caps query failed: %d\n",
|
||||
__func__, err);
|
||||
err = 0; /* don't fail caps query because of FEC error */
|
||||
}
|
||||
|
||||
if (!an_disable_admin)
|
||||
ethtool_link_ksettings_add_link_mode(link_ksettings,
|
||||
|
|
|
@ -58,7 +58,8 @@ struct mlx5e_rep_indr_block_priv {
|
|||
struct list_head list;
|
||||
};
|
||||
|
||||
static void mlx5e_rep_indr_unregister_block(struct net_device *netdev);
|
||||
static void mlx5e_rep_indr_unregister_block(struct mlx5e_rep_priv *rpriv,
|
||||
struct net_device *netdev);
|
||||
|
||||
static void mlx5e_rep_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *drvinfo)
|
||||
|
@ -179,6 +180,7 @@ static void mlx5e_rep_update_sw_counters(struct mlx5e_priv *priv)
|
|||
|
||||
s->tx_packets += sq_stats->packets;
|
||||
s->tx_bytes += sq_stats->bytes;
|
||||
s->tx_queue_dropped += sq_stats->dropped;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -663,7 +665,7 @@ static void mlx5e_rep_indr_clean_block_privs(struct mlx5e_rep_priv *rpriv)
|
|||
struct list_head *head = &rpriv->uplink_priv.tc_indr_block_priv_list;
|
||||
|
||||
list_for_each_entry_safe(cb_priv, temp, head, list) {
|
||||
mlx5e_rep_indr_unregister_block(cb_priv->netdev);
|
||||
mlx5e_rep_indr_unregister_block(rpriv, cb_priv->netdev);
|
||||
kfree(cb_priv);
|
||||
}
|
||||
}
|
||||
|
@ -735,7 +737,7 @@ mlx5e_rep_indr_setup_tc_block(struct net_device *netdev,
|
|||
|
||||
err = tcf_block_cb_register(f->block,
|
||||
mlx5e_rep_indr_setup_block_cb,
|
||||
netdev, indr_priv, f->extack);
|
||||
indr_priv, indr_priv, f->extack);
|
||||
if (err) {
|
||||
list_del(&indr_priv->list);
|
||||
kfree(indr_priv);
|
||||
|
@ -743,14 +745,15 @@ mlx5e_rep_indr_setup_tc_block(struct net_device *netdev,
|
|||
|
||||
return err;
|
||||
case TC_BLOCK_UNBIND:
|
||||
indr_priv = mlx5e_rep_indr_block_priv_lookup(rpriv, netdev);
|
||||
if (!indr_priv)
|
||||
return -ENOENT;
|
||||
|
||||
tcf_block_cb_unregister(f->block,
|
||||
mlx5e_rep_indr_setup_block_cb,
|
||||
netdev);
|
||||
indr_priv = mlx5e_rep_indr_block_priv_lookup(rpriv, netdev);
|
||||
if (indr_priv) {
|
||||
list_del(&indr_priv->list);
|
||||
kfree(indr_priv);
|
||||
}
|
||||
indr_priv);
|
||||
list_del(&indr_priv->list);
|
||||
kfree(indr_priv);
|
||||
|
||||
return 0;
|
||||
default:
|
||||
|
@ -779,7 +782,7 @@ static int mlx5e_rep_indr_register_block(struct mlx5e_rep_priv *rpriv,
|
|||
|
||||
err = __tc_indr_block_cb_register(netdev, rpriv,
|
||||
mlx5e_rep_indr_setup_tc_cb,
|
||||
netdev);
|
||||
rpriv);
|
||||
if (err) {
|
||||
struct mlx5e_priv *priv = netdev_priv(rpriv->netdev);
|
||||
|
||||
|
@ -789,10 +792,11 @@ static int mlx5e_rep_indr_register_block(struct mlx5e_rep_priv *rpriv,
|
|||
return err;
|
||||
}
|
||||
|
||||
static void mlx5e_rep_indr_unregister_block(struct net_device *netdev)
|
||||
static void mlx5e_rep_indr_unregister_block(struct mlx5e_rep_priv *rpriv,
|
||||
struct net_device *netdev)
|
||||
{
|
||||
__tc_indr_block_cb_unregister(netdev, mlx5e_rep_indr_setup_tc_cb,
|
||||
netdev);
|
||||
rpriv);
|
||||
}
|
||||
|
||||
static int mlx5e_nic_rep_netdevice_event(struct notifier_block *nb,
|
||||
|
@ -811,7 +815,7 @@ static int mlx5e_nic_rep_netdevice_event(struct notifier_block *nb,
|
|||
mlx5e_rep_indr_register_block(rpriv, netdev);
|
||||
break;
|
||||
case NETDEV_UNREGISTER:
|
||||
mlx5e_rep_indr_unregister_block(netdev);
|
||||
mlx5e_rep_indr_unregister_block(rpriv, netdev);
|
||||
break;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
|
|
|
@ -732,6 +732,8 @@ static u8 get_ip_proto(struct sk_buff *skb, int network_depth, __be16 proto)
|
|||
((struct ipv6hdr *)ip_p)->nexthdr;
|
||||
}
|
||||
|
||||
#define short_frame(size) ((size) <= ETH_ZLEN + ETH_FCS_LEN)
|
||||
|
||||
static inline void mlx5e_handle_csum(struct net_device *netdev,
|
||||
struct mlx5_cqe64 *cqe,
|
||||
struct mlx5e_rq *rq,
|
||||
|
@ -754,6 +756,17 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
|
|||
if (unlikely(test_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &rq->state)))
|
||||
goto csum_unnecessary;
|
||||
|
||||
/* CQE csum doesn't cover padding octets in short ethernet
|
||||
* frames. And the pad field is appended prior to calculating
|
||||
* and appending the FCS field.
|
||||
*
|
||||
* Detecting these padded frames requires to verify and parse
|
||||
* IP headers, so we simply force all those small frames to be
|
||||
* CHECKSUM_UNNECESSARY even if they are not padded.
|
||||
*/
|
||||
if (short_frame(skb->len))
|
||||
goto csum_unnecessary;
|
||||
|
||||
if (likely(is_last_ethertype_ip(skb, &network_depth, &proto))) {
|
||||
if (unlikely(get_ip_proto(skb, network_depth, proto) == IPPROTO_SCTP))
|
||||
goto csum_unnecessary;
|
||||
|
|
Loading…
Reference in New Issue