mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
Including fix from Andrii for the issue mentioned in our net-next PR,
the rest is unremarkable. Current release - regressions: - virtio_net: fix missed error path rtnl_unlock after control queue locking rework Current release - new code bugs: - bpf: fix KASAN slab-out-of-bounds in percpu_array_map_gen_lookup, caused by missing nested map handling - drv: dsa: correct initialization order for KSZ88x3 ports Previous releases - regressions: - af_packet: do not call packet_read_pending() from tpacket_destruct_skb() fix performance regression - ipv6: fix route deleting failure when metric equals 0, don't assume 0 means not set / default in this case Previous releases - always broken: - bridge: couple of syzbot-driven fixes Signed-off-by: Jakub Kicinski <kuba@kernel.org> -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE6jPA+I1ugmIBA4hXMUZtbf5SIrsFAmZHtJQACgkQMUZtbf5S Irsfyw//ZhCFzvXKLENNalHHMXwq7DsuXe6KWlljEOzLHH0/9QqqNC9ggYKRI5OE unB//YC3sqtAUczQnED+UOh553Pu4Kvq9334LTX5m4HJQTYLLq1aGM/UZplsBTHx 3MsXUApYFth8pqCZvIcKOZcOddeViBfzEQ9jEAsgIyaqFy3XaiH4Zf6pJAAMyUbE 19CRiK/1TYNrX01XPOeV/9vYGj9rzepo6S5zpHKsWsFZArCcRPBsea/KWYYfLjW7 ExA2Cb+eUnPkNL4bTeH6dwgQGVL8Jo/OsKmsa/tdQffnj1pshdePXtP3TBEynMJF jSSwwUMq56yE+uok4karE3wIhciUEYvTwfgt5FErYVqfqDiX1+7AZGtdZVDX/mgH F0etKHDhX9F1zxHVMFwOMA4rLN6cvfpe7Pg+dt4B9E0o18SyNekOM1Ngdu/1ALtd QV41JFHweHInDRrMLdj4aWW4EYPR5SUuvg66Pec4T7x5hAAapzIJySS+RIydC+ND guPztYxO5cn5Q7kug1FyUBSXUXZxuCNRACb6zD4/4wbVRZhz7l3OTcd13QADCiwv Tr61r2bS1Bp/HZ3iIHBY85JnKMvpdwNXN2SPsYQQwVrv9FLj9iskH9kjwqVDG4ja W3ivZZM+CcZbnB81JynK7Ge54PT+SiPy3Nw4RIVxFl1QlzXC21E= =7eys -----END PGP SIGNATURE----- Merge tag 'net-6.10-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Jakub Kicinski: "Current release - regressions: - virtio_net: fix missed error path rtnl_unlock after control queue locking rework Current release - new code bugs: - bpf: fix KASAN slab-out-of-bounds in percpu_array_map_gen_lookup, caused by missing nested map handling - drv: dsa: correct initialization order for KSZ88x3 ports Previous releases - regressions: - af_packet: do not call packet_read_pending() from tpacket_destruct_skb() fix performance regression - ipv6: fix route deleting failure when metric equals 0, don't assume 0 means not set / default in this case Previous releases - always broken: - bridge: couple of syzbot-driven fixes" * tag 'net-6.10-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (30 commits) selftests: net: local_termination: annotate the expected failures net: dsa: microchip: Correct initialization order for KSZ88x3 ports MAINTAINERS: net: Update reviewers for TI's Ethernet drivers dt-bindings: net: ti: Update maintainers list l2tp: fix ICMP error handling for UDP-encap sockets net: txgbe: fix to control VLAN strip net: wangxun: match VLAN CTAG and STAG features net: wangxun: fix to change Rx features af_packet: do not call packet_read_pending() from tpacket_destruct_skb() virtio_net: Fix missed rtnl_unlock netrom: fix possible dead-lock in nr_rt_ioctl() idpf: don't skip over ethtool tcp-data-split setting dt-bindings: net: qcom: ethernet: Allow dma-coherent bonding: fix oops during rmmod net/ipv6: Fix route deleting failure when metric equals 0 selftests/net: reduce xfrm_policy test time selftests/bpf: Adjust btf_dump test to reflect recent change in file_operations selftests/bpf: Adjust test_access_variable_array after a kernel function name change selftests/net/lib: no need to record ns name if it already exist net: qrtr: ns: Fix module refcnt ...
This commit is contained in:
commit
f08a1e912d
@ -301,8 +301,9 @@ Arithmetic instructions
|
||||
``ALU`` uses 32-bit wide operands while ``ALU64`` uses 64-bit wide operands for
|
||||
otherwise identical operations. ``ALU64`` instructions belong to the
|
||||
base64 conformance group unless noted otherwise.
|
||||
The 'code' field encodes the operation as below, where 'src' and 'dst' refer
|
||||
to the values of the source and destination registers, respectively.
|
||||
The 'code' field encodes the operation as below, where 'src' refers to the
|
||||
the source operand and 'dst' refers to the value of the destination
|
||||
register.
|
||||
|
||||
===== ===== ======= ==========================================================
|
||||
name code offset description
|
||||
|
@ -61,6 +61,8 @@ properties:
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
dma-coherent: true
|
||||
|
||||
phys: true
|
||||
|
||||
phy-names:
|
||||
|
@ -8,7 +8,6 @@ title: TI SoC Ethernet Switch Controller (CPSW)
|
||||
|
||||
maintainers:
|
||||
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
||||
- Ravi Gunasekaran <r-gunasekaran@ti.com>
|
||||
- Roger Quadros <rogerq@kernel.org>
|
||||
|
||||
description:
|
||||
|
@ -8,7 +8,6 @@ title: The TI AM654x/J721E/AM642x SoC Gigabit Ethernet MAC (Media Access Control
|
||||
|
||||
maintainers:
|
||||
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
||||
- Ravi Gunasekaran <r-gunasekaran@ti.com>
|
||||
- Roger Quadros <rogerq@kernel.org>
|
||||
|
||||
description:
|
||||
|
@ -8,7 +8,6 @@ title: The TI AM654x/J721E Common Platform Time Sync (CPTS) module
|
||||
|
||||
maintainers:
|
||||
- Siddharth Vadapalli <s-vadapalli@ti.com>
|
||||
- Ravi Gunasekaran <r-gunasekaran@ti.com>
|
||||
- Roger Quadros <rogerq@kernel.org>
|
||||
|
||||
description: |+
|
||||
|
@ -3815,7 +3815,7 @@ F: arch/arm/net/
|
||||
BPF JIT for ARM64
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
M: Alexei Starovoitov <ast@kernel.org>
|
||||
M: Zi Shen Lim <zlim.lnx@gmail.com>
|
||||
M: Puranjay Mohan <puranjay@kernel.org>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/arm64/net/
|
||||
@ -22392,7 +22392,6 @@ F: drivers/counter/ti-eqep.c
|
||||
|
||||
TI ETHERNET SWITCH DRIVER (CPSW)
|
||||
R: Siddharth Vadapalli <s-vadapalli@ti.com>
|
||||
R: Ravi Gunasekaran <r-gunasekaran@ti.com>
|
||||
R: Roger Quadros <rogerq@kernel.org>
|
||||
L: linux-omap@vger.kernel.org
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -6477,16 +6477,16 @@ static int __init bonding_init(void)
|
||||
if (res)
|
||||
goto out;
|
||||
|
||||
bond_create_debugfs();
|
||||
|
||||
res = register_pernet_subsys(&bond_net_ops);
|
||||
if (res)
|
||||
goto out;
|
||||
goto err_net_ops;
|
||||
|
||||
res = bond_netlink_init();
|
||||
if (res)
|
||||
goto err_link;
|
||||
|
||||
bond_create_debugfs();
|
||||
|
||||
for (i = 0; i < max_bonds; i++) {
|
||||
res = bond_create(&init_net, NULL);
|
||||
if (res)
|
||||
@ -6501,10 +6501,11 @@ static int __init bonding_init(void)
|
||||
out:
|
||||
return res;
|
||||
err:
|
||||
bond_destroy_debugfs();
|
||||
bond_netlink_fini();
|
||||
err_link:
|
||||
unregister_pernet_subsys(&bond_net_ops);
|
||||
err_net_ops:
|
||||
bond_destroy_debugfs();
|
||||
goto out;
|
||||
|
||||
}
|
||||
@ -6513,11 +6514,11 @@ static void __exit bonding_exit(void)
|
||||
{
|
||||
unregister_netdevice_notifier(&bond_netdev_notifier);
|
||||
|
||||
bond_destroy_debugfs();
|
||||
|
||||
bond_netlink_fini();
|
||||
unregister_pernet_subsys(&bond_net_ops);
|
||||
|
||||
bond_destroy_debugfs();
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
/* Make sure we don't have an imbalance on our netpoll blocking */
|
||||
WARN_ON(atomic_read(&netpoll_block_tx));
|
||||
|
@ -805,5 +805,15 @@ int ksz_dcb_init(struct ksz_device *dev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Enable 802.1p priority control on Port 2 during switch initialization.
|
||||
* This setup is critical for the apptrust functionality on Port 1, which
|
||||
* relies on the priority settings of Port 2. Note: Port 1 is naturally
|
||||
* configured before Port 2, necessitating this configuration order.
|
||||
*/
|
||||
if (ksz_is_ksz88x3(dev))
|
||||
return ksz_prmw8(dev, KSZ_PORT_2, KSZ8_REG_PORT_1_CTRL_0,
|
||||
KSZ8_PORT_802_1P_ENABLE,
|
||||
KSZ8_PORT_802_1P_ENABLE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -376,7 +376,8 @@ static int idpf_set_ringparam(struct net_device *netdev,
|
||||
new_tx_count);
|
||||
|
||||
if (new_tx_count == vport->txq_desc_count &&
|
||||
new_rx_count == vport->rxq_desc_count)
|
||||
new_rx_count == vport->rxq_desc_count &&
|
||||
kring->tcp_data_split == idpf_vport_get_hsplit(vport))
|
||||
goto unlock_mutex;
|
||||
|
||||
if (!idpf_vport_set_hsplit(vport, kring->tcp_data_split)) {
|
||||
|
@ -328,7 +328,6 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)
|
||||
{
|
||||
struct ks8851_net *ks = _ks;
|
||||
struct sk_buff_head rxq;
|
||||
unsigned handled = 0;
|
||||
unsigned long flags;
|
||||
unsigned int status;
|
||||
struct sk_buff *skb;
|
||||
@ -336,24 +335,17 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)
|
||||
ks8851_lock(ks, &flags);
|
||||
|
||||
status = ks8851_rdreg16(ks, KS_ISR);
|
||||
ks8851_wrreg16(ks, KS_ISR, status);
|
||||
|
||||
netif_dbg(ks, intr, ks->netdev,
|
||||
"%s: status 0x%04x\n", __func__, status);
|
||||
|
||||
if (status & IRQ_LCI)
|
||||
handled |= IRQ_LCI;
|
||||
|
||||
if (status & IRQ_LDI) {
|
||||
u16 pmecr = ks8851_rdreg16(ks, KS_PMECR);
|
||||
pmecr &= ~PMECR_WKEVT_MASK;
|
||||
ks8851_wrreg16(ks, KS_PMECR, pmecr | PMECR_WKEVT_LINK);
|
||||
|
||||
handled |= IRQ_LDI;
|
||||
}
|
||||
|
||||
if (status & IRQ_RXPSI)
|
||||
handled |= IRQ_RXPSI;
|
||||
|
||||
if (status & IRQ_TXI) {
|
||||
unsigned short tx_space = ks8851_rdreg16(ks, KS_TXMIR);
|
||||
|
||||
@ -365,20 +357,12 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)
|
||||
if (netif_queue_stopped(ks->netdev))
|
||||
netif_wake_queue(ks->netdev);
|
||||
spin_unlock(&ks->statelock);
|
||||
|
||||
handled |= IRQ_TXI;
|
||||
}
|
||||
|
||||
if (status & IRQ_RXI)
|
||||
handled |= IRQ_RXI;
|
||||
|
||||
if (status & IRQ_SPIBEI) {
|
||||
netdev_err(ks->netdev, "%s: spi bus error\n", __func__);
|
||||
handled |= IRQ_SPIBEI;
|
||||
}
|
||||
|
||||
ks8851_wrreg16(ks, KS_ISR, handled);
|
||||
|
||||
if (status & IRQ_RXI) {
|
||||
/* the datasheet says to disable the rx interrupt during
|
||||
* packet read-out, however we're masking the interrupt
|
||||
|
@ -1087,8 +1087,6 @@ static int lan966x_probe(struct platform_device *pdev)
|
||||
platform_set_drvdata(pdev, lan966x);
|
||||
lan966x->dev = &pdev->dev;
|
||||
|
||||
lan966x->debugfs_root = debugfs_create_dir("lan966x", NULL);
|
||||
|
||||
if (!device_get_mac_address(&pdev->dev, mac_addr)) {
|
||||
ether_addr_copy(lan966x->base_mac, mac_addr);
|
||||
} else {
|
||||
@ -1179,6 +1177,8 @@ static int lan966x_probe(struct platform_device *pdev)
|
||||
return dev_err_probe(&pdev->dev, -ENODEV,
|
||||
"no ethernet-ports child found\n");
|
||||
|
||||
lan966x->debugfs_root = debugfs_create_dir("lan966x", NULL);
|
||||
|
||||
/* init switch */
|
||||
lan966x_init(lan966x);
|
||||
lan966x_stats_init(lan966x);
|
||||
@ -1257,6 +1257,8 @@ static int lan966x_probe(struct platform_device *pdev)
|
||||
destroy_workqueue(lan966x->stats_queue);
|
||||
mutex_destroy(&lan966x->stats_lock);
|
||||
|
||||
debugfs_remove_recursive(lan966x->debugfs_root);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1958,6 +1958,8 @@ int wx_sw_init(struct wx *wx)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
bitmap_zero(wx->state, WX_STATE_NBITS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(wx_sw_init);
|
||||
|
@ -2690,15 +2690,63 @@ int wx_set_features(struct net_device *netdev, netdev_features_t features)
|
||||
wx->rss_enabled = false;
|
||||
}
|
||||
|
||||
if (changed &
|
||||
(NETIF_F_HW_VLAN_CTAG_RX |
|
||||
NETIF_F_HW_VLAN_STAG_RX))
|
||||
netdev->features = features;
|
||||
|
||||
if (wx->mac.type == wx_mac_sp && changed & NETIF_F_HW_VLAN_CTAG_RX)
|
||||
wx->do_reset(netdev);
|
||||
else if (changed & (NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_FILTER))
|
||||
wx_set_rx_mode(netdev);
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(wx_set_features);
|
||||
|
||||
#define NETIF_VLAN_STRIPPING_FEATURES (NETIF_F_HW_VLAN_CTAG_RX | \
|
||||
NETIF_F_HW_VLAN_STAG_RX)
|
||||
|
||||
#define NETIF_VLAN_INSERTION_FEATURES (NETIF_F_HW_VLAN_CTAG_TX | \
|
||||
NETIF_F_HW_VLAN_STAG_TX)
|
||||
|
||||
#define NETIF_VLAN_FILTERING_FEATURES (NETIF_F_HW_VLAN_CTAG_FILTER | \
|
||||
NETIF_F_HW_VLAN_STAG_FILTER)
|
||||
|
||||
netdev_features_t wx_fix_features(struct net_device *netdev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
netdev_features_t changed = netdev->features ^ features;
|
||||
struct wx *wx = netdev_priv(netdev);
|
||||
|
||||
if (changed & NETIF_VLAN_STRIPPING_FEATURES) {
|
||||
if ((features & NETIF_VLAN_STRIPPING_FEATURES) != NETIF_VLAN_STRIPPING_FEATURES &&
|
||||
(features & NETIF_VLAN_STRIPPING_FEATURES) != 0) {
|
||||
features &= ~NETIF_VLAN_STRIPPING_FEATURES;
|
||||
features |= netdev->features & NETIF_VLAN_STRIPPING_FEATURES;
|
||||
wx_err(wx, "802.1Q and 802.1ad VLAN stripping must be either both on or both off.");
|
||||
}
|
||||
}
|
||||
|
||||
if (changed & NETIF_VLAN_INSERTION_FEATURES) {
|
||||
if ((features & NETIF_VLAN_INSERTION_FEATURES) != NETIF_VLAN_INSERTION_FEATURES &&
|
||||
(features & NETIF_VLAN_INSERTION_FEATURES) != 0) {
|
||||
features &= ~NETIF_VLAN_INSERTION_FEATURES;
|
||||
features |= netdev->features & NETIF_VLAN_INSERTION_FEATURES;
|
||||
wx_err(wx, "802.1Q and 802.1ad VLAN insertion must be either both on or both off.");
|
||||
}
|
||||
}
|
||||
|
||||
if (changed & NETIF_VLAN_FILTERING_FEATURES) {
|
||||
if ((features & NETIF_VLAN_FILTERING_FEATURES) != NETIF_VLAN_FILTERING_FEATURES &&
|
||||
(features & NETIF_VLAN_FILTERING_FEATURES) != 0) {
|
||||
features &= ~NETIF_VLAN_FILTERING_FEATURES;
|
||||
features |= netdev->features & NETIF_VLAN_FILTERING_FEATURES;
|
||||
wx_err(wx, "802.1Q and 802.1ad VLAN filtering must be either both on or both off.");
|
||||
}
|
||||
}
|
||||
|
||||
return features;
|
||||
}
|
||||
EXPORT_SYMBOL(wx_fix_features);
|
||||
|
||||
void wx_set_ring(struct wx *wx, u32 new_tx_count,
|
||||
u32 new_rx_count, struct wx_ring *temp_ring)
|
||||
{
|
||||
|
@ -30,6 +30,8 @@ int wx_setup_resources(struct wx *wx);
|
||||
void wx_get_stats64(struct net_device *netdev,
|
||||
struct rtnl_link_stats64 *stats);
|
||||
int wx_set_features(struct net_device *netdev, netdev_features_t features);
|
||||
netdev_features_t wx_fix_features(struct net_device *netdev,
|
||||
netdev_features_t features);
|
||||
void wx_set_ring(struct wx *wx, u32 new_tx_count,
|
||||
u32 new_rx_count, struct wx_ring *temp_ring);
|
||||
|
||||
|
@ -982,8 +982,13 @@ struct wx_hw_stats {
|
||||
u64 qmprc;
|
||||
};
|
||||
|
||||
enum wx_state {
|
||||
WX_STATE_RESETTING,
|
||||
WX_STATE_NBITS, /* must be last */
|
||||
};
|
||||
struct wx {
|
||||
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
|
||||
DECLARE_BITMAP(state, WX_STATE_NBITS);
|
||||
|
||||
void *priv;
|
||||
u8 __iomem *hw_addr;
|
||||
@ -1071,6 +1076,8 @@ struct wx {
|
||||
u64 hw_csum_rx_good;
|
||||
u64 hw_csum_rx_error;
|
||||
u64 alloc_rx_buff_failed;
|
||||
|
||||
void (*do_reset)(struct net_device *netdev);
|
||||
};
|
||||
|
||||
#define WX_INTR_ALL (~0ULL)
|
||||
@ -1131,4 +1138,19 @@ static inline struct wx *phylink_to_wx(struct phylink_config *config)
|
||||
return container_of(config, struct wx, phylink_config);
|
||||
}
|
||||
|
||||
static inline int wx_set_state_reset(struct wx *wx)
|
||||
{
|
||||
u8 timeout = 50;
|
||||
|
||||
while (test_and_set_bit(WX_STATE_RESETTING, wx->state)) {
|
||||
timeout--;
|
||||
if (!timeout)
|
||||
return -EBUSY;
|
||||
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _WX_TYPE_H_ */
|
||||
|
@ -52,7 +52,7 @@ static int ngbe_set_ringparam(struct net_device *netdev,
|
||||
struct wx *wx = netdev_priv(netdev);
|
||||
u32 new_rx_count, new_tx_count;
|
||||
struct wx_ring *temp_ring;
|
||||
int i;
|
||||
int i, err = 0;
|
||||
|
||||
new_tx_count = clamp_t(u32, ring->tx_pending, WX_MIN_TXD, WX_MAX_TXD);
|
||||
new_tx_count = ALIGN(new_tx_count, WX_REQ_TX_DESCRIPTOR_MULTIPLE);
|
||||
@ -64,6 +64,10 @@ static int ngbe_set_ringparam(struct net_device *netdev,
|
||||
new_rx_count == wx->rx_ring_count)
|
||||
return 0;
|
||||
|
||||
err = wx_set_state_reset(wx);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!netif_running(wx->netdev)) {
|
||||
for (i = 0; i < wx->num_tx_queues; i++)
|
||||
wx->tx_ring[i]->count = new_tx_count;
|
||||
@ -72,14 +76,16 @@ static int ngbe_set_ringparam(struct net_device *netdev,
|
||||
wx->tx_ring_count = new_tx_count;
|
||||
wx->rx_ring_count = new_rx_count;
|
||||
|
||||
return 0;
|
||||
goto clear_reset;
|
||||
}
|
||||
|
||||
/* allocate temporary buffer to store rings in */
|
||||
i = max_t(int, wx->num_tx_queues, wx->num_rx_queues);
|
||||
temp_ring = kvmalloc_array(i, sizeof(struct wx_ring), GFP_KERNEL);
|
||||
if (!temp_ring)
|
||||
return -ENOMEM;
|
||||
if (!temp_ring) {
|
||||
err = -ENOMEM;
|
||||
goto clear_reset;
|
||||
}
|
||||
|
||||
ngbe_down(wx);
|
||||
|
||||
@ -89,7 +95,9 @@ static int ngbe_set_ringparam(struct net_device *netdev,
|
||||
wx_configure(wx);
|
||||
ngbe_up(wx);
|
||||
|
||||
return 0;
|
||||
clear_reset:
|
||||
clear_bit(WX_STATE_RESETTING, wx->state);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ngbe_set_channels(struct net_device *dev,
|
||||
|
@ -499,6 +499,7 @@ static const struct net_device_ops ngbe_netdev_ops = {
|
||||
.ndo_start_xmit = wx_xmit_frame,
|
||||
.ndo_set_rx_mode = wx_set_rx_mode,
|
||||
.ndo_set_features = wx_set_features,
|
||||
.ndo_fix_features = wx_fix_features,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = wx_set_mac,
|
||||
.ndo_get_stats64 = wx_get_stats64,
|
||||
|
@ -19,7 +19,7 @@ static int txgbe_set_ringparam(struct net_device *netdev,
|
||||
struct wx *wx = netdev_priv(netdev);
|
||||
u32 new_rx_count, new_tx_count;
|
||||
struct wx_ring *temp_ring;
|
||||
int i;
|
||||
int i, err = 0;
|
||||
|
||||
new_tx_count = clamp_t(u32, ring->tx_pending, WX_MIN_TXD, WX_MAX_TXD);
|
||||
new_tx_count = ALIGN(new_tx_count, WX_REQ_TX_DESCRIPTOR_MULTIPLE);
|
||||
@ -31,6 +31,10 @@ static int txgbe_set_ringparam(struct net_device *netdev,
|
||||
new_rx_count == wx->rx_ring_count)
|
||||
return 0;
|
||||
|
||||
err = wx_set_state_reset(wx);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!netif_running(wx->netdev)) {
|
||||
for (i = 0; i < wx->num_tx_queues; i++)
|
||||
wx->tx_ring[i]->count = new_tx_count;
|
||||
@ -39,14 +43,16 @@ static int txgbe_set_ringparam(struct net_device *netdev,
|
||||
wx->tx_ring_count = new_tx_count;
|
||||
wx->rx_ring_count = new_rx_count;
|
||||
|
||||
return 0;
|
||||
goto clear_reset;
|
||||
}
|
||||
|
||||
/* allocate temporary buffer to store rings in */
|
||||
i = max_t(int, wx->num_tx_queues, wx->num_rx_queues);
|
||||
temp_ring = kvmalloc_array(i, sizeof(struct wx_ring), GFP_KERNEL);
|
||||
if (!temp_ring)
|
||||
return -ENOMEM;
|
||||
if (!temp_ring) {
|
||||
err = -ENOMEM;
|
||||
goto clear_reset;
|
||||
}
|
||||
|
||||
txgbe_down(wx);
|
||||
|
||||
@ -55,7 +61,9 @@ static int txgbe_set_ringparam(struct net_device *netdev,
|
||||
|
||||
txgbe_up(wx);
|
||||
|
||||
return 0;
|
||||
clear_reset:
|
||||
clear_bit(WX_STATE_RESETTING, wx->state);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int txgbe_set_channels(struct net_device *dev,
|
||||
|
@ -269,6 +269,8 @@ static int txgbe_sw_init(struct wx *wx)
|
||||
wx->tx_work_limit = TXGBE_DEFAULT_TX_WORK;
|
||||
wx->rx_work_limit = TXGBE_DEFAULT_RX_WORK;
|
||||
|
||||
wx->do_reset = txgbe_do_reset;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -421,6 +423,34 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void txgbe_reinit_locked(struct wx *wx)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
netif_trans_update(wx->netdev);
|
||||
|
||||
err = wx_set_state_reset(wx);
|
||||
if (err) {
|
||||
wx_err(wx, "wait device reset timeout\n");
|
||||
return;
|
||||
}
|
||||
|
||||
txgbe_down(wx);
|
||||
txgbe_up(wx);
|
||||
|
||||
clear_bit(WX_STATE_RESETTING, wx->state);
|
||||
}
|
||||
|
||||
void txgbe_do_reset(struct net_device *netdev)
|
||||
{
|
||||
struct wx *wx = netdev_priv(netdev);
|
||||
|
||||
if (netif_running(netdev))
|
||||
txgbe_reinit_locked(wx);
|
||||
else
|
||||
txgbe_reset(wx);
|
||||
}
|
||||
|
||||
static const struct net_device_ops txgbe_netdev_ops = {
|
||||
.ndo_open = txgbe_open,
|
||||
.ndo_stop = txgbe_close,
|
||||
@ -428,6 +458,7 @@ static const struct net_device_ops txgbe_netdev_ops = {
|
||||
.ndo_start_xmit = wx_xmit_frame,
|
||||
.ndo_set_rx_mode = wx_set_rx_mode,
|
||||
.ndo_set_features = wx_set_features,
|
||||
.ndo_fix_features = wx_fix_features,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = wx_set_mac,
|
||||
.ndo_get_stats64 = wx_get_stats64,
|
||||
|
@ -134,6 +134,7 @@ extern char txgbe_driver_name[];
|
||||
void txgbe_down(struct wx *wx);
|
||||
void txgbe_up(struct wx *wx);
|
||||
int txgbe_setup_tc(struct net_device *dev, u8 tc);
|
||||
void txgbe_do_reset(struct net_device *netdev);
|
||||
|
||||
#define NODE_PROP(_NAME, _PROP) \
|
||||
(const struct software_node) { \
|
||||
|
@ -2902,14 +2902,14 @@ static void virtnet_rx_mode_work(struct work_struct *work)
|
||||
if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_RX))
|
||||
return;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
promisc_allmulti = kzalloc(sizeof(*promisc_allmulti), GFP_ATOMIC);
|
||||
promisc_allmulti = kzalloc(sizeof(*promisc_allmulti), GFP_KERNEL);
|
||||
if (!promisc_allmulti) {
|
||||
dev_warn(&dev->dev, "Failed to set RX mode, no memory.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
*promisc_allmulti = !!(dev->flags & IFF_PROMISC);
|
||||
sg_init_one(sg, promisc_allmulti, sizeof(*promisc_allmulti));
|
||||
|
||||
|
@ -32,7 +32,7 @@ struct bpf_map *bpf_map_meta_alloc(int inner_map_ufd)
|
||||
|
||||
inner_map_meta_size = sizeof(*inner_map_meta);
|
||||
/* In some cases verifier needs to access beyond just base map. */
|
||||
if (inner_map->ops == &array_map_ops)
|
||||
if (inner_map->ops == &array_map_ops || inner_map->ops == &percpu_array_map_ops)
|
||||
inner_map_meta_size = sizeof(struct bpf_array);
|
||||
|
||||
inner_map_meta = kzalloc(inner_map_meta_size, GFP_USER);
|
||||
@ -68,7 +68,7 @@ struct bpf_map *bpf_map_meta_alloc(int inner_map_ufd)
|
||||
|
||||
/* Misc members not needed in bpf_map_meta_equal() check. */
|
||||
inner_map_meta->ops = inner_map->ops;
|
||||
if (inner_map->ops == &array_map_ops) {
|
||||
if (inner_map->ops == &array_map_ops || inner_map->ops == &percpu_array_map_ops) {
|
||||
struct bpf_array *inner_array_meta =
|
||||
container_of(inner_map_meta, struct bpf_array, map);
|
||||
struct bpf_array *inner_array = container_of(inner_map, struct bpf_array, map);
|
||||
|
@ -27,6 +27,7 @@ EXPORT_SYMBOL_GPL(nf_br_ops);
|
||||
/* net device transmit always called with BH disabled */
|
||||
netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
enum skb_drop_reason reason = pskb_may_pull_reason(skb, ETH_HLEN);
|
||||
struct net_bridge_mcast_port *pmctx_null = NULL;
|
||||
struct net_bridge *br = netdev_priv(dev);
|
||||
struct net_bridge_mcast *brmctx = &br->multicast_ctx;
|
||||
@ -38,6 +39,11 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
const unsigned char *dest;
|
||||
u16 vid = 0;
|
||||
|
||||
if (unlikely(reason != SKB_NOT_DROPPED_YET)) {
|
||||
kfree_skb_reason(skb, reason);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
memset(skb->cb, 0, sizeof(struct br_input_skb_cb));
|
||||
br_tc_skb_miss_set(skb, false);
|
||||
|
||||
|
@ -78,7 +78,7 @@ static void br_mst_vlan_set_state(struct net_bridge_port *p, struct net_bridge_v
|
||||
{
|
||||
struct net_bridge_vlan_group *vg = nbp_vlan_group(p);
|
||||
|
||||
if (v->state == state)
|
||||
if (br_vlan_get_state(v) == state)
|
||||
return;
|
||||
|
||||
br_vlan_set_state(v, state);
|
||||
@ -100,11 +100,12 @@ int br_mst_set_state(struct net_bridge_port *p, u16 msti, u8 state,
|
||||
};
|
||||
struct net_bridge_vlan_group *vg;
|
||||
struct net_bridge_vlan *v;
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
vg = nbp_vlan_group(p);
|
||||
if (!vg)
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
/* MSTI 0 (CST) state changes are notified via the regular
|
||||
* SWITCHDEV_ATTR_ID_PORT_STP_STATE.
|
||||
@ -112,17 +113,20 @@ int br_mst_set_state(struct net_bridge_port *p, u16 msti, u8 state,
|
||||
if (msti) {
|
||||
err = switchdev_port_attr_set(p->dev, &attr, extack);
|
||||
if (err && err != -EOPNOTSUPP)
|
||||
return err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
list_for_each_entry(v, &vg->vlan_list, vlist) {
|
||||
err = 0;
|
||||
list_for_each_entry_rcu(v, &vg->vlan_list, vlist) {
|
||||
if (v->brvlan->msti != msti)
|
||||
continue;
|
||||
|
||||
br_mst_vlan_set_state(p, v, state);
|
||||
}
|
||||
|
||||
return 0;
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
return err;
|
||||
}
|
||||
|
||||
static void br_mst_vlan_sync_state(struct net_bridge_vlan *pv, u16 msti)
|
||||
|
@ -4445,7 +4445,7 @@ static void rtmsg_to_fib6_config(struct net *net,
|
||||
.fc_table = l3mdev_fib_table_by_index(net, rtmsg->rtmsg_ifindex) ?
|
||||
: RT6_TABLE_MAIN,
|
||||
.fc_ifindex = rtmsg->rtmsg_ifindex,
|
||||
.fc_metric = rtmsg->rtmsg_metric ? : IP6_RT_PRIO_USER,
|
||||
.fc_metric = rtmsg->rtmsg_metric,
|
||||
.fc_expires = rtmsg->rtmsg_info,
|
||||
.fc_dst_len = rtmsg->rtmsg_dst_len,
|
||||
.fc_src_len = rtmsg->rtmsg_src_len,
|
||||
@ -4475,6 +4475,9 @@ int ipv6_route_ioctl(struct net *net, unsigned int cmd, struct in6_rtmsg *rtmsg)
|
||||
rtnl_lock();
|
||||
switch (cmd) {
|
||||
case SIOCADDRT:
|
||||
/* Only do the default setting of fc_metric in route adding */
|
||||
if (cfg.fc_metric == 0)
|
||||
cfg.fc_metric = IP6_RT_PRIO_USER;
|
||||
err = ip6_route_add(&cfg, GFP_KERNEL, NULL);
|
||||
break;
|
||||
case SIOCDELRT:
|
||||
|
@ -910,22 +910,20 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* UDP encapsulation receive handler. See net/ipv4/udp.c.
|
||||
* Return codes:
|
||||
* 0 : success.
|
||||
* <0: error
|
||||
* >0: skb should be passed up to userspace as UDP.
|
||||
/* UDP encapsulation receive and error receive handlers.
|
||||
* See net/ipv4/udp.c for details.
|
||||
*
|
||||
* Note that these functions are called from inside an
|
||||
* RCU-protected region, but without the socket being locked.
|
||||
*
|
||||
* Hence we use rcu_dereference_sk_user_data to access the
|
||||
* tunnel data structure rather the usual l2tp_sk_to_tunnel
|
||||
* accessor function.
|
||||
*/
|
||||
int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct l2tp_tunnel *tunnel;
|
||||
|
||||
/* Note that this is called from the encap_rcv hook inside an
|
||||
* RCU-protected region, but without the socket being locked.
|
||||
* Hence we use rcu_dereference_sk_user_data to access the
|
||||
* tunnel data structure rather the usual l2tp_sk_to_tunnel
|
||||
* accessor function.
|
||||
*/
|
||||
tunnel = rcu_dereference_sk_user_data(sk);
|
||||
if (!tunnel)
|
||||
goto pass_up;
|
||||
@ -942,6 +940,29 @@ int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2tp_udp_encap_recv);
|
||||
|
||||
static void l2tp_udp_encap_err_recv(struct sock *sk, struct sk_buff *skb, int err,
|
||||
__be16 port, u32 info, u8 *payload)
|
||||
{
|
||||
struct l2tp_tunnel *tunnel;
|
||||
|
||||
tunnel = rcu_dereference_sk_user_data(sk);
|
||||
if (!tunnel || tunnel->fd < 0)
|
||||
return;
|
||||
|
||||
sk->sk_err = err;
|
||||
sk_error_report(sk);
|
||||
|
||||
if (ip_hdr(skb)->version == IPVERSION) {
|
||||
if (inet_test_bit(RECVERR, sk))
|
||||
return ip_icmp_error(sk, skb, err, port, info, payload);
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
} else {
|
||||
if (inet6_test_bit(RECVERR6, sk))
|
||||
return ipv6_icmp_error(sk, skb, err, port, info, payload);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Transmit handling
|
||||
***********************************************************************/
|
||||
@ -1516,6 +1537,7 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
|
||||
.sk_user_data = tunnel,
|
||||
.encap_type = UDP_ENCAP_L2TPINUDP,
|
||||
.encap_rcv = l2tp_udp_encap_recv,
|
||||
.encap_err_rcv = l2tp_udp_encap_err_recv,
|
||||
.encap_destroy = l2tp_udp_encap_destroy,
|
||||
};
|
||||
|
||||
|
@ -285,22 +285,14 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void __nr_remove_node(struct nr_node *nr_node)
|
||||
static void nr_remove_node_locked(struct nr_node *nr_node)
|
||||
{
|
||||
lockdep_assert_held(&nr_node_list_lock);
|
||||
|
||||
hlist_del_init(&nr_node->node_node);
|
||||
nr_node_put(nr_node);
|
||||
}
|
||||
|
||||
#define nr_remove_node_locked(__node) \
|
||||
__nr_remove_node(__node)
|
||||
|
||||
static void nr_remove_node(struct nr_node *nr_node)
|
||||
{
|
||||
spin_lock_bh(&nr_node_list_lock);
|
||||
__nr_remove_node(nr_node);
|
||||
spin_unlock_bh(&nr_node_list_lock);
|
||||
}
|
||||
|
||||
static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)
|
||||
{
|
||||
hlist_del_init(&nr_neigh->neigh_node);
|
||||
@ -339,6 +331,7 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
spin_lock_bh(&nr_node_list_lock);
|
||||
nr_node_lock(nr_node);
|
||||
for (i = 0; i < nr_node->count; i++) {
|
||||
if (nr_node->routes[i].neighbour == nr_neigh) {
|
||||
@ -352,7 +345,7 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
|
||||
nr_node->count--;
|
||||
|
||||
if (nr_node->count == 0) {
|
||||
nr_remove_node(nr_node);
|
||||
nr_remove_node_locked(nr_node);
|
||||
} else {
|
||||
switch (i) {
|
||||
case 0:
|
||||
@ -367,12 +360,14 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
|
||||
nr_node_put(nr_node);
|
||||
}
|
||||
nr_node_unlock(nr_node);
|
||||
spin_unlock_bh(&nr_node_list_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
nr_neigh_put(nr_neigh);
|
||||
nr_node_unlock(nr_node);
|
||||
spin_unlock_bh(&nr_node_list_lock);
|
||||
nr_node_put(nr_node);
|
||||
|
||||
return -EINVAL;
|
||||
|
@ -2522,8 +2522,7 @@ static void tpacket_destruct_skb(struct sk_buff *skb)
|
||||
ts = __packet_set_timestamp(po, ph, skb);
|
||||
__packet_set_status(po, ph, TP_STATUS_AVAILABLE | ts);
|
||||
|
||||
if (!packet_read_pending(&po->tx_ring))
|
||||
complete(&po->skb_completion);
|
||||
complete(&po->skb_completion);
|
||||
}
|
||||
|
||||
sock_wfree(skb);
|
||||
|
@ -725,6 +725,24 @@ int qrtr_ns_init(void)
|
||||
if (ret < 0)
|
||||
goto err_wq;
|
||||
|
||||
/* As the qrtr ns socket owner and creator is the same module, we have
|
||||
* to decrease the qrtr module reference count to guarantee that it
|
||||
* remains zero after the ns socket is created, otherwise, executing
|
||||
* "rmmod" command is unable to make the qrtr module deleted after the
|
||||
* qrtr module is inserted successfully.
|
||||
*
|
||||
* However, the reference count is increased twice in
|
||||
* sock_create_kern(): one is to increase the reference count of owner
|
||||
* of qrtr socket's proto_ops struct; another is to increment the
|
||||
* reference count of owner of qrtr proto struct. Therefore, we must
|
||||
* decrement the module reference count twice to ensure that it keeps
|
||||
* zero after server's listening socket is created. Of course, we
|
||||
* must bump the module reference count twice as well before the socket
|
||||
* is closed.
|
||||
*/
|
||||
module_put(qrtr_ns.sock->ops->owner);
|
||||
module_put(qrtr_ns.sock->sk->sk_prot_creator->owner);
|
||||
|
||||
return 0;
|
||||
|
||||
err_wq:
|
||||
@ -739,6 +757,15 @@ void qrtr_ns_remove(void)
|
||||
{
|
||||
cancel_work_sync(&qrtr_ns.work);
|
||||
destroy_workqueue(qrtr_ns.workqueue);
|
||||
|
||||
/* sock_release() expects the two references that were put during
|
||||
* qrtr_ns_init(). This function is only called during module remove,
|
||||
* so try_stop_module() has already set the refcnt to 0. Use
|
||||
* __module_get() instead of try_module_get() to successfully take two
|
||||
* references.
|
||||
*/
|
||||
__module_get(qrtr_ns.sock->ops->owner);
|
||||
__module_get(qrtr_ns.sock->sk->sk_prot_creator->owner);
|
||||
sock_release(qrtr_ns.sock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qrtr_ns_remove);
|
||||
|
@ -105,7 +105,7 @@ int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts)
|
||||
*/
|
||||
int probe_memcg_account(int token_fd)
|
||||
{
|
||||
const size_t attr_sz = offsetofend(union bpf_attr, attach_btf_obj_fd);
|
||||
const size_t attr_sz = offsetofend(union bpf_attr, prog_token_fd);
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_EMIT_CALL(BPF_FUNC_ktime_get_coarse_ns),
|
||||
BPF_EXIT_INSN(),
|
||||
|
@ -22,7 +22,7 @@ int probe_fd(int fd)
|
||||
|
||||
static int probe_kern_prog_name(int token_fd)
|
||||
{
|
||||
const size_t attr_sz = offsetofend(union bpf_attr, prog_name);
|
||||
const size_t attr_sz = offsetofend(union bpf_attr, prog_token_fd);
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
|
@ -653,7 +653,7 @@ static void test_btf_dump_struct_data(struct btf *btf, struct btf_dump *d,
|
||||
cmpstr =
|
||||
"(struct file_operations){\n"
|
||||
" .owner = (struct module *)0xffffffffffffffff,\n"
|
||||
" .llseek = (loff_t (*)(struct file *, loff_t, int))0xffffffffffffffff,";
|
||||
" .fop_flags = (fop_flags_t)4294967295,";
|
||||
|
||||
ASSERT_STRNEQ(str, cmpstr, strlen(cmpstr), "file_operations");
|
||||
}
|
||||
|
@ -110,10 +110,14 @@ DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, array_map, array_of_array_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, hash_map, array_of_hash_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, hash_malloc_map, array_of_hash_malloc_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, lru_hash_map, array_of_lru_hash_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, pcpu_array_map, array_of_pcpu_array_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_ARRAY_OF_MAPS, pcpu_hash_map, array_of_pcpu_hash_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, array_map, hash_of_array_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, hash_map, hash_of_hash_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, hash_malloc_map, hash_of_hash_malloc_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, lru_hash_map, hash_of_lru_hash_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, pcpu_array_map, hash_of_pcpu_array_maps);
|
||||
DEFINE_MAP_OF_MAP(BPF_MAP_TYPE_HASH_OF_MAPS, pcpu_hash_map, hash_of_pcpu_hash_maps);
|
||||
|
||||
#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *) &(x)) = (val))
|
||||
|
||||
@ -204,6 +208,8 @@ int test_map_kptr(struct __sk_buff *ctx)
|
||||
TEST(hash_map);
|
||||
TEST(hash_malloc_map);
|
||||
TEST(lru_hash_map);
|
||||
TEST(pcpu_array_map);
|
||||
TEST(pcpu_hash_map);
|
||||
|
||||
#undef TEST
|
||||
return 0;
|
||||
@ -281,10 +287,14 @@ int test_map_in_map_kptr(struct __sk_buff *ctx)
|
||||
TEST(array_of_hash_maps);
|
||||
TEST(array_of_hash_malloc_maps);
|
||||
TEST(array_of_lru_hash_maps);
|
||||
TEST(array_of_pcpu_array_maps);
|
||||
TEST(array_of_pcpu_hash_maps);
|
||||
TEST(hash_of_array_maps);
|
||||
TEST(hash_of_hash_maps);
|
||||
TEST(hash_of_hash_malloc_maps);
|
||||
TEST(hash_of_lru_hash_maps);
|
||||
TEST(hash_of_pcpu_array_maps);
|
||||
TEST(hash_of_pcpu_hash_maps);
|
||||
|
||||
#undef TEST
|
||||
return 0;
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
unsigned long span = 0;
|
||||
|
||||
SEC("fentry/load_balance")
|
||||
SEC("fentry/sched_balance_rq")
|
||||
int BPF_PROG(fentry_fentry, int this_cpu, struct rq *this_rq,
|
||||
struct sched_domain *sd)
|
||||
{
|
||||
|
@ -478,10 +478,10 @@ v3exc_timeout_test()
|
||||
RET=0
|
||||
local X=("192.0.2.20" "192.0.2.30")
|
||||
|
||||
# GMI should be 3 seconds
|
||||
# GMI should be 5 seconds
|
||||
ip link set dev br0 type bridge mcast_query_interval 100 \
|
||||
mcast_query_response_interval 100 \
|
||||
mcast_membership_interval 300
|
||||
mcast_membership_interval 500
|
||||
|
||||
v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
|
||||
ip link set dev br0 type bridge mcast_query_interval 500 \
|
||||
@ -489,7 +489,7 @@ v3exc_timeout_test()
|
||||
mcast_membership_interval 1500
|
||||
|
||||
$MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q
|
||||
sleep 3
|
||||
sleep 5
|
||||
bridge -j -d -s mdb show dev br0 \
|
||||
| jq -e ".[].mdb[] | \
|
||||
select(.grp == \"$TEST_GROUP\" and \
|
||||
|
@ -478,10 +478,10 @@ mldv2exc_timeout_test()
|
||||
RET=0
|
||||
local X=("2001:db8:1::20" "2001:db8:1::30")
|
||||
|
||||
# GMI should be 3 seconds
|
||||
# GMI should be 5 seconds
|
||||
ip link set dev br0 type bridge mcast_query_interval 100 \
|
||||
mcast_query_response_interval 100 \
|
||||
mcast_membership_interval 300
|
||||
mcast_membership_interval 500
|
||||
|
||||
mldv2exclude_prepare $h1
|
||||
ip link set dev br0 type bridge mcast_query_interval 500 \
|
||||
@ -489,7 +489,7 @@ mldv2exc_timeout_test()
|
||||
mcast_membership_interval 1500
|
||||
|
||||
$MZ $h1 -c 1 $MZPKT_ALLOW2 -q
|
||||
sleep 3
|
||||
sleep 5
|
||||
bridge -j -d -s mdb show dev br0 \
|
||||
| jq -e ".[].mdb[] | \
|
||||
select(.grp == \"$TEST_GROUP\" and \
|
||||
|
@ -155,25 +155,30 @@ run_test()
|
||||
"$smac > $MACVLAN_ADDR, ethertype IPv4 (0x0800)" \
|
||||
true
|
||||
|
||||
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address" \
|
||||
"$smac > $UNKNOWN_UC_ADDR1, ethertype IPv4 (0x0800)" \
|
||||
false
|
||||
xfail_on_veth $h1 \
|
||||
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address" \
|
||||
"$smac > $UNKNOWN_UC_ADDR1, ethertype IPv4 (0x0800)" \
|
||||
false
|
||||
|
||||
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, promisc" \
|
||||
"$smac > $UNKNOWN_UC_ADDR2, ethertype IPv4 (0x0800)" \
|
||||
true
|
||||
|
||||
check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, allmulti" \
|
||||
"$smac > $UNKNOWN_UC_ADDR3, ethertype IPv4 (0x0800)" \
|
||||
false
|
||||
xfail_on_veth $h1 \
|
||||
check_rcv $rcv_if_name \
|
||||
"Unicast IPv4 to unknown MAC address, allmulti" \
|
||||
"$smac > $UNKNOWN_UC_ADDR3, ethertype IPv4 (0x0800)" \
|
||||
false
|
||||
|
||||
check_rcv $rcv_if_name "Multicast IPv4 to joined group" \
|
||||
"$smac > $JOINED_MACV4_MC_ADDR, ethertype IPv4 (0x0800)" \
|
||||
true
|
||||
|
||||
check_rcv $rcv_if_name "Multicast IPv4 to unknown group" \
|
||||
"$smac > $UNKNOWN_MACV4_MC_ADDR1, ethertype IPv4 (0x0800)" \
|
||||
false
|
||||
xfail_on_veth $h1 \
|
||||
check_rcv $rcv_if_name \
|
||||
"Multicast IPv4 to unknown group" \
|
||||
"$smac > $UNKNOWN_MACV4_MC_ADDR1, ethertype IPv4 (0x0800)" \
|
||||
false
|
||||
|
||||
check_rcv $rcv_if_name "Multicast IPv4 to unknown group, promisc" \
|
||||
"$smac > $UNKNOWN_MACV4_MC_ADDR2, ethertype IPv4 (0x0800)" \
|
||||
@ -187,9 +192,10 @@ run_test()
|
||||
"$smac > $JOINED_MACV6_MC_ADDR, ethertype IPv6 (0x86dd)" \
|
||||
true
|
||||
|
||||
check_rcv $rcv_if_name "Multicast IPv6 to unknown group" \
|
||||
"$smac > $UNKNOWN_MACV6_MC_ADDR1, ethertype IPv6 (0x86dd)" \
|
||||
false
|
||||
xfail_on_veth $h1 \
|
||||
check_rcv $rcv_if_name "Multicast IPv6 to unknown group" \
|
||||
"$smac > $UNKNOWN_MACV6_MC_ADDR1, ethertype IPv6 (0x86dd)" \
|
||||
false
|
||||
|
||||
check_rcv $rcv_if_name "Multicast IPv6 to unknown group, promisc" \
|
||||
"$smac > $UNKNOWN_MACV6_MC_ADDR2, ethertype IPv6 (0x86dd)" \
|
||||
|
@ -127,15 +127,17 @@ setup_ns()
|
||||
local ns=""
|
||||
local ns_name=""
|
||||
local ns_list=""
|
||||
local ns_exist=
|
||||
for ns_name in "$@"; do
|
||||
# Some test may setup/remove same netns multi times
|
||||
if unset ${ns_name} 2> /dev/null; then
|
||||
ns="${ns_name,,}-$(mktemp -u XXXXXX)"
|
||||
eval readonly ${ns_name}="$ns"
|
||||
ns_exist=false
|
||||
else
|
||||
eval ns='$'${ns_name}
|
||||
cleanup_ns "$ns"
|
||||
|
||||
ns_exist=true
|
||||
fi
|
||||
|
||||
if ! ip netns add "$ns"; then
|
||||
@ -144,7 +146,7 @@ setup_ns()
|
||||
return $ksft_skip
|
||||
fi
|
||||
ip -n "$ns" link set lo up
|
||||
ns_list="$ns_list $ns"
|
||||
! $ns_exist && ns_list="$ns_list $ns"
|
||||
done
|
||||
NS_LIST="$NS_LIST $ns_list"
|
||||
}
|
||||
|
@ -293,7 +293,7 @@ check_random_order()
|
||||
local ns=$1
|
||||
local log=$2
|
||||
|
||||
for i in $(seq 100); do
|
||||
for i in $(seq 50); do
|
||||
ip -net $ns xfrm policy flush
|
||||
for j in $(seq 0 16 255 | sort -R); do
|
||||
ip -net $ns xfrm policy add dst $j.0.0.0/24 dir out priority 10 action allow
|
||||
@ -306,7 +306,7 @@ check_random_order()
|
||||
done
|
||||
done
|
||||
|
||||
for i in $(seq 100); do
|
||||
for i in $(seq 50); do
|
||||
ip -net $ns xfrm policy flush
|
||||
for j in $(seq 0 16 255 | sort -R); do
|
||||
local addr=$(printf "e000:0000:%02x00::/56" $j)
|
||||
|
Loading…
Reference in New Issue
Block a user