mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
Including fixes from bpf, ipsec and netfilter.
No solution yet for the stmmac issue mentioned in the last PR, but it proved to be a lockdep false positive, not a blocker. Current release - regressions: - dpll: move all dpll<>netdev helpers to dpll code, fix build regression with old compilers Current release - new code bugs: - page_pool: fix netlink dump stop/resume Previous releases - regressions: - bpf: fix verifier to check bpf_func_state->callback_depth when pruning states as otherwise unsafe programs could get accepted - ipv6: avoid possible UAF in ip6_route_mpath_notify() - ice: reconfig host after changing MSI-X on VF - mlx5: - e-switch, change flow rule destination checking - add a memory barrier to prevent a possible null-ptr-deref - switch to using _bh variant of of spinlock where needed Previous releases - always broken: - netfilter: nf_conntrack_h323: add protection for bmp length out of range - bpf: fix to zero-initialise xdp_rxq_info struct before running XDP program in CPU map which led to random xdp_md fields - xfrm: fix UDP encapsulation in TX packet offload - netrom: fix data-races around sysctls - ice: - fix potential NULL pointer dereference in ice_bridge_setlink() - fix uninitialized dplls mutex usage - igc: avoid returning frame twice in XDP_REDIRECT - i40e: disable NAPI right after disabling irqs when handling xsk_pool - geneve: make sure to pull inner header in geneve_rx() - sparx5: fix use after free inside sparx5_del_mact_entry - dsa: microchip: fix register write order in ksz8_ind_write8() Misc: - selftests: mptcp: fixes for diag.sh Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmXptoYSHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOkK3IP+QGe1Q37l75YM8IPpihjNYvBTiP6VWv0 3cKoI0kz2EF5zmt3RAPK1M/ea1GY1L4Fsa/tdV0b9BzP9xC3si7IdFLZLqXh5tUX tW5m1LIoPqYLXE2i7qtOS5omMuCqKm2gM7TURarJA0XsAGyu645bYiJeT5dybnZQ AuAsXKj9RM3AkcLiqB4PZjdDuG9vIQLi2wSIybP4KFGqY7UMRlkRKFYlu2rpF29s XPlR671chaX90sP4bNwf+qVr81Ebu9APmDA0a9tVFDkgEqhPezpRDGHr2Kj+W25s j3XXwoygL6gIpJKzRgHsugAaZjla82DpCuygPOcmtTEEtHmF6fn8mBebjY/QDL6w ibbcOYJpzPFccRfMyHiiwzjqcaj+Zc58DktFf3H4EnKJULPralhKyMoyPngiAo1Y wNIGlWR8SNLhJzyZMeFPMKsz3RnLiC5vMdXMFfZdyH1RHHib5L+8AVogya+SaVkF 1J1DrrShOEddvlrbZbM8c/03WHkAJXSRD34oHW9c3PkZscSzHmB1xqI1bER6sc5U 5FjuDnsQDQ61pa6pip2Ug71UOw6ZAwZJs6AgestI49caDvUpSKI7jg/F6Dle6wNT p2KVUWFoz5BQBXG8Ut7yWpWvoEmaHe0cEn03rqZSYFnltWgkNvWMRMhkzuroOHWO UmOnuVIQH9Vh =0bH0 -----END PGP SIGNATURE----- Merge tag 'net-6.8-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Including fixes from bpf, ipsec and netfilter. No solution yet for the stmmac issue mentioned in the last PR, but it proved to be a lockdep false positive, not a blocker. Current release - regressions: - dpll: move all dpll<>netdev helpers to dpll code, fix build regression with old compilers Current release - new code bugs: - page_pool: fix netlink dump stop/resume Previous releases - regressions: - bpf: fix verifier to check bpf_func_state->callback_depth when pruning states as otherwise unsafe programs could get accepted - ipv6: avoid possible UAF in ip6_route_mpath_notify() - ice: reconfig host after changing MSI-X on VF - mlx5: - e-switch, change flow rule destination checking - add a memory barrier to prevent a possible null-ptr-deref - switch to using _bh variant of of spinlock where needed Previous releases - always broken: - netfilter: nf_conntrack_h323: add protection for bmp length out of range - bpf: fix to zero-initialise xdp_rxq_info struct before running XDP program in CPU map which led to random xdp_md fields - xfrm: fix UDP encapsulation in TX packet offload - netrom: fix data-races around sysctls - ice: - fix potential NULL pointer dereference in ice_bridge_setlink() - fix uninitialized dplls mutex usage - igc: avoid returning frame twice in XDP_REDIRECT - i40e: disable NAPI right after disabling irqs when handling xsk_pool - geneve: make sure to pull inner header in geneve_rx() - sparx5: fix use after free inside sparx5_del_mact_entry - dsa: microchip: fix register write order in ksz8_ind_write8() Misc: - selftests: mptcp: fixes for diag.sh" * tag 'net-6.8-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (63 commits) net: pds_core: Fix possible double free in error handling path netrom: Fix data-races around sysctl_net_busy_read netrom: Fix a data-race around sysctl_netrom_link_fails_count netrom: Fix a data-race around sysctl_netrom_routing_control netrom: Fix a data-race around sysctl_netrom_transport_no_activity_timeout netrom: Fix a data-race around sysctl_netrom_transport_requested_window_size netrom: Fix a data-race around sysctl_netrom_transport_busy_delay netrom: Fix a data-race around sysctl_netrom_transport_acknowledge_delay netrom: Fix a data-race around sysctl_netrom_transport_maximum_tries netrom: Fix a data-race around sysctl_netrom_transport_timeout netrom: Fix data-races around sysctl_netrom_network_ttl_initialiser netrom: Fix a data-race around sysctl_netrom_obsolescence_count_initialiser netrom: Fix a data-race around sysctl_netrom_default_path_quality netfilter: nf_conntrack_h323: Add protection for bmp length out of range netfilter: nf_tables: mark set as dead when unbinding anonymous set with timeout netfilter: nft_ct: fix l3num expectations with inet pseudo family netfilter: nf_tables: reject constant set with timeout netfilter: nf_tables: disallow anonymous set with timeout flag net/rds: fix WARNING in rds_conn_connect_if_down net: dsa: microchip: fix register write order in ksz8_ind_write8() ...
This commit is contained in:
commit
df4793505a
@ -65,9 +65,11 @@ properties:
|
||||
|
||||
rx-internal-delay-ps:
|
||||
enum: [0, 1800]
|
||||
default: 0
|
||||
|
||||
tx-internal-delay-ps:
|
||||
enum: [0, 2000]
|
||||
default: 0
|
||||
|
||||
'#address-cells':
|
||||
const: 1
|
||||
|
@ -545,7 +545,7 @@ In such scenario, dpll device input signal shall be also configurable
|
||||
to drive dpll with signal recovered from the PHY netdevice.
|
||||
This is done by exposing a pin to the netdevice - attaching pin to the
|
||||
netdevice itself with
|
||||
``netdev_dpll_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin)``.
|
||||
``dpll_netdev_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin)``.
|
||||
Exposed pin id handle ``DPLL_A_PIN_ID`` is then identifiable by the user
|
||||
as it is attached to rtnetlink respond to get ``RTM_NEWLINK`` command in
|
||||
nested attribute ``IFLA_DPLL_PIN``.
|
||||
|
@ -20207,8 +20207,8 @@ F: Documentation/devicetree/bindings/net/socionext,uniphier-ave4.yaml
|
||||
F: drivers/net/ethernet/socionext/sni_ave.c
|
||||
|
||||
SOCIONEXT (SNI) NETSEC NETWORK DRIVER
|
||||
M: Jassi Brar <jaswinder.singh@linaro.org>
|
||||
M: Ilias Apalodimas <ilias.apalodimas@linaro.org>
|
||||
M: Masahisa Kojima <kojima.masahisa@socionext.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/net/socionext,synquacer-netsec.yaml
|
||||
|
@ -42,11 +42,6 @@ struct dpll_pin_registration {
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct dpll_pin *netdev_dpll_pin(const struct net_device *dev)
|
||||
{
|
||||
return rcu_dereference_rtnl(dev->dpll_pin);
|
||||
}
|
||||
|
||||
struct dpll_device *dpll_device_get_by_id(int id)
|
||||
{
|
||||
if (xa_get_mark(&dpll_device_xa, id, DPLL_REGISTERED))
|
||||
@ -513,6 +508,26 @@ err_pin_prop:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static void dpll_netdev_pin_assign(struct net_device *dev, struct dpll_pin *dpll_pin)
|
||||
{
|
||||
rtnl_lock();
|
||||
rcu_assign_pointer(dev->dpll_pin, dpll_pin);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
void dpll_netdev_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin)
|
||||
{
|
||||
WARN_ON(!dpll_pin);
|
||||
dpll_netdev_pin_assign(dev, dpll_pin);
|
||||
}
|
||||
EXPORT_SYMBOL(dpll_netdev_pin_set);
|
||||
|
||||
void dpll_netdev_pin_clear(struct net_device *dev)
|
||||
{
|
||||
dpll_netdev_pin_assign(dev, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(dpll_netdev_pin_clear);
|
||||
|
||||
/**
|
||||
* dpll_pin_get - find existing or create new dpll pin
|
||||
* @clock_id: clock_id of creator
|
||||
|
@ -8,6 +8,7 @@
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <net/genetlink.h>
|
||||
#include "dpll_core.h"
|
||||
#include "dpll_netlink.h"
|
||||
@ -47,18 +48,6 @@ dpll_msg_add_dev_parent_handle(struct sk_buff *msg, u32 id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* dpll_msg_pin_handle_size - get size of pin handle attribute for given pin
|
||||
* @pin: pin pointer
|
||||
*
|
||||
* Return: byte size of pin handle attribute for given pin.
|
||||
*/
|
||||
size_t dpll_msg_pin_handle_size(struct dpll_pin *pin)
|
||||
{
|
||||
return pin ? nla_total_size(4) : 0; /* DPLL_A_PIN_ID */
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dpll_msg_pin_handle_size);
|
||||
|
||||
/**
|
||||
* dpll_msg_add_pin_handle - attach pin handle attribute to a given message
|
||||
* @msg: pointer to sk_buff message to attach a pin handle
|
||||
@ -68,7 +57,7 @@ EXPORT_SYMBOL_GPL(dpll_msg_pin_handle_size);
|
||||
* * 0 - success
|
||||
* * -EMSGSIZE - no space in message to attach pin handle
|
||||
*/
|
||||
int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
|
||||
static int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
|
||||
{
|
||||
if (!pin)
|
||||
return 0;
|
||||
@ -76,7 +65,28 @@ int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
|
||||
return -EMSGSIZE;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dpll_msg_add_pin_handle);
|
||||
|
||||
static struct dpll_pin *dpll_netdev_pin(const struct net_device *dev)
|
||||
{
|
||||
return rcu_dereference_rtnl(dev->dpll_pin);
|
||||
}
|
||||
|
||||
/**
|
||||
* dpll_netdev_pin_handle_size - get size of pin handle attribute of a netdev
|
||||
* @dev: netdev from which to get the pin
|
||||
*
|
||||
* Return: byte size of pin handle attribute, or 0 if @dev has no pin.
|
||||
*/
|
||||
size_t dpll_netdev_pin_handle_size(const struct net_device *dev)
|
||||
{
|
||||
return dpll_netdev_pin(dev) ? nla_total_size(4) : 0; /* DPLL_A_PIN_ID */
|
||||
}
|
||||
|
||||
int dpll_netdev_add_pin_handle(struct sk_buff *msg,
|
||||
const struct net_device *dev)
|
||||
{
|
||||
return dpll_msg_add_pin_handle(msg, dpll_netdev_pin(dev));
|
||||
}
|
||||
|
||||
static int
|
||||
dpll_msg_add_mode(struct sk_buff *msg, struct dpll_device *dpll,
|
||||
|
@ -1811,7 +1811,7 @@ void bond_xdp_set_features(struct net_device *bond_dev)
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (!bond_xdp_check(bond)) {
|
||||
if (!bond_xdp_check(bond) || !bond_has_slaves(bond)) {
|
||||
xdp_clear_features_flag(bond_dev);
|
||||
return;
|
||||
}
|
||||
|
@ -49,9 +49,9 @@ static int ksz8_ind_write8(struct ksz_device *dev, u8 table, u16 addr, u8 data)
|
||||
mutex_lock(&dev->alu_mutex);
|
||||
|
||||
ctrl_addr = IND_ACC_TABLE(table) | addr;
|
||||
ret = ksz_write8(dev, regs[REG_IND_BYTE], data);
|
||||
ret = ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
|
||||
if (!ret)
|
||||
ret = ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
|
||||
ret = ksz_write8(dev, regs[REG_IND_BYTE], data);
|
||||
|
||||
mutex_unlock(&dev->alu_mutex);
|
||||
|
||||
|
@ -160,23 +160,19 @@ static struct pds_auxiliary_dev *pdsc_auxbus_dev_register(struct pdsc *cf,
|
||||
if (err < 0) {
|
||||
dev_warn(cf->dev, "auxiliary_device_init of %s failed: %pe\n",
|
||||
name, ERR_PTR(err));
|
||||
goto err_out;
|
||||
kfree(padev);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
err = auxiliary_device_add(aux_dev);
|
||||
if (err) {
|
||||
dev_warn(cf->dev, "auxiliary_device_add of %s failed: %pe\n",
|
||||
name, ERR_PTR(err));
|
||||
goto err_out_uninit;
|
||||
auxiliary_device_uninit(aux_dev);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
return padev;
|
||||
|
||||
err_out_uninit:
|
||||
auxiliary_device_uninit(aux_dev);
|
||||
err_out:
|
||||
kfree(padev);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
int pdsc_auxbus_dev_del(struct pdsc *cf, struct pdsc *pf)
|
||||
|
@ -2559,7 +2559,7 @@ void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw)
|
||||
hw->phy.ops.write_reg_page(hw, BM_RAR_H(i),
|
||||
(u16)(mac_reg & 0xFFFF));
|
||||
hw->phy.ops.write_reg_page(hw, BM_RAR_CTRL(i),
|
||||
FIELD_GET(E1000_RAH_AV, mac_reg));
|
||||
(u16)((mac_reg & E1000_RAH_AV) >> 16));
|
||||
}
|
||||
|
||||
e1000_disable_phy_wakeup_reg_access_bm(hw, &phy_reg);
|
||||
|
@ -13560,9 +13560,9 @@ int i40e_queue_pair_disable(struct i40e_vsi *vsi, int queue_pair)
|
||||
return err;
|
||||
|
||||
i40e_queue_pair_disable_irq(vsi, queue_pair);
|
||||
i40e_queue_pair_toggle_napi(vsi, queue_pair, false /* off */);
|
||||
err = i40e_queue_pair_toggle_rings(vsi, queue_pair, false /* off */);
|
||||
i40e_clean_rx_ring(vsi->rx_rings[queue_pair]);
|
||||
i40e_queue_pair_toggle_napi(vsi, queue_pair, false /* off */);
|
||||
i40e_queue_pair_clean_rings(vsi, queue_pair);
|
||||
i40e_queue_pair_reset_stats(vsi, queue_pair);
|
||||
|
||||
|
@ -567,8 +567,7 @@ static inline bool i40e_is_fw_ver_lt(struct i40e_hw *hw, u16 maj, u16 min)
|
||||
**/
|
||||
static inline bool i40e_is_fw_ver_eq(struct i40e_hw *hw, u16 maj, u16 min)
|
||||
{
|
||||
return (hw->aq.fw_maj_ver > maj ||
|
||||
(hw->aq.fw_maj_ver == maj && hw->aq.fw_min_ver == min));
|
||||
return (hw->aq.fw_maj_ver == maj && hw->aq.fw_min_ver == min);
|
||||
}
|
||||
|
||||
#endif /* _I40E_PROTOTYPE_H_ */
|
||||
|
@ -1597,7 +1597,7 @@ static void ice_dpll_deinit_rclk_pin(struct ice_pf *pf)
|
||||
}
|
||||
if (WARN_ON_ONCE(!vsi || !vsi->netdev))
|
||||
return;
|
||||
netdev_dpll_pin_clear(vsi->netdev);
|
||||
dpll_netdev_pin_clear(vsi->netdev);
|
||||
dpll_pin_put(rclk->pin);
|
||||
}
|
||||
|
||||
@ -1641,7 +1641,7 @@ ice_dpll_init_rclk_pins(struct ice_pf *pf, struct ice_dpll_pin *pin,
|
||||
}
|
||||
if (WARN_ON((!vsi || !vsi->netdev)))
|
||||
return -EINVAL;
|
||||
netdev_dpll_pin_set(vsi->netdev, pf->dplls.rclk.pin);
|
||||
dpll_netdev_pin_set(vsi->netdev, pf->dplls.rclk.pin);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -2120,6 +2120,7 @@ void ice_dpll_init(struct ice_pf *pf)
|
||||
struct ice_dplls *d = &pf->dplls;
|
||||
int err = 0;
|
||||
|
||||
mutex_init(&d->lock);
|
||||
err = ice_dpll_init_info(pf, cgu);
|
||||
if (err)
|
||||
goto err_exit;
|
||||
@ -2132,7 +2133,6 @@ void ice_dpll_init(struct ice_pf *pf)
|
||||
err = ice_dpll_init_pins(pf, cgu);
|
||||
if (err)
|
||||
goto deinit_pps;
|
||||
mutex_init(&d->lock);
|
||||
if (cgu) {
|
||||
err = ice_dpll_init_worker(pf);
|
||||
if (err)
|
||||
|
@ -3192,7 +3192,7 @@ ice_vsi_realloc_stat_arrays(struct ice_vsi *vsi)
|
||||
}
|
||||
}
|
||||
|
||||
tx_ring_stats = vsi_stat->rx_ring_stats;
|
||||
tx_ring_stats = vsi_stat->tx_ring_stats;
|
||||
vsi_stat->tx_ring_stats =
|
||||
krealloc_array(vsi_stat->tx_ring_stats, req_txq,
|
||||
sizeof(*vsi_stat->tx_ring_stats),
|
||||
|
@ -8013,6 +8013,8 @@ ice_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh,
|
||||
pf_sw = pf->first_sw;
|
||||
/* find the attribute in the netlink message */
|
||||
br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
|
||||
if (!br_spec)
|
||||
return -EINVAL;
|
||||
|
||||
nla_for_each_nested(attr, br_spec, rem) {
|
||||
__u16 mode;
|
||||
|
@ -1068,6 +1068,7 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count)
|
||||
struct ice_pf *pf = pci_get_drvdata(pdev);
|
||||
u16 prev_msix, prev_queues, queues;
|
||||
bool needs_rebuild = false;
|
||||
struct ice_vsi *vsi;
|
||||
struct ice_vf *vf;
|
||||
int id;
|
||||
|
||||
@ -1102,6 +1103,10 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count)
|
||||
if (!vf)
|
||||
return -ENOENT;
|
||||
|
||||
vsi = ice_get_vf_vsi(vf);
|
||||
if (!vsi)
|
||||
return -ENOENT;
|
||||
|
||||
prev_msix = vf->num_msix;
|
||||
prev_queues = vf->num_vf_qs;
|
||||
|
||||
@ -1122,7 +1127,7 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count)
|
||||
if (vf->first_vector_idx < 0)
|
||||
goto unroll;
|
||||
|
||||
if (ice_vf_reconfig_vsi(vf)) {
|
||||
if (ice_vf_reconfig_vsi(vf) || ice_vf_init_host_cfg(vf, vsi)) {
|
||||
/* Try to rebuild with previous values */
|
||||
needs_rebuild = true;
|
||||
goto unroll;
|
||||
@ -1148,8 +1153,10 @@ unroll:
|
||||
if (vf->first_vector_idx < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (needs_rebuild)
|
||||
if (needs_rebuild) {
|
||||
ice_vf_reconfig_vsi(vf);
|
||||
ice_vf_init_host_cfg(vf, vsi);
|
||||
}
|
||||
|
||||
ice_ena_vf_mappings(vf);
|
||||
ice_put_vf(vf);
|
||||
|
@ -440,7 +440,6 @@ static int ice_vc_get_vf_res_msg(struct ice_vf *vf, u8 *msg)
|
||||
vf->driver_caps = *(u32 *)msg;
|
||||
else
|
||||
vf->driver_caps = VIRTCHNL_VF_OFFLOAD_L2 |
|
||||
VIRTCHNL_VF_OFFLOAD_RSS_REG |
|
||||
VIRTCHNL_VF_OFFLOAD_VLAN;
|
||||
|
||||
vfres->vf_cap_flags = VIRTCHNL_VF_OFFLOAD_L2;
|
||||
@ -453,14 +452,8 @@ static int ice_vc_get_vf_res_msg(struct ice_vf *vf, u8 *msg)
|
||||
vfres->vf_cap_flags |= ice_vc_get_vlan_caps(hw, vf, vsi,
|
||||
vf->driver_caps);
|
||||
|
||||
if (vf->driver_caps & VIRTCHNL_VF_OFFLOAD_RSS_PF) {
|
||||
if (vf->driver_caps & VIRTCHNL_VF_OFFLOAD_RSS_PF)
|
||||
vfres->vf_cap_flags |= VIRTCHNL_VF_OFFLOAD_RSS_PF;
|
||||
} else {
|
||||
if (vf->driver_caps & VIRTCHNL_VF_OFFLOAD_RSS_AQ)
|
||||
vfres->vf_cap_flags |= VIRTCHNL_VF_OFFLOAD_RSS_AQ;
|
||||
else
|
||||
vfres->vf_cap_flags |= VIRTCHNL_VF_OFFLOAD_RSS_REG;
|
||||
}
|
||||
|
||||
if (vf->driver_caps & VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC)
|
||||
vfres->vf_cap_flags |= VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC;
|
||||
|
@ -13,8 +13,6 @@
|
||||
* - opcodes needed by VF when caps are activated
|
||||
*
|
||||
* Caps that don't use new opcodes (no opcodes should be allowed):
|
||||
* - VIRTCHNL_VF_OFFLOAD_RSS_AQ
|
||||
* - VIRTCHNL_VF_OFFLOAD_RSS_REG
|
||||
* - VIRTCHNL_VF_OFFLOAD_WB_ON_ITR
|
||||
* - VIRTCHNL_VF_OFFLOAD_CRC
|
||||
* - VIRTCHNL_VF_OFFLOAD_RX_POLLING
|
||||
|
@ -179,6 +179,10 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx)
|
||||
return -EBUSY;
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
ice_qvec_dis_irq(vsi, rx_ring, q_vector);
|
||||
ice_qvec_toggle_napi(vsi, q_vector, false);
|
||||
|
||||
netif_tx_stop_queue(netdev_get_tx_queue(vsi->netdev, q_idx));
|
||||
|
||||
ice_fill_txq_meta(vsi, tx_ring, &txq_meta);
|
||||
@ -195,13 +199,10 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx)
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
ice_qvec_dis_irq(vsi, rx_ring, q_vector);
|
||||
|
||||
err = ice_vsi_ctrl_one_rx_ring(vsi, false, q_idx, true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
ice_qvec_toggle_napi(vsi, q_vector, false);
|
||||
ice_qp_clean_rings(vsi, q_idx);
|
||||
ice_qp_reset_stats(vsi, q_idx);
|
||||
|
||||
@ -259,11 +260,11 @@ static int ice_qp_ena(struct ice_vsi *vsi, u16 q_idx)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
clear_bit(ICE_CFG_BUSY, vsi->state);
|
||||
ice_qvec_toggle_napi(vsi, q_vector, true);
|
||||
ice_qvec_ena_irq(vsi, q_vector);
|
||||
|
||||
netif_tx_start_queue(netdev_get_tx_queue(vsi->netdev, q_idx));
|
||||
clear_bit(ICE_CFG_BUSY, vsi->state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2087,8 +2087,10 @@ int idpf_send_disable_queues_msg(struct idpf_vport *vport)
|
||||
set_bit(__IDPF_Q_POLL_MODE, vport->txqs[i]->flags);
|
||||
|
||||
/* schedule the napi to receive all the marker packets */
|
||||
local_bh_disable();
|
||||
for (i = 0; i < vport->num_q_vectors; i++)
|
||||
napi_schedule(&vport->q_vectors[i].napi);
|
||||
local_bh_enable();
|
||||
|
||||
return idpf_wait_for_marker_event(vport);
|
||||
}
|
||||
|
@ -6487,7 +6487,7 @@ static int igc_xdp_xmit(struct net_device *dev, int num_frames,
|
||||
int cpu = smp_processor_id();
|
||||
struct netdev_queue *nq;
|
||||
struct igc_ring *ring;
|
||||
int i, drops;
|
||||
int i, nxmit;
|
||||
|
||||
if (unlikely(!netif_carrier_ok(dev)))
|
||||
return -ENETDOWN;
|
||||
@ -6503,16 +6503,15 @@ static int igc_xdp_xmit(struct net_device *dev, int num_frames,
|
||||
/* Avoid transmit queue timeout since we share it with the slow path */
|
||||
txq_trans_cond_update(nq);
|
||||
|
||||
drops = 0;
|
||||
nxmit = 0;
|
||||
for (i = 0; i < num_frames; i++) {
|
||||
int err;
|
||||
struct xdp_frame *xdpf = frames[i];
|
||||
|
||||
err = igc_xdp_init_tx_descriptor(ring, xdpf);
|
||||
if (err) {
|
||||
xdp_return_frame_rx_napi(xdpf);
|
||||
drops++;
|
||||
}
|
||||
if (err)
|
||||
break;
|
||||
nxmit++;
|
||||
}
|
||||
|
||||
if (flags & XDP_XMIT_FLUSH)
|
||||
@ -6520,7 +6519,7 @@ static int igc_xdp_xmit(struct net_device *dev, int num_frames,
|
||||
|
||||
__netif_tx_unlock(nq);
|
||||
|
||||
return num_frames - drops;
|
||||
return nxmit;
|
||||
}
|
||||
|
||||
static void igc_trigger_rxtxq_interrupt(struct igc_adapter *adapter,
|
||||
|
@ -2939,8 +2939,8 @@ static void ixgbe_check_lsc(struct ixgbe_adapter *adapter)
|
||||
static inline void ixgbe_irq_enable_queues(struct ixgbe_adapter *adapter,
|
||||
u64 qmask)
|
||||
{
|
||||
u32 mask;
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
u32 mask;
|
||||
|
||||
switch (hw->mac.type) {
|
||||
case ixgbe_mac_82598EB:
|
||||
@ -10524,6 +10524,44 @@ static void ixgbe_reset_rxr_stats(struct ixgbe_ring *rx_ring)
|
||||
memset(&rx_ring->rx_stats, 0, sizeof(rx_ring->rx_stats));
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_irq_disable_single - Disable single IRQ vector
|
||||
* @adapter: adapter structure
|
||||
* @ring: ring index
|
||||
**/
|
||||
static void ixgbe_irq_disable_single(struct ixgbe_adapter *adapter, u32 ring)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
u64 qmask = BIT_ULL(ring);
|
||||
u32 mask;
|
||||
|
||||
switch (adapter->hw.mac.type) {
|
||||
case ixgbe_mac_82598EB:
|
||||
mask = qmask & IXGBE_EIMC_RTX_QUEUE;
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, mask);
|
||||
break;
|
||||
case ixgbe_mac_82599EB:
|
||||
case ixgbe_mac_X540:
|
||||
case ixgbe_mac_X550:
|
||||
case ixgbe_mac_X550EM_x:
|
||||
case ixgbe_mac_x550em_a:
|
||||
mask = (qmask & 0xFFFFFFFF);
|
||||
if (mask)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
|
||||
mask = (qmask >> 32);
|
||||
if (mask)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED)
|
||||
synchronize_irq(adapter->msix_entries[ring].vector);
|
||||
else
|
||||
synchronize_irq(adapter->pdev->irq);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_txrx_ring_disable - Disable Rx/Tx/XDP Tx rings
|
||||
* @adapter: adapter structure
|
||||
@ -10540,6 +10578,11 @@ void ixgbe_txrx_ring_disable(struct ixgbe_adapter *adapter, int ring)
|
||||
tx_ring = adapter->tx_ring[ring];
|
||||
xdp_ring = adapter->xdp_ring[ring];
|
||||
|
||||
ixgbe_irq_disable_single(adapter, ring);
|
||||
|
||||
/* Rx/Tx/XDP Tx share the same napi context. */
|
||||
napi_disable(&rx_ring->q_vector->napi);
|
||||
|
||||
ixgbe_disable_txr(adapter, tx_ring);
|
||||
if (xdp_ring)
|
||||
ixgbe_disable_txr(adapter, xdp_ring);
|
||||
@ -10548,9 +10591,6 @@ void ixgbe_txrx_ring_disable(struct ixgbe_adapter *adapter, int ring)
|
||||
if (xdp_ring)
|
||||
synchronize_rcu();
|
||||
|
||||
/* Rx/Tx/XDP Tx share the same napi context. */
|
||||
napi_disable(&rx_ring->q_vector->napi);
|
||||
|
||||
ixgbe_clean_tx_ring(tx_ring);
|
||||
if (xdp_ring)
|
||||
ixgbe_clean_tx_ring(xdp_ring);
|
||||
@ -10578,9 +10618,6 @@ void ixgbe_txrx_ring_enable(struct ixgbe_adapter *adapter, int ring)
|
||||
tx_ring = adapter->tx_ring[ring];
|
||||
xdp_ring = adapter->xdp_ring[ring];
|
||||
|
||||
/* Rx/Tx/XDP Tx share the same napi context. */
|
||||
napi_enable(&rx_ring->q_vector->napi);
|
||||
|
||||
ixgbe_configure_tx_ring(adapter, tx_ring);
|
||||
if (xdp_ring)
|
||||
ixgbe_configure_tx_ring(adapter, xdp_ring);
|
||||
@ -10589,6 +10626,11 @@ void ixgbe_txrx_ring_enable(struct ixgbe_adapter *adapter, int ring)
|
||||
clear_bit(__IXGBE_TX_DISABLED, &tx_ring->state);
|
||||
if (xdp_ring)
|
||||
clear_bit(__IXGBE_TX_DISABLED, &xdp_ring->state);
|
||||
|
||||
/* Rx/Tx/XDP Tx share the same napi context. */
|
||||
napi_enable(&rx_ring->q_vector->napi);
|
||||
ixgbe_irq_enable_queues(adapter, BIT_ULL(ring));
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -157,6 +157,12 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (action == DEVLINK_RELOAD_ACTION_FW_ACTIVATE &&
|
||||
!dev->priv.fw_reset) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "FW activate is unsupported for this function");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (mlx5_core_is_pf(dev) && pci_num_vf(pdev))
|
||||
NL_SET_ERR_MSG_MOD(extack, "reload while VFs are present is unfavorable");
|
||||
|
||||
|
@ -261,7 +261,7 @@ static void mlx5_dpll_netdev_dpll_pin_set(struct mlx5_dpll *mdpll,
|
||||
{
|
||||
if (mdpll->tracking_netdev)
|
||||
return;
|
||||
netdev_dpll_pin_set(netdev, mdpll->dpll_pin);
|
||||
dpll_netdev_pin_set(netdev, mdpll->dpll_pin);
|
||||
mdpll->tracking_netdev = netdev;
|
||||
}
|
||||
|
||||
@ -269,7 +269,7 @@ static void mlx5_dpll_netdev_dpll_pin_clear(struct mlx5_dpll *mdpll)
|
||||
{
|
||||
if (!mdpll->tracking_netdev)
|
||||
return;
|
||||
netdev_dpll_pin_clear(mdpll->tracking_netdev);
|
||||
dpll_netdev_pin_clear(mdpll->tracking_netdev);
|
||||
mdpll->tracking_netdev = NULL;
|
||||
}
|
||||
|
||||
|
@ -42,9 +42,9 @@ mlx5e_ptp_port_ts_cqe_list_add(struct mlx5e_ptp_port_ts_cqe_list *list, u8 metad
|
||||
|
||||
WARN_ON_ONCE(tracker->inuse);
|
||||
tracker->inuse = true;
|
||||
spin_lock(&list->tracker_list_lock);
|
||||
spin_lock_bh(&list->tracker_list_lock);
|
||||
list_add_tail(&tracker->entry, &list->tracker_list_head);
|
||||
spin_unlock(&list->tracker_list_lock);
|
||||
spin_unlock_bh(&list->tracker_list_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -54,9 +54,9 @@ mlx5e_ptp_port_ts_cqe_list_remove(struct mlx5e_ptp_port_ts_cqe_list *list, u8 me
|
||||
|
||||
WARN_ON_ONCE(!tracker->inuse);
|
||||
tracker->inuse = false;
|
||||
spin_lock(&list->tracker_list_lock);
|
||||
spin_lock_bh(&list->tracker_list_lock);
|
||||
list_del(&tracker->entry);
|
||||
spin_unlock(&list->tracker_list_lock);
|
||||
spin_unlock_bh(&list->tracker_list_lock);
|
||||
}
|
||||
|
||||
void mlx5e_ptpsq_track_metadata(struct mlx5e_ptpsq *ptpsq, u8 metadata)
|
||||
@ -155,7 +155,7 @@ static void mlx5e_ptpsq_mark_ts_cqes_undelivered(struct mlx5e_ptpsq *ptpsq,
|
||||
struct mlx5e_ptp_metadata_map *metadata_map = &ptpsq->metadata_map;
|
||||
struct mlx5e_ptp_port_ts_cqe_tracker *pos, *n;
|
||||
|
||||
spin_lock(&cqe_list->tracker_list_lock);
|
||||
spin_lock_bh(&cqe_list->tracker_list_lock);
|
||||
list_for_each_entry_safe(pos, n, &cqe_list->tracker_list_head, entry) {
|
||||
struct sk_buff *skb =
|
||||
mlx5e_ptp_metadata_map_lookup(metadata_map, pos->metadata_id);
|
||||
@ -170,7 +170,7 @@ static void mlx5e_ptpsq_mark_ts_cqes_undelivered(struct mlx5e_ptpsq *ptpsq,
|
||||
pos->inuse = false;
|
||||
list_del(&pos->entry);
|
||||
}
|
||||
spin_unlock(&cqe_list->tracker_list_lock);
|
||||
spin_unlock_bh(&cqe_list->tracker_list_lock);
|
||||
}
|
||||
|
||||
#define PTP_WQE_CTR2IDX(val) ((val) & ptpsq->ts_cqe_ctr_mask)
|
||||
|
@ -37,7 +37,7 @@ mlx5e_tc_post_act_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
|
||||
|
||||
if (!MLX5_CAP_FLOWTABLE_TYPE(priv->mdev, ignore_flow_level, table_type)) {
|
||||
if (priv->mdev->coredev_type == MLX5_COREDEV_PF)
|
||||
mlx5_core_warn(priv->mdev, "firmware level support is missing\n");
|
||||
mlx5_core_dbg(priv->mdev, "firmware flow level support is missing\n");
|
||||
err = -EOPNOTSUPP;
|
||||
goto err_check;
|
||||
}
|
||||
|
@ -310,9 +310,9 @@ static void mlx5e_macsec_destroy_object(struct mlx5_core_dev *mdev, u32 macsec_o
|
||||
mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));
|
||||
}
|
||||
|
||||
static void mlx5e_macsec_cleanup_sa(struct mlx5e_macsec *macsec,
|
||||
struct mlx5e_macsec_sa *sa,
|
||||
bool is_tx, struct net_device *netdev, u32 fs_id)
|
||||
static void mlx5e_macsec_cleanup_sa_fs(struct mlx5e_macsec *macsec,
|
||||
struct mlx5e_macsec_sa *sa, bool is_tx,
|
||||
struct net_device *netdev, u32 fs_id)
|
||||
{
|
||||
int action = (is_tx) ? MLX5_ACCEL_MACSEC_ACTION_ENCRYPT :
|
||||
MLX5_ACCEL_MACSEC_ACTION_DECRYPT;
|
||||
@ -322,20 +322,49 @@ static void mlx5e_macsec_cleanup_sa(struct mlx5e_macsec *macsec,
|
||||
|
||||
mlx5_macsec_fs_del_rule(macsec->mdev->macsec_fs, sa->macsec_rule, action, netdev,
|
||||
fs_id);
|
||||
mlx5e_macsec_destroy_object(macsec->mdev, sa->macsec_obj_id);
|
||||
sa->macsec_rule = NULL;
|
||||
}
|
||||
|
||||
static void mlx5e_macsec_cleanup_sa(struct mlx5e_macsec *macsec,
|
||||
struct mlx5e_macsec_sa *sa, bool is_tx,
|
||||
struct net_device *netdev, u32 fs_id)
|
||||
{
|
||||
mlx5e_macsec_cleanup_sa_fs(macsec, sa, is_tx, netdev, fs_id);
|
||||
mlx5e_macsec_destroy_object(macsec->mdev, sa->macsec_obj_id);
|
||||
}
|
||||
|
||||
static int mlx5e_macsec_init_sa_fs(struct macsec_context *ctx,
|
||||
struct mlx5e_macsec_sa *sa, bool encrypt,
|
||||
bool is_tx, u32 *fs_id)
|
||||
{
|
||||
struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
|
||||
struct mlx5_macsec_fs *macsec_fs = priv->mdev->macsec_fs;
|
||||
struct mlx5_macsec_rule_attrs rule_attrs;
|
||||
union mlx5_macsec_rule *macsec_rule;
|
||||
|
||||
rule_attrs.macsec_obj_id = sa->macsec_obj_id;
|
||||
rule_attrs.sci = sa->sci;
|
||||
rule_attrs.assoc_num = sa->assoc_num;
|
||||
rule_attrs.action = (is_tx) ? MLX5_ACCEL_MACSEC_ACTION_ENCRYPT :
|
||||
MLX5_ACCEL_MACSEC_ACTION_DECRYPT;
|
||||
|
||||
macsec_rule = mlx5_macsec_fs_add_rule(macsec_fs, ctx, &rule_attrs, fs_id);
|
||||
if (!macsec_rule)
|
||||
return -ENOMEM;
|
||||
|
||||
sa->macsec_rule = macsec_rule;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5e_macsec_init_sa(struct macsec_context *ctx,
|
||||
struct mlx5e_macsec_sa *sa,
|
||||
bool encrypt, bool is_tx, u32 *fs_id)
|
||||
{
|
||||
struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
|
||||
struct mlx5e_macsec *macsec = priv->macsec;
|
||||
struct mlx5_macsec_rule_attrs rule_attrs;
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
struct mlx5_macsec_obj_attrs obj_attrs;
|
||||
union mlx5_macsec_rule *macsec_rule;
|
||||
int err;
|
||||
|
||||
obj_attrs.next_pn = sa->next_pn;
|
||||
@ -357,20 +386,12 @@ static int mlx5e_macsec_init_sa(struct macsec_context *ctx,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
rule_attrs.macsec_obj_id = sa->macsec_obj_id;
|
||||
rule_attrs.sci = sa->sci;
|
||||
rule_attrs.assoc_num = sa->assoc_num;
|
||||
rule_attrs.action = (is_tx) ? MLX5_ACCEL_MACSEC_ACTION_ENCRYPT :
|
||||
MLX5_ACCEL_MACSEC_ACTION_DECRYPT;
|
||||
|
||||
macsec_rule = mlx5_macsec_fs_add_rule(mdev->macsec_fs, ctx, &rule_attrs, fs_id);
|
||||
if (!macsec_rule) {
|
||||
err = -ENOMEM;
|
||||
goto destroy_macsec_object;
|
||||
if (sa->active) {
|
||||
err = mlx5e_macsec_init_sa_fs(ctx, sa, encrypt, is_tx, fs_id);
|
||||
if (err)
|
||||
goto destroy_macsec_object;
|
||||
}
|
||||
|
||||
sa->macsec_rule = macsec_rule;
|
||||
|
||||
return 0;
|
||||
|
||||
destroy_macsec_object:
|
||||
@ -526,9 +547,7 @@ static int mlx5e_macsec_add_txsa(struct macsec_context *ctx)
|
||||
goto destroy_sa;
|
||||
|
||||
macsec_device->tx_sa[assoc_num] = tx_sa;
|
||||
if (!secy->operational ||
|
||||
assoc_num != tx_sc->encoding_sa ||
|
||||
!tx_sa->active)
|
||||
if (!secy->operational)
|
||||
goto out;
|
||||
|
||||
err = mlx5e_macsec_init_sa(ctx, tx_sa, tx_sc->encrypt, true, NULL);
|
||||
@ -595,7 +614,7 @@ static int mlx5e_macsec_upd_txsa(struct macsec_context *ctx)
|
||||
goto out;
|
||||
|
||||
if (ctx_tx_sa->active) {
|
||||
err = mlx5e_macsec_init_sa(ctx, tx_sa, tx_sc->encrypt, true, NULL);
|
||||
err = mlx5e_macsec_init_sa_fs(ctx, tx_sa, tx_sc->encrypt, true, NULL);
|
||||
if (err)
|
||||
goto out;
|
||||
} else {
|
||||
@ -604,7 +623,7 @@ static int mlx5e_macsec_upd_txsa(struct macsec_context *ctx)
|
||||
goto out;
|
||||
}
|
||||
|
||||
mlx5e_macsec_cleanup_sa(macsec, tx_sa, true, ctx->secy->netdev, 0);
|
||||
mlx5e_macsec_cleanup_sa_fs(macsec, tx_sa, true, ctx->secy->netdev, 0);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&macsec->lock);
|
||||
@ -1030,8 +1049,9 @@ static int mlx5e_macsec_del_rxsa(struct macsec_context *ctx)
|
||||
goto out;
|
||||
}
|
||||
|
||||
mlx5e_macsec_cleanup_sa(macsec, rx_sa, false, ctx->secy->netdev,
|
||||
rx_sc->sc_xarray_element->fs_id);
|
||||
if (rx_sa->active)
|
||||
mlx5e_macsec_cleanup_sa(macsec, rx_sa, false, ctx->secy->netdev,
|
||||
rx_sc->sc_xarray_element->fs_id);
|
||||
mlx5_destroy_encryption_key(macsec->mdev, rx_sa->enc_key_id);
|
||||
kfree(rx_sa);
|
||||
rx_sc->rx_sa[assoc_num] = NULL;
|
||||
@ -1112,8 +1132,8 @@ static int macsec_upd_secy_hw_address(struct macsec_context *ctx,
|
||||
if (!rx_sa || !rx_sa->macsec_rule)
|
||||
continue;
|
||||
|
||||
mlx5e_macsec_cleanup_sa(macsec, rx_sa, false, ctx->secy->netdev,
|
||||
rx_sc->sc_xarray_element->fs_id);
|
||||
mlx5e_macsec_cleanup_sa_fs(macsec, rx_sa, false, ctx->secy->netdev,
|
||||
rx_sc->sc_xarray_element->fs_id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1124,8 +1144,8 @@ static int macsec_upd_secy_hw_address(struct macsec_context *ctx,
|
||||
continue;
|
||||
|
||||
if (rx_sa->active) {
|
||||
err = mlx5e_macsec_init_sa(ctx, rx_sa, true, false,
|
||||
&rx_sc->sc_xarray_element->fs_id);
|
||||
err = mlx5e_macsec_init_sa_fs(ctx, rx_sa, true, false,
|
||||
&rx_sc->sc_xarray_element->fs_id);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
@ -1178,7 +1198,7 @@ static int mlx5e_macsec_upd_secy(struct macsec_context *ctx)
|
||||
if (!tx_sa)
|
||||
continue;
|
||||
|
||||
mlx5e_macsec_cleanup_sa(macsec, tx_sa, true, ctx->secy->netdev, 0);
|
||||
mlx5e_macsec_cleanup_sa_fs(macsec, tx_sa, true, ctx->secy->netdev, 0);
|
||||
}
|
||||
|
||||
for (i = 0; i < MACSEC_NUM_AN; ++i) {
|
||||
@ -1187,7 +1207,7 @@ static int mlx5e_macsec_upd_secy(struct macsec_context *ctx)
|
||||
continue;
|
||||
|
||||
if (tx_sa->assoc_num == tx_sc->encoding_sa && tx_sa->active) {
|
||||
err = mlx5e_macsec_init_sa(ctx, tx_sa, tx_sc->encrypt, true, NULL);
|
||||
err = mlx5e_macsec_init_sa_fs(ctx, tx_sa, tx_sc->encrypt, true, NULL);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
|
@ -401,6 +401,8 @@ mlx5e_txwqe_complete(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
mlx5e_skb_cb_hwtstamp_init(skb);
|
||||
mlx5e_ptp_metadata_map_put(&sq->ptpsq->metadata_map, skb,
|
||||
metadata_index);
|
||||
/* ensure skb is put on metadata_map before tracking the index */
|
||||
wmb();
|
||||
mlx5e_ptpsq_track_metadata(sq->ptpsq, metadata_index);
|
||||
if (!netif_tx_queue_stopped(sq->txq) &&
|
||||
mlx5e_ptpsq_metadata_freelist_empty(sq->ptpsq)) {
|
||||
|
@ -152,7 +152,7 @@ void mlx5_esw_ipsec_restore_dest_uplink(struct mlx5_core_dev *mdev)
|
||||
|
||||
xa_for_each(&esw->offloads.vport_reps, i, rep) {
|
||||
rpriv = rep->rep_data[REP_ETH].priv;
|
||||
if (!rpriv || !rpriv->netdev || !atomic_read(&rpriv->tc_ht.nelems))
|
||||
if (!rpriv || !rpriv->netdev)
|
||||
continue;
|
||||
|
||||
rhashtable_walk_enter(&rpriv->tc_ht, &iter);
|
||||
|
@ -535,21 +535,26 @@ esw_src_port_rewrite_supported(struct mlx5_eswitch *esw)
|
||||
}
|
||||
|
||||
static bool
|
||||
esw_dests_to_vf_pf_vports(struct mlx5_flow_destination *dests, int max_dest)
|
||||
esw_dests_to_int_external(struct mlx5_flow_destination *dests, int max_dest)
|
||||
{
|
||||
bool vf_dest = false, pf_dest = false;
|
||||
bool internal_dest = false, external_dest = false;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < max_dest; i++) {
|
||||
if (dests[i].type != MLX5_FLOW_DESTINATION_TYPE_VPORT)
|
||||
if (dests[i].type != MLX5_FLOW_DESTINATION_TYPE_VPORT &&
|
||||
dests[i].type != MLX5_FLOW_DESTINATION_TYPE_UPLINK)
|
||||
continue;
|
||||
|
||||
if (dests[i].vport.num == MLX5_VPORT_UPLINK)
|
||||
pf_dest = true;
|
||||
/* Uplink dest is external, but considered as internal
|
||||
* if there is reformat because firmware uses LB+hairpin to support it.
|
||||
*/
|
||||
if (dests[i].vport.num == MLX5_VPORT_UPLINK &&
|
||||
!(dests[i].vport.flags & MLX5_FLOW_DEST_VPORT_REFORMAT_ID))
|
||||
external_dest = true;
|
||||
else
|
||||
vf_dest = true;
|
||||
internal_dest = true;
|
||||
|
||||
if (vf_dest && pf_dest)
|
||||
if (internal_dest && external_dest)
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -695,9 +700,9 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
||||
|
||||
/* Header rewrite with combined wire+loopback in FDB is not allowed */
|
||||
if ((flow_act.action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) &&
|
||||
esw_dests_to_vf_pf_vports(dest, i)) {
|
||||
esw_dests_to_int_external(dest, i)) {
|
||||
esw_warn(esw->dev,
|
||||
"FDB: Header rewrite with forwarding to both PF and VF is not allowed\n");
|
||||
"FDB: Header rewrite with forwarding to both internal and external dests is not allowed\n");
|
||||
rule = ERR_PTR(-EINVAL);
|
||||
goto err_esw_get;
|
||||
}
|
||||
@ -3658,22 +3663,6 @@ static int esw_inline_mode_to_devlink(u8 mlx5_mode, u8 *mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool esw_offloads_devlink_ns_eq_netdev_ns(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
struct net *devl_net, *netdev_net;
|
||||
bool ret = false;
|
||||
|
||||
mutex_lock(&dev->mlx5e_res.uplink_netdev_lock);
|
||||
if (dev->mlx5e_res.uplink_netdev) {
|
||||
netdev_net = dev_net(dev->mlx5e_res.uplink_netdev);
|
||||
devl_net = devlink_net(devlink);
|
||||
ret = net_eq(devl_net, netdev_net);
|
||||
}
|
||||
mutex_unlock(&dev->mlx5e_res.uplink_netdev_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mlx5_eswitch_block_mode(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_eswitch *esw = dev->priv.eswitch;
|
||||
@ -3718,13 +3707,6 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
|
||||
if (esw_mode_from_devlink(mode, &mlx5_mode))
|
||||
return -EINVAL;
|
||||
|
||||
if (mode == DEVLINK_ESWITCH_MODE_SWITCHDEV &&
|
||||
!esw_offloads_devlink_ns_eq_netdev_ns(devlink)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Can't change E-Switch mode to switchdev when netdev net namespace has diverged from the devlink's.");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
mlx5_lag_disable_change(esw->dev);
|
||||
err = mlx5_esw_try_lock(esw);
|
||||
if (err < 0) {
|
||||
|
@ -703,19 +703,30 @@ void mlx5_fw_reset_events_start(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
|
||||
|
||||
if (!fw_reset)
|
||||
return;
|
||||
|
||||
MLX5_NB_INIT(&fw_reset->nb, fw_reset_event_notifier, GENERAL_EVENT);
|
||||
mlx5_eq_notifier_register(dev, &fw_reset->nb);
|
||||
}
|
||||
|
||||
void mlx5_fw_reset_events_stop(struct mlx5_core_dev *dev)
|
||||
{
|
||||
mlx5_eq_notifier_unregister(dev, &dev->priv.fw_reset->nb);
|
||||
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
|
||||
|
||||
if (!fw_reset)
|
||||
return;
|
||||
|
||||
mlx5_eq_notifier_unregister(dev, &fw_reset->nb);
|
||||
}
|
||||
|
||||
void mlx5_drain_fw_reset(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
|
||||
|
||||
if (!fw_reset)
|
||||
return;
|
||||
|
||||
set_bit(MLX5_FW_RESET_FLAGS_DROP_NEW_REQUESTS, &fw_reset->reset_flags);
|
||||
cancel_work_sync(&fw_reset->fw_live_patch_work);
|
||||
cancel_work_sync(&fw_reset->reset_request_work);
|
||||
@ -733,9 +744,13 @@ static const struct devlink_param mlx5_fw_reset_devlink_params[] = {
|
||||
|
||||
int mlx5_fw_reset_init(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_fw_reset *fw_reset = kzalloc(sizeof(*fw_reset), GFP_KERNEL);
|
||||
struct mlx5_fw_reset *fw_reset;
|
||||
int err;
|
||||
|
||||
if (!MLX5_CAP_MCAM_REG(dev, mfrl))
|
||||
return 0;
|
||||
|
||||
fw_reset = kzalloc(sizeof(*fw_reset), GFP_KERNEL);
|
||||
if (!fw_reset)
|
||||
return -ENOMEM;
|
||||
fw_reset->wq = create_singlethread_workqueue("mlx5_fw_reset_events");
|
||||
@ -771,6 +786,9 @@ void mlx5_fw_reset_cleanup(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
|
||||
|
||||
if (!fw_reset)
|
||||
return;
|
||||
|
||||
devl_params_unregister(priv_to_devlink(dev),
|
||||
mlx5_fw_reset_devlink_params,
|
||||
ARRAY_SIZE(mlx5_fw_reset_devlink_params));
|
||||
|
@ -452,10 +452,10 @@ mlx5_fw_reporter_diagnose(struct devlink_health_reporter *reporter,
|
||||
struct health_buffer __iomem *h = health->health;
|
||||
u8 synd = ioread8(&h->synd);
|
||||
|
||||
devlink_fmsg_u8_pair_put(fmsg, "Syndrome", synd);
|
||||
if (!synd)
|
||||
return 0;
|
||||
|
||||
devlink_fmsg_u8_pair_put(fmsg, "Syndrome", synd);
|
||||
devlink_fmsg_string_pair_put(fmsg, "Description", hsynd_str(synd));
|
||||
|
||||
return 0;
|
||||
|
@ -347,10 +347,10 @@ int sparx5_del_mact_entry(struct sparx5 *sparx5,
|
||||
list) {
|
||||
if ((vid == 0 || mact_entry->vid == vid) &&
|
||||
ether_addr_equal(addr, mact_entry->mac)) {
|
||||
sparx5_mact_forget(sparx5, addr, mact_entry->vid);
|
||||
|
||||
list_del(&mact_entry->list);
|
||||
devm_kfree(sparx5->dev, mact_entry);
|
||||
|
||||
sparx5_mact_forget(sparx5, addr, mact_entry->vid);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&sparx5->mact_lock);
|
||||
|
@ -294,7 +294,7 @@ static void am65_cpsw_nuss_ndo_host_tx_timeout(struct net_device *ndev,
|
||||
txqueue,
|
||||
netif_tx_queue_stopped(netif_txq),
|
||||
jiffies_to_msecs(jiffies - trans_start),
|
||||
dql_avail(&netif_txq->dql),
|
||||
netdev_queue_dql_avail(netif_txq),
|
||||
k3_cppi_desc_pool_avail(tx_chn->desc_pool));
|
||||
|
||||
if (netif_tx_queue_stopped(netif_txq)) {
|
||||
|
@ -221,7 +221,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
|
||||
struct genevehdr *gnvh = geneve_hdr(skb);
|
||||
struct metadata_dst *tun_dst = NULL;
|
||||
unsigned int len;
|
||||
int err = 0;
|
||||
int nh, err = 0;
|
||||
void *oiph;
|
||||
|
||||
if (ip_tunnel_collect_metadata() || gs->collect_md) {
|
||||
@ -272,9 +272,23 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
}
|
||||
|
||||
oiph = skb_network_header(skb);
|
||||
/* Save offset of outer header relative to skb->head,
|
||||
* because we are going to reset the network header to the inner header
|
||||
* and might change skb->head.
|
||||
*/
|
||||
nh = skb_network_header(skb) - skb->head;
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
|
||||
if (!pskb_inet_may_pull(skb)) {
|
||||
DEV_STATS_INC(geneve->dev, rx_length_errors);
|
||||
DEV_STATS_INC(geneve->dev, rx_errors);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* Get the outer header. */
|
||||
oiph = skb->head + nh;
|
||||
|
||||
if (geneve_get_sk_family(gs) == AF_INET)
|
||||
err = IP_ECN_decapsulate(oiph, skb);
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
|
@ -3135,7 +3135,8 @@ static int lan78xx_open(struct net_device *net)
|
||||
done:
|
||||
mutex_unlock(&dev->dev_mutex);
|
||||
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
if (ret < 0)
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -122,15 +122,24 @@ struct dpll_pin_properties {
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_DPLL)
|
||||
size_t dpll_msg_pin_handle_size(struct dpll_pin *pin);
|
||||
int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin);
|
||||
void dpll_netdev_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin);
|
||||
void dpll_netdev_pin_clear(struct net_device *dev);
|
||||
|
||||
size_t dpll_netdev_pin_handle_size(const struct net_device *dev);
|
||||
int dpll_netdev_add_pin_handle(struct sk_buff *msg,
|
||||
const struct net_device *dev);
|
||||
#else
|
||||
static inline size_t dpll_msg_pin_handle_size(struct dpll_pin *pin)
|
||||
static inline void
|
||||
dpll_netdev_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin) { }
|
||||
static inline void dpll_netdev_pin_clear(struct net_device *dev) { }
|
||||
|
||||
static inline size_t dpll_netdev_pin_handle_size(const struct net_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
|
||||
static inline int
|
||||
dpll_netdev_add_pin_handle(struct sk_buff *msg, const struct net_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -169,13 +178,4 @@ int dpll_device_change_ntf(struct dpll_device *dpll);
|
||||
|
||||
int dpll_pin_change_ntf(struct dpll_pin *pin);
|
||||
|
||||
#if !IS_ENABLED(CONFIG_DPLL)
|
||||
static inline struct dpll_pin *netdev_dpll_pin(const struct net_device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
struct dpll_pin *netdev_dpll_pin(const struct net_device *dev);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -10261,7 +10261,9 @@ struct mlx5_ifc_mcam_access_reg_bits {
|
||||
|
||||
u8 regs_63_to_46[0x12];
|
||||
u8 mrtc[0x1];
|
||||
u8 regs_44_to_32[0xd];
|
||||
u8 regs_44_to_41[0x4];
|
||||
u8 mfrl[0x1];
|
||||
u8 regs_39_to_32[0x8];
|
||||
|
||||
u8 regs_31_to_10[0x16];
|
||||
u8 mtmp[0x1];
|
||||
|
@ -79,8 +79,6 @@ struct xdp_buff;
|
||||
struct xdp_frame;
|
||||
struct xdp_metadata_ops;
|
||||
struct xdp_md;
|
||||
/* DPLL specific */
|
||||
struct dpll_pin;
|
||||
|
||||
typedef u32 xdp_features_t;
|
||||
|
||||
@ -3499,6 +3497,16 @@ static inline void netdev_queue_set_dql_min_limit(struct netdev_queue *dev_queue
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int netdev_queue_dql_avail(const struct netdev_queue *txq)
|
||||
{
|
||||
#ifdef CONFIG_BQL
|
||||
/* Non-BQL migrated drivers will return 0, too. */
|
||||
return dql_avail(&txq->dql);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* netdev_txq_bql_enqueue_prefetchw - prefetch bql data for write
|
||||
* @dev_queue: pointer to transmit queue
|
||||
@ -4032,8 +4040,6 @@ int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name);
|
||||
int dev_get_port_parent_id(struct net_device *dev,
|
||||
struct netdev_phys_item_id *ppid, bool recurse);
|
||||
bool netdev_port_same_parent_id(struct net_device *a, struct net_device *b);
|
||||
void netdev_dpll_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin);
|
||||
void netdev_dpll_pin_clear(struct net_device *dev);
|
||||
|
||||
struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *dev, bool *again);
|
||||
struct sk_buff *dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
|
@ -238,12 +238,7 @@ static inline bool qdisc_may_bulk(const struct Qdisc *qdisc)
|
||||
|
||||
static inline int qdisc_avail_bulklimit(const struct netdev_queue *txq)
|
||||
{
|
||||
#ifdef CONFIG_BQL
|
||||
/* Non-BQL migrated drivers will return 0, too. */
|
||||
return dql_avail(&txq->dql);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
return netdev_queue_dql_avail(txq);
|
||||
}
|
||||
|
||||
struct Qdisc_class_ops {
|
||||
|
@ -81,14 +81,14 @@ TRACE_EVENT(qdisc_reset,
|
||||
TP_ARGS(q),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( dev, qdisc_dev(q) )
|
||||
__string( kind, q->ops->id )
|
||||
__field( u32, parent )
|
||||
__field( u32, handle )
|
||||
__string( dev, qdisc_dev(q)->name )
|
||||
__string( kind, q->ops->id )
|
||||
__field( u32, parent )
|
||||
__field( u32, handle )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, qdisc_dev(q));
|
||||
__assign_str(dev, qdisc_dev(q)->name);
|
||||
__assign_str(kind, q->ops->id);
|
||||
__entry->parent = q->parent;
|
||||
__entry->handle = q->handle;
|
||||
@ -106,14 +106,14 @@ TRACE_EVENT(qdisc_destroy,
|
||||
TP_ARGS(q),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( dev, qdisc_dev(q) )
|
||||
__string( kind, q->ops->id )
|
||||
__field( u32, parent )
|
||||
__field( u32, handle )
|
||||
__string( dev, qdisc_dev(q)->name )
|
||||
__string( kind, q->ops->id )
|
||||
__field( u32, parent )
|
||||
__field( u32, handle )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, qdisc_dev(q));
|
||||
__assign_str(dev, qdisc_dev(q)->name);
|
||||
__assign_str(kind, q->ops->id);
|
||||
__entry->parent = q->parent;
|
||||
__entry->handle = q->handle;
|
||||
|
@ -178,7 +178,7 @@ static int cpu_map_bpf_prog_run_xdp(struct bpf_cpu_map_entry *rcpu,
|
||||
void **frames, int n,
|
||||
struct xdp_cpumap_stats *stats)
|
||||
{
|
||||
struct xdp_rxq_info rxq;
|
||||
struct xdp_rxq_info rxq = {};
|
||||
struct xdp_buff xdp;
|
||||
int i, nframes = 0;
|
||||
|
||||
|
@ -16602,6 +16602,9 @@ static bool func_states_equal(struct bpf_verifier_env *env, struct bpf_func_stat
|
||||
{
|
||||
int i;
|
||||
|
||||
if (old->callback_depth > cur->callback_depth)
|
||||
return false;
|
||||
|
||||
for (i = 0; i < MAX_BPF_REG; i++)
|
||||
if (!regsafe(env, &old->regs[i], &cur->regs[i],
|
||||
&env->idmap_scratch, exact))
|
||||
|
@ -9074,28 +9074,6 @@ bool netdev_port_same_parent_id(struct net_device *a, struct net_device *b)
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_port_same_parent_id);
|
||||
|
||||
static void netdev_dpll_pin_assign(struct net_device *dev, struct dpll_pin *dpll_pin)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_DPLL)
|
||||
rtnl_lock();
|
||||
rcu_assign_pointer(dev->dpll_pin, dpll_pin);
|
||||
rtnl_unlock();
|
||||
#endif
|
||||
}
|
||||
|
||||
void netdev_dpll_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin)
|
||||
{
|
||||
WARN_ON(!dpll_pin);
|
||||
netdev_dpll_pin_assign(dev, dpll_pin);
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_dpll_pin_set);
|
||||
|
||||
void netdev_dpll_pin_clear(struct net_device *dev)
|
||||
{
|
||||
netdev_dpll_pin_assign(dev, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_dpll_pin_clear);
|
||||
|
||||
/**
|
||||
* dev_change_proto_down - set carrier according to proto_down.
|
||||
*
|
||||
|
@ -94,11 +94,12 @@ netdev_nl_page_pool_get_dump(struct sk_buff *skb, struct netlink_callback *cb,
|
||||
state->pp_id = pool->user.id;
|
||||
err = fill(skb, pool, info);
|
||||
if (err)
|
||||
break;
|
||||
goto out;
|
||||
}
|
||||
|
||||
state->pp_id = 0;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&page_pools_lock);
|
||||
rtnl_unlock();
|
||||
|
||||
|
@ -1057,7 +1057,7 @@ static size_t rtnl_dpll_pin_size(const struct net_device *dev)
|
||||
{
|
||||
size_t size = nla_total_size(0); /* nest IFLA_DPLL_PIN */
|
||||
|
||||
size += dpll_msg_pin_handle_size(netdev_dpll_pin(dev));
|
||||
size += dpll_netdev_pin_handle_size(dev);
|
||||
|
||||
return size;
|
||||
}
|
||||
@ -1792,7 +1792,7 @@ static int rtnl_fill_dpll_pin(struct sk_buff *skb,
|
||||
if (!dpll_pin_nest)
|
||||
return -EMSGSIZE;
|
||||
|
||||
ret = dpll_msg_add_pin_handle(skb, netdev_dpll_pin(dev));
|
||||
ret = dpll_netdev_add_pin_handle(skb, dev);
|
||||
if (ret < 0)
|
||||
goto nest_cancel;
|
||||
|
||||
|
@ -5332,19 +5332,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
|
||||
err_nh = NULL;
|
||||
list_for_each_entry(nh, &rt6_nh_list, next) {
|
||||
err = __ip6_ins_rt(nh->fib6_info, info, extack);
|
||||
fib6_info_release(nh->fib6_info);
|
||||
|
||||
if (!err) {
|
||||
/* save reference to last route successfully inserted */
|
||||
rt_last = nh->fib6_info;
|
||||
|
||||
/* save reference to first route for notification */
|
||||
if (!rt_notif)
|
||||
rt_notif = nh->fib6_info;
|
||||
}
|
||||
|
||||
/* nh->fib6_info is used or freed at this point, reset to NULL*/
|
||||
nh->fib6_info = NULL;
|
||||
if (err) {
|
||||
if (replace && nhn)
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
@ -5352,6 +5340,12 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
|
||||
err_nh = nh;
|
||||
goto add_errout;
|
||||
}
|
||||
/* save reference to last route successfully inserted */
|
||||
rt_last = nh->fib6_info;
|
||||
|
||||
/* save reference to first route for notification */
|
||||
if (!rt_notif)
|
||||
rt_notif = nh->fib6_info;
|
||||
|
||||
/* Because each route is added like a single route we remove
|
||||
* these flags after the first nexthop: if there is a collision,
|
||||
@ -5412,8 +5406,7 @@ add_errout:
|
||||
|
||||
cleanup:
|
||||
list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) {
|
||||
if (nh->fib6_info)
|
||||
fib6_info_release(nh->fib6_info);
|
||||
fib6_info_release(nh->fib6_info);
|
||||
list_del(&nh->next);
|
||||
kfree(nh);
|
||||
}
|
||||
|
@ -533,6 +533,8 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
|
||||
/* Get fields bitmap */
|
||||
if (nf_h323_error_boundary(bs, 0, f->sz))
|
||||
return H323_ERROR_BOUND;
|
||||
if (f->sz > 32)
|
||||
return H323_ERROR_RANGE;
|
||||
bmp = get_bitmap(bs, f->sz);
|
||||
if (base)
|
||||
*(unsigned int *)base = bmp;
|
||||
@ -589,6 +591,8 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
|
||||
bmp2_len = get_bits(bs, 7) + 1;
|
||||
if (nf_h323_error_boundary(bs, 0, bmp2_len))
|
||||
return H323_ERROR_BOUND;
|
||||
if (bmp2_len > 32)
|
||||
return H323_ERROR_RANGE;
|
||||
bmp2 = get_bitmap(bs, bmp2_len);
|
||||
bmp |= bmp2 >> f->sz;
|
||||
if (base)
|
||||
|
@ -5001,6 +5001,12 @@ static int nf_tables_newset(struct sk_buff *skb, const struct nfnl_info *info,
|
||||
if ((flags & (NFT_SET_EVAL | NFT_SET_OBJECT)) ==
|
||||
(NFT_SET_EVAL | NFT_SET_OBJECT))
|
||||
return -EOPNOTSUPP;
|
||||
if ((flags & (NFT_SET_ANONYMOUS | NFT_SET_TIMEOUT | NFT_SET_EVAL)) ==
|
||||
(NFT_SET_ANONYMOUS | NFT_SET_TIMEOUT))
|
||||
return -EOPNOTSUPP;
|
||||
if ((flags & (NFT_SET_CONSTANT | NFT_SET_TIMEOUT)) ==
|
||||
(NFT_SET_CONSTANT | NFT_SET_TIMEOUT))
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
desc.dtype = 0;
|
||||
@ -5424,6 +5430,7 @@ static void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
|
||||
|
||||
if (list_empty(&set->bindings) && nft_set_is_anonymous(set)) {
|
||||
list_del_rcu(&set->list);
|
||||
set->dead = 1;
|
||||
if (event)
|
||||
nf_tables_set_notify(ctx, set, NFT_MSG_DELSET,
|
||||
GFP_KERNEL);
|
||||
|
@ -1256,14 +1256,13 @@ static int nft_ct_expect_obj_init(const struct nft_ctx *ctx,
|
||||
switch (priv->l3num) {
|
||||
case NFPROTO_IPV4:
|
||||
case NFPROTO_IPV6:
|
||||
if (priv->l3num != ctx->family)
|
||||
return -EINVAL;
|
||||
if (priv->l3num == ctx->family || ctx->family == NFPROTO_INET)
|
||||
break;
|
||||
|
||||
fallthrough;
|
||||
case NFPROTO_INET:
|
||||
break;
|
||||
return -EINVAL;
|
||||
case NFPROTO_INET: /* tuple.src.l3num supports NFPROTO_IPV4/6 only */
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
priv->l4proto = nla_get_u8(tb[NFTA_CT_EXPECT_L4PROTO]);
|
||||
|
@ -453,16 +453,16 @@ static int nr_create(struct net *net, struct socket *sock, int protocol,
|
||||
nr_init_timers(sk);
|
||||
|
||||
nr->t1 =
|
||||
msecs_to_jiffies(sysctl_netrom_transport_timeout);
|
||||
msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_timeout));
|
||||
nr->t2 =
|
||||
msecs_to_jiffies(sysctl_netrom_transport_acknowledge_delay);
|
||||
msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_acknowledge_delay));
|
||||
nr->n2 =
|
||||
msecs_to_jiffies(sysctl_netrom_transport_maximum_tries);
|
||||
msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_maximum_tries));
|
||||
nr->t4 =
|
||||
msecs_to_jiffies(sysctl_netrom_transport_busy_delay);
|
||||
msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_busy_delay));
|
||||
nr->idle =
|
||||
msecs_to_jiffies(sysctl_netrom_transport_no_activity_timeout);
|
||||
nr->window = sysctl_netrom_transport_requested_window_size;
|
||||
msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_no_activity_timeout));
|
||||
nr->window = READ_ONCE(sysctl_netrom_transport_requested_window_size);
|
||||
|
||||
nr->bpqext = 1;
|
||||
nr->state = NR_STATE_0;
|
||||
@ -954,7 +954,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
|
||||
* G8PZT's Xrouter which is sending packets with command type 7
|
||||
* as an extension of the protocol.
|
||||
*/
|
||||
if (sysctl_netrom_reset_circuit &&
|
||||
if (READ_ONCE(sysctl_netrom_reset_circuit) &&
|
||||
(frametype != NR_RESET || flags != 0))
|
||||
nr_transmit_reset(skb, 1);
|
||||
|
||||
|
@ -81,7 +81,7 @@ static int nr_header(struct sk_buff *skb, struct net_device *dev,
|
||||
buff[6] |= AX25_SSSID_SPARE;
|
||||
buff += AX25_ADDR_LEN;
|
||||
|
||||
*buff++ = sysctl_netrom_network_ttl_initialiser;
|
||||
*buff++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
|
||||
|
||||
*buff++ = NR_PROTO_IP;
|
||||
*buff++ = NR_PROTO_IP;
|
||||
|
@ -97,7 +97,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
|
||||
break;
|
||||
|
||||
case NR_RESET:
|
||||
if (sysctl_netrom_reset_circuit)
|
||||
if (READ_ONCE(sysctl_netrom_reset_circuit))
|
||||
nr_disconnect(sk, ECONNRESET);
|
||||
break;
|
||||
|
||||
@ -128,7 +128,7 @@ static int nr_state2_machine(struct sock *sk, struct sk_buff *skb,
|
||||
break;
|
||||
|
||||
case NR_RESET:
|
||||
if (sysctl_netrom_reset_circuit)
|
||||
if (READ_ONCE(sysctl_netrom_reset_circuit))
|
||||
nr_disconnect(sk, ECONNRESET);
|
||||
break;
|
||||
|
||||
@ -262,7 +262,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
|
||||
break;
|
||||
|
||||
case NR_RESET:
|
||||
if (sysctl_netrom_reset_circuit)
|
||||
if (READ_ONCE(sysctl_netrom_reset_circuit))
|
||||
nr_disconnect(sk, ECONNRESET);
|
||||
break;
|
||||
|
||||
|
@ -204,7 +204,7 @@ void nr_transmit_buffer(struct sock *sk, struct sk_buff *skb)
|
||||
dptr[6] |= AX25_SSSID_SPARE;
|
||||
dptr += AX25_ADDR_LEN;
|
||||
|
||||
*dptr++ = sysctl_netrom_network_ttl_initialiser;
|
||||
*dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
|
||||
|
||||
if (!nr_route_frame(skb, NULL)) {
|
||||
kfree_skb(skb);
|
||||
|
@ -153,7 +153,7 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
|
||||
nr_neigh->digipeat = NULL;
|
||||
nr_neigh->ax25 = NULL;
|
||||
nr_neigh->dev = dev;
|
||||
nr_neigh->quality = sysctl_netrom_default_path_quality;
|
||||
nr_neigh->quality = READ_ONCE(sysctl_netrom_default_path_quality);
|
||||
nr_neigh->locked = 0;
|
||||
nr_neigh->count = 0;
|
||||
nr_neigh->number = nr_neigh_no++;
|
||||
@ -728,7 +728,7 @@ void nr_link_failed(ax25_cb *ax25, int reason)
|
||||
nr_neigh->ax25 = NULL;
|
||||
ax25_cb_put(ax25);
|
||||
|
||||
if (++nr_neigh->failed < sysctl_netrom_link_fails_count) {
|
||||
if (++nr_neigh->failed < READ_ONCE(sysctl_netrom_link_fails_count)) {
|
||||
nr_neigh_put(nr_neigh);
|
||||
return;
|
||||
}
|
||||
@ -766,7 +766,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
|
||||
if (ax25 != NULL) {
|
||||
ret = nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat,
|
||||
ax25->ax25_dev->dev, 0,
|
||||
sysctl_netrom_obsolescence_count_initialiser);
|
||||
READ_ONCE(sysctl_netrom_obsolescence_count_initialiser));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@ -780,7 +780,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!sysctl_netrom_routing_control && ax25 != NULL)
|
||||
if (!READ_ONCE(sysctl_netrom_routing_control) && ax25 != NULL)
|
||||
return 0;
|
||||
|
||||
/* Its Time-To-Live has expired */
|
||||
|
@ -182,7 +182,8 @@ void nr_write_internal(struct sock *sk, int frametype)
|
||||
*dptr++ = nr->my_id;
|
||||
*dptr++ = frametype;
|
||||
*dptr++ = nr->window;
|
||||
if (nr->bpqext) *dptr++ = sysctl_netrom_network_ttl_initialiser;
|
||||
if (nr->bpqext)
|
||||
*dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
|
||||
break;
|
||||
|
||||
case NR_DISCREQ:
|
||||
@ -236,7 +237,7 @@ void __nr_transmit_reply(struct sk_buff *skb, int mine, unsigned char cmdflags)
|
||||
dptr[6] |= AX25_SSSID_SPARE;
|
||||
dptr += AX25_ADDR_LEN;
|
||||
|
||||
*dptr++ = sysctl_netrom_network_ttl_initialiser;
|
||||
*dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
|
||||
|
||||
if (mine) {
|
||||
*dptr++ = 0;
|
||||
|
@ -301,6 +301,9 @@ static int __rds_rdma_map(struct rds_sock *rs, struct rds_get_mr_args *args,
|
||||
kfree(sg);
|
||||
}
|
||||
ret = PTR_ERR(trans_private);
|
||||
/* Trigger connection so that its ready for the next retry */
|
||||
if (ret == -ENODEV)
|
||||
rds_conn_connect_if_down(cp->cp_conn);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -1313,12 +1313,8 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
|
||||
|
||||
/* Parse any control messages the user may have included. */
|
||||
ret = rds_cmsg_send(rs, rm, msg, &allocated_mr, &vct);
|
||||
if (ret) {
|
||||
/* Trigger connection so that its ready for the next retry */
|
||||
if (ret == -EAGAIN)
|
||||
rds_conn_connect_if_down(conn);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (rm->rdma.op_active && !conn->c_trans->xmit_rdma) {
|
||||
printk_ratelimited(KERN_NOTICE "rdma_op %p conn xmit_rdma %p\n",
|
||||
|
@ -407,7 +407,7 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x)
|
||||
struct xfrm_dst *xdst = (struct xfrm_dst *)dst;
|
||||
struct net_device *dev = x->xso.dev;
|
||||
|
||||
if (!x->type_offload || x->encap)
|
||||
if (!x->type_offload)
|
||||
return false;
|
||||
|
||||
if (x->xso.type == XFRM_DEV_OFFLOAD_PACKET ||
|
||||
|
@ -704,9 +704,13 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct net *net = dev_net(skb_dst(skb)->dev);
|
||||
struct xfrm_state *x = skb_dst(skb)->xfrm;
|
||||
int family;
|
||||
int err;
|
||||
|
||||
switch (x->outer_mode.family) {
|
||||
family = (x->xso.type != XFRM_DEV_OFFLOAD_PACKET) ? x->outer_mode.family
|
||||
: skb_dst(skb)->ops->family;
|
||||
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
|
||||
IPCB(skb)->flags |= IPSKB_XFRM_TRANSFORMED;
|
||||
|
@ -2694,7 +2694,9 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
|
||||
if (xfrm[i]->props.smark.v || xfrm[i]->props.smark.m)
|
||||
mark = xfrm_smark_get(fl->flowi_mark, xfrm[i]);
|
||||
|
||||
family = xfrm[i]->props.family;
|
||||
if (xfrm[i]->xso.type != XFRM_DEV_OFFLOAD_PACKET)
|
||||
family = xfrm[i]->props.family;
|
||||
|
||||
oif = fl->flowi_oif ? : fl->flowi_l3mdev;
|
||||
dst = xfrm_dst_lookup(xfrm[i], tos, oif,
|
||||
&saddr, &daddr, family, mark);
|
||||
@ -3416,7 +3418,7 @@ decode_session4(const struct xfrm_flow_keys *flkeys, struct flowi *fl, bool reve
|
||||
}
|
||||
|
||||
fl4->flowi4_proto = flkeys->basic.ip_proto;
|
||||
fl4->flowi4_tos = flkeys->ip.tos;
|
||||
fl4->flowi4_tos = flkeys->ip.tos & ~INET_ECN_MASK;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
|
@ -2017,6 +2017,9 @@ static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb)
|
||||
if (xp->xfrm_nr == 0)
|
||||
return 0;
|
||||
|
||||
if (xp->xfrm_nr > XFRM_MAX_DEPTH)
|
||||
return -ENOBUFS;
|
||||
|
||||
for (i = 0; i < xp->xfrm_nr; i++) {
|
||||
struct xfrm_user_tmpl *up = &vec[i];
|
||||
struct xfrm_tmpl *kp = &xp->xfrm_vec[i];
|
||||
|
@ -511,7 +511,7 @@ static void test_xdp_bonding_features(struct skeletons *skeletons)
|
||||
if (!ASSERT_OK(err, "bond bpf_xdp_query"))
|
||||
goto out;
|
||||
|
||||
if (!ASSERT_EQ(query_opts.feature_flags, NETDEV_XDP_ACT_MASK,
|
||||
if (!ASSERT_EQ(query_opts.feature_flags, 0,
|
||||
"bond query_opts.feature_flags"))
|
||||
goto out;
|
||||
|
||||
@ -601,7 +601,7 @@ static void test_xdp_bonding_features(struct skeletons *skeletons)
|
||||
if (!ASSERT_OK(err, "bond bpf_xdp_query"))
|
||||
goto out;
|
||||
|
||||
ASSERT_EQ(query_opts.feature_flags, NETDEV_XDP_ACT_MASK,
|
||||
ASSERT_EQ(query_opts.feature_flags, 0,
|
||||
"bond query_opts.feature_flags");
|
||||
out:
|
||||
bpf_link__destroy(link);
|
||||
|
@ -239,4 +239,74 @@ int bpf_loop_iter_limit_nested(void *unused)
|
||||
return 1000 * a + b + c;
|
||||
}
|
||||
|
||||
struct iter_limit_bug_ctx {
|
||||
__u64 a;
|
||||
__u64 b;
|
||||
__u64 c;
|
||||
};
|
||||
|
||||
static __naked void iter_limit_bug_cb(void)
|
||||
{
|
||||
/* This is the same as C code below, but written
|
||||
* in assembly to control which branches are fall-through.
|
||||
*
|
||||
* switch (bpf_get_prandom_u32()) {
|
||||
* case 1: ctx->a = 42; break;
|
||||
* case 2: ctx->b = 42; break;
|
||||
* default: ctx->c = 42; break;
|
||||
* }
|
||||
*/
|
||||
asm volatile (
|
||||
"r9 = r2;"
|
||||
"call %[bpf_get_prandom_u32];"
|
||||
"r1 = r0;"
|
||||
"r2 = 42;"
|
||||
"r0 = 0;"
|
||||
"if r1 == 0x1 goto 1f;"
|
||||
"if r1 == 0x2 goto 2f;"
|
||||
"*(u64 *)(r9 + 16) = r2;"
|
||||
"exit;"
|
||||
"1: *(u64 *)(r9 + 0) = r2;"
|
||||
"exit;"
|
||||
"2: *(u64 *)(r9 + 8) = r2;"
|
||||
"exit;"
|
||||
:
|
||||
: __imm(bpf_get_prandom_u32)
|
||||
: __clobber_all
|
||||
);
|
||||
}
|
||||
|
||||
SEC("tc")
|
||||
__failure
|
||||
__flag(BPF_F_TEST_STATE_FREQ)
|
||||
int iter_limit_bug(struct __sk_buff *skb)
|
||||
{
|
||||
struct iter_limit_bug_ctx ctx = { 7, 7, 7 };
|
||||
|
||||
bpf_loop(2, iter_limit_bug_cb, &ctx, 0);
|
||||
|
||||
/* This is the same as C code below,
|
||||
* written in assembly to guarantee checks order.
|
||||
*
|
||||
* if (ctx.a == 42 && ctx.b == 42 && ctx.c == 7)
|
||||
* asm volatile("r1 /= 0;":::"r1");
|
||||
*/
|
||||
asm volatile (
|
||||
"r1 = *(u64 *)%[ctx_a];"
|
||||
"if r1 != 42 goto 1f;"
|
||||
"r1 = *(u64 *)%[ctx_b];"
|
||||
"if r1 != 42 goto 1f;"
|
||||
"r1 = *(u64 *)%[ctx_c];"
|
||||
"if r1 != 7 goto 1f;"
|
||||
"r1 /= 0;"
|
||||
"1:"
|
||||
:
|
||||
: [ctx_a]"m"(ctx.a),
|
||||
[ctx_b]"m"(ctx.b),
|
||||
[ctx_c]"m"(ctx.c)
|
||||
: "r1"
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
@ -69,7 +69,7 @@ __chk_nr()
|
||||
else
|
||||
echo "[ fail ] expected $expected found $nr"
|
||||
mptcp_lib_result_fail "${msg}"
|
||||
ret=$test_cnt
|
||||
ret=${KSFT_FAIL}
|
||||
fi
|
||||
else
|
||||
echo "[ ok ]"
|
||||
@ -96,8 +96,8 @@ chk_listener_nr()
|
||||
local expected=$1
|
||||
local msg="$2"
|
||||
|
||||
__chk_nr "ss -inmlHMON $ns | wc -l" "$expected" "$msg - mptcp" 0
|
||||
__chk_nr "ss -inmlHtON $ns | wc -l" "$expected" "$msg - subflows"
|
||||
__chk_nr "ss -nlHMON $ns | wc -l" "$expected" "$msg - mptcp" 0
|
||||
__chk_nr "ss -nlHtON $ns | wc -l" "$expected" "$msg - subflows"
|
||||
}
|
||||
|
||||
wait_msk_nr()
|
||||
@ -124,11 +124,11 @@ wait_msk_nr()
|
||||
if [ $i -ge $timeout ]; then
|
||||
echo "[ fail ] timeout while expecting $expected max $max last $nr"
|
||||
mptcp_lib_result_fail "${msg} # timeout"
|
||||
ret=$test_cnt
|
||||
ret=${KSFT_FAIL}
|
||||
elif [ $nr != $expected ]; then
|
||||
echo "[ fail ] expected $expected found $nr"
|
||||
mptcp_lib_result_fail "${msg} # unexpected result"
|
||||
ret=$test_cnt
|
||||
ret=${KSFT_FAIL}
|
||||
else
|
||||
echo "[ ok ]"
|
||||
mptcp_lib_result_pass "${msg}"
|
||||
@ -304,10 +304,7 @@ for I in $(seq 1 $NR_SERVERS); do
|
||||
ip netns exec $ns ./mptcp_connect -p $((I + 20001)) \
|
||||
-t ${timeout_poll} -l 0.0.0.0 >/dev/null 2>&1 &
|
||||
done
|
||||
|
||||
for I in $(seq 1 $NR_SERVERS); do
|
||||
mptcp_lib_wait_local_port_listen $ns $((I + 20001))
|
||||
done
|
||||
mptcp_lib_wait_local_port_listen $ns $((NR_SERVERS + 20001))
|
||||
|
||||
chk_listener_nr $NR_SERVERS "many listener sockets"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user