提交 68533eb1 编写于 作者: L Linus Torvalds

Merge tag 'net-5.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net

Pull networking fixes from Paolo Abeni:
 "Including fixes from can, rxrpc and wireguard.

  Previous releases - regressions:

   - igmp: respect RCU rules in ip_mc_source() and ip_mc_msfilter()

   - mld: respect RCU rules in ip6_mc_source() and ip6_mc_msfilter()

   - rds: acquire netns refcount on TCP sockets

   - rxrpc: enable IPv6 checksums on transport socket

   - nic: hinic: fix bug of wq out of bound access

   - nic: thunder: don't use pci_irq_vector() in atomic context

   - nic: bnxt_en: fix possible bnxt_open() failure caused by wrong RFS
     flag

   - nic: mlx5e:
      - lag, fix use-after-free in fib event handler
      - fix deadlock in sync reset flow

  Previous releases - always broken:

   - tcp: fix insufficient TCP source port randomness

   - can: grcan: grcan_close(): fix deadlock

   - nfc: reorder destructive operations in to avoid bugs

  Misc:

   - wireguard: improve selftests reliability"

* tag 'net-5.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (63 commits)
  NFC: netlink: fix sleep in atomic bug when firmware download timeout
  selftests: ocelot: tc_flower_chains: specify conform-exceed action for policer
  tcp: drop the hash_32() part from the index calculation
  tcp: increase source port perturb table to 2^16
  tcp: dynamically allocate the perturb table used by source ports
  tcp: add small random increments to the source port
  tcp: resalt the secret every 10 seconds
  tcp: use different parts of the port_offset for index and offset
  secure_seq: use the 64 bits of the siphash for port offset calculation
  wireguard: selftests: set panic_on_warn=1 from cmdline
  wireguard: selftests: bump package deps
  wireguard: selftests: restore support for ccache
  wireguard: selftests: use newer toolchains to fill out architectures
  wireguard: selftests: limit parallelism to $(nproc) tests at once
  wireguard: selftests: make routing loop test non-fatal
  net/mlx5: Fix matching on inner TTC
  net/mlx5: Avoid double clear or set of sync reset requested
  net/mlx5: Fix deadlock in sync reset flow
  net/mlx5e: Fix trust state reset in reload
  net/mlx5e: Avoid checking offload capability in post_parse action
  ...
...@@ -241,13 +241,14 @@ struct grcan_device_config { ...@@ -241,13 +241,14 @@ struct grcan_device_config {
.rxsize = GRCAN_DEFAULT_BUFFER_SIZE, \ .rxsize = GRCAN_DEFAULT_BUFFER_SIZE, \
} }
#define GRCAN_TXBUG_SAFE_GRLIB_VERSION 0x4100 #define GRCAN_TXBUG_SAFE_GRLIB_VERSION 4100
#define GRLIB_VERSION_MASK 0xffff #define GRLIB_VERSION_MASK 0xffff
/* GRCAN private data structure */ /* GRCAN private data structure */
struct grcan_priv { struct grcan_priv {
struct can_priv can; /* must be the first member */ struct can_priv can; /* must be the first member */
struct net_device *dev; struct net_device *dev;
struct device *ofdev_dev;
struct napi_struct napi; struct napi_struct napi;
struct grcan_registers __iomem *regs; /* ioremap'ed registers */ struct grcan_registers __iomem *regs; /* ioremap'ed registers */
...@@ -921,7 +922,7 @@ static void grcan_free_dma_buffers(struct net_device *dev) ...@@ -921,7 +922,7 @@ static void grcan_free_dma_buffers(struct net_device *dev)
struct grcan_priv *priv = netdev_priv(dev); struct grcan_priv *priv = netdev_priv(dev);
struct grcan_dma *dma = &priv->dma; struct grcan_dma *dma = &priv->dma;
dma_free_coherent(&dev->dev, dma->base_size, dma->base_buf, dma_free_coherent(priv->ofdev_dev, dma->base_size, dma->base_buf,
dma->base_handle); dma->base_handle);
memset(dma, 0, sizeof(*dma)); memset(dma, 0, sizeof(*dma));
} }
...@@ -946,7 +947,7 @@ static int grcan_allocate_dma_buffers(struct net_device *dev, ...@@ -946,7 +947,7 @@ static int grcan_allocate_dma_buffers(struct net_device *dev,
/* Extra GRCAN_BUFFER_ALIGNMENT to allow for alignment */ /* Extra GRCAN_BUFFER_ALIGNMENT to allow for alignment */
dma->base_size = lsize + ssize + GRCAN_BUFFER_ALIGNMENT; dma->base_size = lsize + ssize + GRCAN_BUFFER_ALIGNMENT;
dma->base_buf = dma_alloc_coherent(&dev->dev, dma->base_buf = dma_alloc_coherent(priv->ofdev_dev,
dma->base_size, dma->base_size,
&dma->base_handle, &dma->base_handle,
GFP_KERNEL); GFP_KERNEL);
...@@ -1102,8 +1103,10 @@ static int grcan_close(struct net_device *dev) ...@@ -1102,8 +1103,10 @@ static int grcan_close(struct net_device *dev)
priv->closing = true; priv->closing = true;
if (priv->need_txbug_workaround) { if (priv->need_txbug_workaround) {
spin_unlock_irqrestore(&priv->lock, flags);
del_timer_sync(&priv->hang_timer); del_timer_sync(&priv->hang_timer);
del_timer_sync(&priv->rr_timer); del_timer_sync(&priv->rr_timer);
spin_lock_irqsave(&priv->lock, flags);
} }
netif_stop_queue(dev); netif_stop_queue(dev);
grcan_stop_hardware(dev); grcan_stop_hardware(dev);
...@@ -1122,7 +1125,7 @@ static int grcan_close(struct net_device *dev) ...@@ -1122,7 +1125,7 @@ static int grcan_close(struct net_device *dev)
return 0; return 0;
} }
static int grcan_transmit_catch_up(struct net_device *dev, int budget) static void grcan_transmit_catch_up(struct net_device *dev)
{ {
struct grcan_priv *priv = netdev_priv(dev); struct grcan_priv *priv = netdev_priv(dev);
unsigned long flags; unsigned long flags;
...@@ -1130,7 +1133,7 @@ static int grcan_transmit_catch_up(struct net_device *dev, int budget) ...@@ -1130,7 +1133,7 @@ static int grcan_transmit_catch_up(struct net_device *dev, int budget)
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
work_done = catch_up_echo_skb(dev, budget, true); work_done = catch_up_echo_skb(dev, -1, true);
if (work_done) { if (work_done) {
if (!priv->resetting && !priv->closing && if (!priv->resetting && !priv->closing &&
!(priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)) !(priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY))
...@@ -1144,8 +1147,6 @@ static int grcan_transmit_catch_up(struct net_device *dev, int budget) ...@@ -1144,8 +1147,6 @@ static int grcan_transmit_catch_up(struct net_device *dev, int budget)
} }
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
return work_done;
} }
static int grcan_receive(struct net_device *dev, int budget) static int grcan_receive(struct net_device *dev, int budget)
...@@ -1227,19 +1228,13 @@ static int grcan_poll(struct napi_struct *napi, int budget) ...@@ -1227,19 +1228,13 @@ static int grcan_poll(struct napi_struct *napi, int budget)
struct net_device *dev = priv->dev; struct net_device *dev = priv->dev;
struct grcan_registers __iomem *regs = priv->regs; struct grcan_registers __iomem *regs = priv->regs;
unsigned long flags; unsigned long flags;
int tx_work_done, rx_work_done; int work_done;
int rx_budget = budget / 2;
int tx_budget = budget - rx_budget;
/* Half of the budget for receiving messages */ work_done = grcan_receive(dev, budget);
rx_work_done = grcan_receive(dev, rx_budget);
/* Half of the budget for transmitting messages as that can trigger echo grcan_transmit_catch_up(dev);
* frames being received
*/
tx_work_done = grcan_transmit_catch_up(dev, tx_budget);
if (rx_work_done < rx_budget && tx_work_done < tx_budget) { if (work_done < budget) {
napi_complete(napi); napi_complete(napi);
/* Guarantee no interference with a running reset that otherwise /* Guarantee no interference with a running reset that otherwise
...@@ -1256,7 +1251,7 @@ static int grcan_poll(struct napi_struct *napi, int budget) ...@@ -1256,7 +1251,7 @@ static int grcan_poll(struct napi_struct *napi, int budget)
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
} }
return rx_work_done + tx_work_done; return work_done;
} }
/* Work tx bug by waiting while for the risky situation to clear. If that fails, /* Work tx bug by waiting while for the risky situation to clear. If that fails,
...@@ -1587,6 +1582,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev, ...@@ -1587,6 +1582,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev,
memcpy(&priv->config, &grcan_module_config, memcpy(&priv->config, &grcan_module_config,
sizeof(struct grcan_device_config)); sizeof(struct grcan_device_config));
priv->dev = dev; priv->dev = dev;
priv->ofdev_dev = &ofdev->dev;
priv->regs = base; priv->regs = base;
priv->can.bittiming_const = &grcan_bittiming_const; priv->can.bittiming_const = &grcan_bittiming_const;
priv->can.do_set_bittiming = grcan_set_bittiming; priv->can.do_set_bittiming = grcan_set_bittiming;
...@@ -1639,6 +1635,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev, ...@@ -1639,6 +1635,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev,
static int grcan_probe(struct platform_device *ofdev) static int grcan_probe(struct platform_device *ofdev)
{ {
struct device_node *np = ofdev->dev.of_node; struct device_node *np = ofdev->dev.of_node;
struct device_node *sysid_parent;
u32 sysid, ambafreq; u32 sysid, ambafreq;
int irq, err; int irq, err;
void __iomem *base; void __iomem *base;
...@@ -1647,10 +1644,15 @@ static int grcan_probe(struct platform_device *ofdev) ...@@ -1647,10 +1644,15 @@ static int grcan_probe(struct platform_device *ofdev)
/* Compare GRLIB version number with the first that does not /* Compare GRLIB version number with the first that does not
* have the tx bug (see start_xmit) * have the tx bug (see start_xmit)
*/ */
err = of_property_read_u32(np, "systemid", &sysid); sysid_parent = of_find_node_by_path("/ambapp0");
if (!err && ((sysid & GRLIB_VERSION_MASK) if (sysid_parent) {
>= GRCAN_TXBUG_SAFE_GRLIB_VERSION)) of_node_get(sysid_parent);
txbug = false; err = of_property_read_u32(sysid_parent, "systemid", &sysid);
if (!err && ((sysid & GRLIB_VERSION_MASK) >=
GRCAN_TXBUG_SAFE_GRLIB_VERSION))
txbug = false;
of_node_put(sysid_parent);
}
err = of_property_read_u32(np, "freq", &ambafreq); err = of_property_read_u32(np, "freq", &ambafreq);
if (err) { if (err) {
......
...@@ -1354,46 +1354,25 @@ static void b53_phylink_get_caps(struct dsa_switch *ds, int port, ...@@ -1354,46 +1354,25 @@ static void b53_phylink_get_caps(struct dsa_switch *ds, int port,
config->legacy_pre_march2020 = false; config->legacy_pre_march2020 = false;
} }
int b53_phylink_mac_link_state(struct dsa_switch *ds, int port, static struct phylink_pcs *b53_phylink_mac_select_pcs(struct dsa_switch *ds,
struct phylink_link_state *state) int port,
phy_interface_t interface)
{ {
struct b53_device *dev = ds->priv; struct b53_device *dev = ds->priv;
int ret = -EOPNOTSUPP;
if ((phy_interface_mode_is_8023z(state->interface) || if (!dev->ops->phylink_mac_select_pcs)
state->interface == PHY_INTERFACE_MODE_SGMII) && return NULL;
dev->ops->serdes_link_state)
ret = dev->ops->serdes_link_state(dev, port, state);
return ret; return dev->ops->phylink_mac_select_pcs(dev, port, interface);
} }
EXPORT_SYMBOL(b53_phylink_mac_link_state);
void b53_phylink_mac_config(struct dsa_switch *ds, int port, void b53_phylink_mac_config(struct dsa_switch *ds, int port,
unsigned int mode, unsigned int mode,
const struct phylink_link_state *state) const struct phylink_link_state *state)
{ {
struct b53_device *dev = ds->priv;
if (mode == MLO_AN_PHY || mode == MLO_AN_FIXED)
return;
if ((phy_interface_mode_is_8023z(state->interface) ||
state->interface == PHY_INTERFACE_MODE_SGMII) &&
dev->ops->serdes_config)
dev->ops->serdes_config(dev, port, mode, state);
} }
EXPORT_SYMBOL(b53_phylink_mac_config); EXPORT_SYMBOL(b53_phylink_mac_config);
void b53_phylink_mac_an_restart(struct dsa_switch *ds, int port)
{
struct b53_device *dev = ds->priv;
if (dev->ops->serdes_an_restart)
dev->ops->serdes_an_restart(dev, port);
}
EXPORT_SYMBOL(b53_phylink_mac_an_restart);
void b53_phylink_mac_link_down(struct dsa_switch *ds, int port, void b53_phylink_mac_link_down(struct dsa_switch *ds, int port,
unsigned int mode, unsigned int mode,
phy_interface_t interface) phy_interface_t interface)
...@@ -2269,9 +2248,8 @@ static const struct dsa_switch_ops b53_switch_ops = { ...@@ -2269,9 +2248,8 @@ static const struct dsa_switch_ops b53_switch_ops = {
.phy_write = b53_phy_write16, .phy_write = b53_phy_write16,
.adjust_link = b53_adjust_link, .adjust_link = b53_adjust_link,
.phylink_get_caps = b53_phylink_get_caps, .phylink_get_caps = b53_phylink_get_caps,
.phylink_mac_link_state = b53_phylink_mac_link_state, .phylink_mac_select_pcs = b53_phylink_mac_select_pcs,
.phylink_mac_config = b53_phylink_mac_config, .phylink_mac_config = b53_phylink_mac_config,
.phylink_mac_an_restart = b53_phylink_mac_an_restart,
.phylink_mac_link_down = b53_phylink_mac_link_down, .phylink_mac_link_down = b53_phylink_mac_link_down,
.phylink_mac_link_up = b53_phylink_mac_link_up, .phylink_mac_link_up = b53_phylink_mac_link_up,
.port_enable = b53_enable_port, .port_enable = b53_enable_port,
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/phy.h> #include <linux/phylink.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <net/dsa.h> #include <net/dsa.h>
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
struct b53_device; struct b53_device;
struct net_device; struct net_device;
struct phylink_link_state;
struct b53_io_ops { struct b53_io_ops {
int (*read8)(struct b53_device *dev, u8 page, u8 reg, u8 *value); int (*read8)(struct b53_device *dev, u8 page, u8 reg, u8 *value);
...@@ -48,13 +47,10 @@ struct b53_io_ops { ...@@ -48,13 +47,10 @@ struct b53_io_ops {
void (*irq_disable)(struct b53_device *dev, int port); void (*irq_disable)(struct b53_device *dev, int port);
void (*phylink_get_caps)(struct b53_device *dev, int port, void (*phylink_get_caps)(struct b53_device *dev, int port,
struct phylink_config *config); struct phylink_config *config);
struct phylink_pcs *(*phylink_mac_select_pcs)(struct b53_device *dev,
int port,
phy_interface_t interface);
u8 (*serdes_map_lane)(struct b53_device *dev, int port); u8 (*serdes_map_lane)(struct b53_device *dev, int port);
int (*serdes_link_state)(struct b53_device *dev, int port,
struct phylink_link_state *state);
void (*serdes_config)(struct b53_device *dev, int port,
unsigned int mode,
const struct phylink_link_state *state);
void (*serdes_an_restart)(struct b53_device *dev, int port);
void (*serdes_link_set)(struct b53_device *dev, int port, void (*serdes_link_set)(struct b53_device *dev, int port,
unsigned int mode, phy_interface_t interface, unsigned int mode, phy_interface_t interface,
bool link_up); bool link_up);
...@@ -85,8 +81,15 @@ enum { ...@@ -85,8 +81,15 @@ enum {
BCM7278_DEVICE_ID = 0x7278, BCM7278_DEVICE_ID = 0x7278,
}; };
struct b53_pcs {
struct phylink_pcs pcs;
struct b53_device *dev;
u8 lane;
};
#define B53_N_PORTS 9 #define B53_N_PORTS 9
#define B53_N_PORTS_25 6 #define B53_N_PORTS_25 6
#define B53_N_PCS 2
struct b53_port { struct b53_port {
u16 vlan_ctl_mask; u16 vlan_ctl_mask;
...@@ -143,6 +146,8 @@ struct b53_device { ...@@ -143,6 +146,8 @@ struct b53_device {
bool vlan_enabled; bool vlan_enabled;
unsigned int num_ports; unsigned int num_ports;
struct b53_port *ports; struct b53_port *ports;
struct b53_pcs pcs[B53_N_PCS];
}; };
#define b53_for_each_port(dev, i) \ #define b53_for_each_port(dev, i) \
...@@ -336,12 +341,9 @@ int b53_br_flags(struct dsa_switch *ds, int port, ...@@ -336,12 +341,9 @@ int b53_br_flags(struct dsa_switch *ds, int port,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
int b53_setup_devlink_resources(struct dsa_switch *ds); int b53_setup_devlink_resources(struct dsa_switch *ds);
void b53_port_event(struct dsa_switch *ds, int port); void b53_port_event(struct dsa_switch *ds, int port);
int b53_phylink_mac_link_state(struct dsa_switch *ds, int port,
struct phylink_link_state *state);
void b53_phylink_mac_config(struct dsa_switch *ds, int port, void b53_phylink_mac_config(struct dsa_switch *ds, int port,
unsigned int mode, unsigned int mode,
const struct phylink_link_state *state); const struct phylink_link_state *state);
void b53_phylink_mac_an_restart(struct dsa_switch *ds, int port);
void b53_phylink_mac_link_down(struct dsa_switch *ds, int port, void b53_phylink_mac_link_down(struct dsa_switch *ds, int port,
unsigned int mode, unsigned int mode,
phy_interface_t interface); phy_interface_t interface);
......
...@@ -17,6 +17,11 @@ ...@@ -17,6 +17,11 @@
#include "b53_serdes.h" #include "b53_serdes.h"
#include "b53_regs.h" #include "b53_regs.h"
static inline struct b53_pcs *pcs_to_b53_pcs(struct phylink_pcs *pcs)
{
return container_of(pcs, struct b53_pcs, pcs);
}
static void b53_serdes_write_blk(struct b53_device *dev, u8 offset, u16 block, static void b53_serdes_write_blk(struct b53_device *dev, u8 offset, u16 block,
u16 value) u16 value)
{ {
...@@ -60,51 +65,47 @@ static u16 b53_serdes_read(struct b53_device *dev, u8 lane, ...@@ -60,51 +65,47 @@ static u16 b53_serdes_read(struct b53_device *dev, u8 lane,
return b53_serdes_read_blk(dev, offset, block); return b53_serdes_read_blk(dev, offset, block);
} }
void b53_serdes_config(struct b53_device *dev, int port, unsigned int mode, static int b53_serdes_config(struct phylink_pcs *pcs, unsigned int mode,
const struct phylink_link_state *state) phy_interface_t interface,
const unsigned long *advertising,
bool permit_pause_to_mac)
{ {
u8 lane = b53_serdes_map_lane(dev, port); struct b53_device *dev = pcs_to_b53_pcs(pcs)->dev;
u8 lane = pcs_to_b53_pcs(pcs)->lane;
u16 reg; u16 reg;
if (lane == B53_INVALID_LANE)
return;
reg = b53_serdes_read(dev, lane, B53_SERDES_DIGITAL_CONTROL(1), reg = b53_serdes_read(dev, lane, B53_SERDES_DIGITAL_CONTROL(1),
SERDES_DIGITAL_BLK); SERDES_DIGITAL_BLK);
if (state->interface == PHY_INTERFACE_MODE_1000BASEX) if (interface == PHY_INTERFACE_MODE_1000BASEX)
reg |= FIBER_MODE_1000X; reg |= FIBER_MODE_1000X;
else else
reg &= ~FIBER_MODE_1000X; reg &= ~FIBER_MODE_1000X;
b53_serdes_write(dev, lane, B53_SERDES_DIGITAL_CONTROL(1), b53_serdes_write(dev, lane, B53_SERDES_DIGITAL_CONTROL(1),
SERDES_DIGITAL_BLK, reg); SERDES_DIGITAL_BLK, reg);
return 0;
} }
EXPORT_SYMBOL(b53_serdes_config);
void b53_serdes_an_restart(struct b53_device *dev, int port) static void b53_serdes_an_restart(struct phylink_pcs *pcs)
{ {
u8 lane = b53_serdes_map_lane(dev, port); struct b53_device *dev = pcs_to_b53_pcs(pcs)->dev;
u8 lane = pcs_to_b53_pcs(pcs)->lane;
u16 reg; u16 reg;
if (lane == B53_INVALID_LANE)
return;
reg = b53_serdes_read(dev, lane, B53_SERDES_MII_REG(MII_BMCR), reg = b53_serdes_read(dev, lane, B53_SERDES_MII_REG(MII_BMCR),
SERDES_MII_BLK); SERDES_MII_BLK);
reg |= BMCR_ANRESTART; reg |= BMCR_ANRESTART;
b53_serdes_write(dev, lane, B53_SERDES_MII_REG(MII_BMCR), b53_serdes_write(dev, lane, B53_SERDES_MII_REG(MII_BMCR),
SERDES_MII_BLK, reg); SERDES_MII_BLK, reg);
} }
EXPORT_SYMBOL(b53_serdes_an_restart);
int b53_serdes_link_state(struct b53_device *dev, int port, static void b53_serdes_get_state(struct phylink_pcs *pcs,
struct phylink_link_state *state) struct phylink_link_state *state)
{ {
u8 lane = b53_serdes_map_lane(dev, port); struct b53_device *dev = pcs_to_b53_pcs(pcs)->dev;
u8 lane = pcs_to_b53_pcs(pcs)->lane;
u16 dig, bmsr; u16 dig, bmsr;
if (lane == B53_INVALID_LANE)
return 1;
dig = b53_serdes_read(dev, lane, B53_SERDES_DIGITAL_STATUS, dig = b53_serdes_read(dev, lane, B53_SERDES_DIGITAL_STATUS,
SERDES_DIGITAL_BLK); SERDES_DIGITAL_BLK);
bmsr = b53_serdes_read(dev, lane, B53_SERDES_MII_REG(MII_BMSR), bmsr = b53_serdes_read(dev, lane, B53_SERDES_MII_REG(MII_BMSR),
...@@ -133,10 +134,7 @@ int b53_serdes_link_state(struct b53_device *dev, int port, ...@@ -133,10 +134,7 @@ int b53_serdes_link_state(struct b53_device *dev, int port,
state->pause |= MLO_PAUSE_RX; state->pause |= MLO_PAUSE_RX;
if (dig & PAUSE_RESOLUTION_TX_SIDE) if (dig & PAUSE_RESOLUTION_TX_SIDE)
state->pause |= MLO_PAUSE_TX; state->pause |= MLO_PAUSE_TX;
return 0;
} }
EXPORT_SYMBOL(b53_serdes_link_state);
void b53_serdes_link_set(struct b53_device *dev, int port, unsigned int mode, void b53_serdes_link_set(struct b53_device *dev, int port, unsigned int mode,
phy_interface_t interface, bool link_up) phy_interface_t interface, bool link_up)
...@@ -158,6 +156,12 @@ void b53_serdes_link_set(struct b53_device *dev, int port, unsigned int mode, ...@@ -158,6 +156,12 @@ void b53_serdes_link_set(struct b53_device *dev, int port, unsigned int mode,
} }
EXPORT_SYMBOL(b53_serdes_link_set); EXPORT_SYMBOL(b53_serdes_link_set);
static const struct phylink_pcs_ops b53_pcs_ops = {
.pcs_get_state = b53_serdes_get_state,
.pcs_config = b53_serdes_config,
.pcs_an_restart = b53_serdes_an_restart,
};
void b53_serdes_phylink_get_caps(struct b53_device *dev, int port, void b53_serdes_phylink_get_caps(struct b53_device *dev, int port,
struct phylink_config *config) struct phylink_config *config)
{ {
...@@ -187,9 +191,28 @@ void b53_serdes_phylink_get_caps(struct b53_device *dev, int port, ...@@ -187,9 +191,28 @@ void b53_serdes_phylink_get_caps(struct b53_device *dev, int port,
} }
EXPORT_SYMBOL(b53_serdes_phylink_get_caps); EXPORT_SYMBOL(b53_serdes_phylink_get_caps);
struct phylink_pcs *b53_serdes_phylink_mac_select_pcs(struct b53_device *dev,
int port,
phy_interface_t interface)
{
u8 lane = b53_serdes_map_lane(dev, port);
if (lane == B53_INVALID_LANE || lane >= B53_N_PCS ||
!dev->pcs[lane].dev)
return NULL;
if (!phy_interface_mode_is_8023z(interface) &&
interface != PHY_INTERFACE_MODE_SGMII)
return NULL;
return &dev->pcs[lane].pcs;
}
EXPORT_SYMBOL(b53_serdes_phylink_mac_select_pcs);
int b53_serdes_init(struct b53_device *dev, int port) int b53_serdes_init(struct b53_device *dev, int port)
{ {
u8 lane = b53_serdes_map_lane(dev, port); u8 lane = b53_serdes_map_lane(dev, port);
struct b53_pcs *pcs;
u16 id0, msb, lsb; u16 id0, msb, lsb;
if (lane == B53_INVALID_LANE) if (lane == B53_INVALID_LANE)
...@@ -212,6 +235,11 @@ int b53_serdes_init(struct b53_device *dev, int port) ...@@ -212,6 +235,11 @@ int b53_serdes_init(struct b53_device *dev, int port)
(id0 >> SERDES_ID0_REV_NUM_SHIFT) & SERDES_ID0_REV_NUM_MASK, (id0 >> SERDES_ID0_REV_NUM_SHIFT) & SERDES_ID0_REV_NUM_MASK,
(u32)msb << 16 | lsb); (u32)msb << 16 | lsb);
pcs = &dev->pcs[lane];
pcs->dev = dev;
pcs->lane = lane;
pcs->pcs.ops = &b53_pcs_ops;
return 0; return 0;
} }
EXPORT_SYMBOL(b53_serdes_init); EXPORT_SYMBOL(b53_serdes_init);
......
...@@ -107,14 +107,11 @@ static inline u8 b53_serdes_map_lane(struct b53_device *dev, int port) ...@@ -107,14 +107,11 @@ static inline u8 b53_serdes_map_lane(struct b53_device *dev, int port)
return dev->ops->serdes_map_lane(dev, port); return dev->ops->serdes_map_lane(dev, port);
} }
int b53_serdes_get_link(struct b53_device *dev, int port);
int b53_serdes_link_state(struct b53_device *dev, int port,
struct phylink_link_state *state);
void b53_serdes_config(struct b53_device *dev, int port, unsigned int mode,
const struct phylink_link_state *state);
void b53_serdes_an_restart(struct b53_device *dev, int port);
void b53_serdes_link_set(struct b53_device *dev, int port, unsigned int mode, void b53_serdes_link_set(struct b53_device *dev, int port, unsigned int mode,
phy_interface_t interface, bool link_up); phy_interface_t interface, bool link_up);
struct phylink_pcs *b53_serdes_phylink_mac_select_pcs(struct b53_device *dev,
int port,
phy_interface_t interface);
void b53_serdes_phylink_get_caps(struct b53_device *dev, int port, void b53_serdes_phylink_get_caps(struct b53_device *dev, int port,
struct phylink_config *config); struct phylink_config *config);
#if IS_ENABLED(CONFIG_B53_SERDES) #if IS_ENABLED(CONFIG_B53_SERDES)
......
...@@ -491,10 +491,8 @@ static const struct b53_io_ops b53_srab_ops = { ...@@ -491,10 +491,8 @@ static const struct b53_io_ops b53_srab_ops = {
.irq_disable = b53_srab_irq_disable, .irq_disable = b53_srab_irq_disable,
.phylink_get_caps = b53_srab_phylink_get_caps, .phylink_get_caps = b53_srab_phylink_get_caps,
#if IS_ENABLED(CONFIG_B53_SERDES) #if IS_ENABLED(CONFIG_B53_SERDES)
.phylink_mac_select_pcs = b53_serdes_phylink_mac_select_pcs,
.serdes_map_lane = b53_srab_serdes_map_lane, .serdes_map_lane = b53_srab_serdes_map_lane,
.serdes_link_state = b53_serdes_link_state,
.serdes_config = b53_serdes_config,
.serdes_an_restart = b53_serdes_an_restart,
.serdes_link_set = b53_serdes_link_set, .serdes_link_set = b53_serdes_link_set,
#endif #endif
}; };
......
...@@ -1021,14 +1021,32 @@ static int ksz9477_port_mirror_add(struct dsa_switch *ds, int port, ...@@ -1021,14 +1021,32 @@ static int ksz9477_port_mirror_add(struct dsa_switch *ds, int port,
bool ingress, struct netlink_ext_ack *extack) bool ingress, struct netlink_ext_ack *extack)
{ {
struct ksz_device *dev = ds->priv; struct ksz_device *dev = ds->priv;
u8 data;
int p;
/* Limit to one sniffer port
* Check if any of the port is already set for sniffing
* If yes, instruct the user to remove the previous entry & exit
*/
for (p = 0; p < dev->port_cnt; p++) {
/* Skip the current sniffing port */
if (p == mirror->to_local_port)
continue;
ksz_pread8(dev, p, P_MIRROR_CTRL, &data);
if (data & PORT_MIRROR_SNIFFER) {
NL_SET_ERR_MSG_MOD(extack,
"Sniffer port is already configured, delete existing rules & retry");
return -EBUSY;
}
}
if (ingress) if (ingress)
ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, true); ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, true);
else else
ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, true); ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, true);
ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_SNIFFER, false);
/* configure mirror port */ /* configure mirror port */
ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL, ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL,
PORT_MIRROR_SNIFFER, true); PORT_MIRROR_SNIFFER, true);
...@@ -1042,16 +1060,28 @@ static void ksz9477_port_mirror_del(struct dsa_switch *ds, int port, ...@@ -1042,16 +1060,28 @@ static void ksz9477_port_mirror_del(struct dsa_switch *ds, int port,
struct dsa_mall_mirror_tc_entry *mirror) struct dsa_mall_mirror_tc_entry *mirror)
{ {
struct ksz_device *dev = ds->priv; struct ksz_device *dev = ds->priv;
bool in_use = false;
u8 data; u8 data;
int p;
if (mirror->ingress) if (mirror->ingress)
ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, false); ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, false);
else else
ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, false); ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, false);
ksz_pread8(dev, port, P_MIRROR_CTRL, &data);
if (!(data & (PORT_MIRROR_RX | PORT_MIRROR_TX))) /* Check if any of the port is still referring to sniffer port */
for (p = 0; p < dev->port_cnt; p++) {
ksz_pread8(dev, p, P_MIRROR_CTRL, &data);
if ((data & (PORT_MIRROR_RX | PORT_MIRROR_TX))) {
in_use = true;
break;
}
}
/* delete sniffing if there are no other mirroring rules */
if (!in_use)
ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL, ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL,
PORT_MIRROR_SNIFFER, false); PORT_MIRROR_SNIFFER, false);
} }
......
...@@ -2229,6 +2229,7 @@ mt7530_setup(struct dsa_switch *ds) ...@@ -2229,6 +2229,7 @@ mt7530_setup(struct dsa_switch *ds)
ret = of_get_phy_mode(mac_np, &interface); ret = of_get_phy_mode(mac_np, &interface);
if (ret && ret != -ENODEV) { if (ret && ret != -ENODEV) {
of_node_put(mac_np); of_node_put(mac_np);
of_node_put(phy_node);
return ret; return ret;
} }
id = of_mdio_parse_addr(ds->dev, phy_node); id = of_mdio_parse_addr(ds->dev, phy_node);
......
...@@ -2707,6 +2707,10 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget) ...@@ -2707,6 +2707,10 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
u32 idx = le32_to_cpu(nqcmp->cq_handle_low); u32 idx = le32_to_cpu(nqcmp->cq_handle_low);
struct bnxt_cp_ring_info *cpr2; struct bnxt_cp_ring_info *cpr2;
/* No more budget for RX work */
if (budget && work_done >= budget && idx == BNXT_RX_HDL)
break;
cpr2 = cpr->cp_ring_arr[idx]; cpr2 = cpr->cp_ring_arr[idx];
work_done += __bnxt_poll_work(bp, cpr2, work_done += __bnxt_poll_work(bp, cpr2,
budget - work_done); budget - work_done);
...@@ -10983,7 +10987,7 @@ static bool bnxt_rfs_capable(struct bnxt *bp) ...@@ -10983,7 +10987,7 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
if (bp->flags & BNXT_FLAG_CHIP_P5) if (bp->flags & BNXT_FLAG_CHIP_P5)
return bnxt_rfs_supported(bp); return bnxt_rfs_supported(bp);
if (!(bp->flags & BNXT_FLAG_MSIX_CAP) || !bnxt_can_reserve_rings(bp)) if (!(bp->flags & BNXT_FLAG_MSIX_CAP) || !bnxt_can_reserve_rings(bp) || !bp->rx_nr_rings)
return false; return false;
vnics = 1 + bp->rx_nr_rings; vnics = 1 + bp->rx_nr_rings;
...@@ -13234,10 +13238,9 @@ static int bnxt_init_dflt_ring_mode(struct bnxt *bp) ...@@ -13234,10 +13238,9 @@ static int bnxt_init_dflt_ring_mode(struct bnxt *bp)
goto init_dflt_ring_err; goto init_dflt_ring_err;
bp->tx_nr_rings_per_tc = bp->tx_nr_rings; bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
if (bnxt_rfs_supported(bp) && bnxt_rfs_capable(bp)) {
bp->flags |= BNXT_FLAG_RFS; bnxt_set_dflt_rfs(bp);
bp->dev->features |= NETIF_F_NTUPLE;
}
init_dflt_ring_err: init_dflt_ring_err:
bnxt_ulp_irq_restart(bp, rc); bnxt_ulp_irq_restart(bp, rc);
return rc; return rc;
......
...@@ -846,13 +846,6 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg) ...@@ -846,13 +846,6 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)
if (rc) if (rc)
return rc; return rc;
if (bp->fw_cap & BNXT_FW_CAP_PTP_RTC) {
bnxt_ptp_timecounter_init(bp, false);
rc = bnxt_ptp_init_rtc(bp, phc_cfg);
if (rc)
goto out;
}
if (ptp->ptp_clock && bnxt_pps_config_ok(bp)) if (ptp->ptp_clock && bnxt_pps_config_ok(bp))
return 0; return 0;
...@@ -861,8 +854,14 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg) ...@@ -861,8 +854,14 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)
atomic_set(&ptp->tx_avail, BNXT_MAX_TX_TS); atomic_set(&ptp->tx_avail, BNXT_MAX_TX_TS);
spin_lock_init(&ptp->ptp_lock); spin_lock_init(&ptp->ptp_lock);
if (!(bp->fw_cap & BNXT_FW_CAP_PTP_RTC)) if (bp->fw_cap & BNXT_FW_CAP_PTP_RTC) {
bnxt_ptp_timecounter_init(bp, false);
rc = bnxt_ptp_init_rtc(bp, phc_cfg);
if (rc)
goto out;
} else {
bnxt_ptp_timecounter_init(bp, true); bnxt_ptp_timecounter_init(bp, true);
}
ptp->ptp_info = bnxt_ptp_caps; ptp->ptp_info = bnxt_ptp_caps;
if ((bp->fw_cap & BNXT_FW_CAP_PTP_PPS)) { if ((bp->fw_cap & BNXT_FW_CAP_PTP_PPS)) {
......
...@@ -59,7 +59,7 @@ struct nicpf { ...@@ -59,7 +59,7 @@ struct nicpf {
/* MSI-X */ /* MSI-X */
u8 num_vec; u8 num_vec;
bool irq_allocated[NIC_PF_MSIX_VECTORS]; unsigned int irq_allocated[NIC_PF_MSIX_VECTORS];
char irq_name[NIC_PF_MSIX_VECTORS][20]; char irq_name[NIC_PF_MSIX_VECTORS][20];
}; };
...@@ -1150,7 +1150,7 @@ static irqreturn_t nic_mbx_intr_handler(int irq, void *nic_irq) ...@@ -1150,7 +1150,7 @@ static irqreturn_t nic_mbx_intr_handler(int irq, void *nic_irq)
u64 intr; u64 intr;
u8 vf; u8 vf;
if (irq == pci_irq_vector(nic->pdev, NIC_PF_INTR_ID_MBOX0)) if (irq == nic->irq_allocated[NIC_PF_INTR_ID_MBOX0])
mbx = 0; mbx = 0;
else else
mbx = 1; mbx = 1;
...@@ -1176,14 +1176,14 @@ static void nic_free_all_interrupts(struct nicpf *nic) ...@@ -1176,14 +1176,14 @@ static void nic_free_all_interrupts(struct nicpf *nic)
for (irq = 0; irq < nic->num_vec; irq++) { for (irq = 0; irq < nic->num_vec; irq++) {
if (nic->irq_allocated[irq]) if (nic->irq_allocated[irq])
free_irq(pci_irq_vector(nic->pdev, irq), nic); free_irq(nic->irq_allocated[irq], nic);
nic->irq_allocated[irq] = false; nic->irq_allocated[irq] = 0;
} }
} }
static int nic_register_interrupts(struct nicpf *nic) static int nic_register_interrupts(struct nicpf *nic)
{ {
int i, ret; int i, ret, irq;
nic->num_vec = pci_msix_vec_count(nic->pdev); nic->num_vec = pci_msix_vec_count(nic->pdev);
/* Enable MSI-X */ /* Enable MSI-X */
...@@ -1201,13 +1201,13 @@ static int nic_register_interrupts(struct nicpf *nic) ...@@ -1201,13 +1201,13 @@ static int nic_register_interrupts(struct nicpf *nic)
sprintf(nic->irq_name[i], sprintf(nic->irq_name[i],
"NICPF Mbox%d", (i - NIC_PF_INTR_ID_MBOX0)); "NICPF Mbox%d", (i - NIC_PF_INTR_ID_MBOX0));
ret = request_irq(pci_irq_vector(nic->pdev, i), irq = pci_irq_vector(nic->pdev, i);
nic_mbx_intr_handler, 0, ret = request_irq(irq, nic_mbx_intr_handler, 0,
nic->irq_name[i], nic); nic->irq_name[i], nic);
if (ret) if (ret)
goto fail; goto fail;
nic->irq_allocated[i] = true; nic->irq_allocated[i] = irq;
} }
/* Enable mailbox interrupt */ /* Enable mailbox interrupt */
......
...@@ -771,7 +771,7 @@ struct hinic_hw_wqe *hinic_get_wqe(struct hinic_wq *wq, unsigned int wqe_size, ...@@ -771,7 +771,7 @@ struct hinic_hw_wqe *hinic_get_wqe(struct hinic_wq *wq, unsigned int wqe_size,
/* If we only have one page, still need to get shadown wqe when /* If we only have one page, still need to get shadown wqe when
* wqe rolling-over page * wqe rolling-over page
*/ */
if (curr_pg != end_pg || MASKED_WQE_IDX(wq, end_prod_idx) < *prod_idx) { if (curr_pg != end_pg || end_prod_idx < *prod_idx) {
void *shadow_addr = &wq->shadow_wqe[curr_pg * wq->max_wqe_size]; void *shadow_addr = &wq->shadow_wqe[curr_pg * wq->max_wqe_size];
copy_wqe_to_shadow(wq, shadow_addr, num_wqebbs, *prod_idx); copy_wqe_to_shadow(wq, shadow_addr, num_wqebbs, *prod_idx);
...@@ -841,7 +841,10 @@ struct hinic_hw_wqe *hinic_read_wqe(struct hinic_wq *wq, unsigned int wqe_size, ...@@ -841,7 +841,10 @@ struct hinic_hw_wqe *hinic_read_wqe(struct hinic_wq *wq, unsigned int wqe_size,
*cons_idx = curr_cons_idx; *cons_idx = curr_cons_idx;
if (curr_pg != end_pg) { /* If we only have one page, still need to get shadown wqe when
* wqe rolling-over page
*/
if (curr_pg != end_pg || end_cons_idx < curr_cons_idx) {
void *shadow_addr = &wq->shadow_wqe[curr_pg * wq->max_wqe_size]; void *shadow_addr = &wq->shadow_wqe[curr_pg * wq->max_wqe_size];
copy_wqe_to_shadow(wq, shadow_addr, num_wqebbs, *cons_idx); copy_wqe_to_shadow(wq, shadow_addr, num_wqebbs, *cons_idx);
......
...@@ -26,6 +26,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3) ...@@ -26,6 +26,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3)
break; break;
ss->regmap[i] = syscon_node_to_regmap(np); ss->regmap[i] = syscon_node_to_regmap(np);
of_node_put(np);
if (IS_ERR(ss->regmap[i])) if (IS_ERR(ss->regmap[i]))
return PTR_ERR(ss->regmap[i]); return PTR_ERR(ss->regmap[i]);
} }
......
...@@ -31,6 +31,7 @@ static const char *const mlx5_rsc_sgmt_name[] = { ...@@ -31,6 +31,7 @@ static const char *const mlx5_rsc_sgmt_name[] = {
struct mlx5_rsc_dump { struct mlx5_rsc_dump {
u32 pdn; u32 pdn;
u32 mkey; u32 mkey;
u32 number_of_menu_items;
u16 fw_segment_type[MLX5_SGMT_TYPE_NUM]; u16 fw_segment_type[MLX5_SGMT_TYPE_NUM];
}; };
...@@ -50,21 +51,37 @@ static int mlx5_rsc_dump_sgmt_get_by_name(char *name) ...@@ -50,21 +51,37 @@ static int mlx5_rsc_dump_sgmt_get_by_name(char *name)
return -EINVAL; return -EINVAL;
} }
static void mlx5_rsc_dump_read_menu_sgmt(struct mlx5_rsc_dump *rsc_dump, struct page *page) #define MLX5_RSC_DUMP_MENU_HEADER_SIZE (MLX5_ST_SZ_BYTES(resource_dump_info_segment) + \
MLX5_ST_SZ_BYTES(resource_dump_command_segment) + \
MLX5_ST_SZ_BYTES(resource_dump_menu_segment))
static int mlx5_rsc_dump_read_menu_sgmt(struct mlx5_rsc_dump *rsc_dump, struct page *page,
int read_size, int start_idx)
{ {
void *data = page_address(page); void *data = page_address(page);
enum mlx5_sgmt_type sgmt_idx; enum mlx5_sgmt_type sgmt_idx;
int num_of_items; int num_of_items;
char *sgmt_name; char *sgmt_name;
void *member; void *member;
int size = 0;
void *menu; void *menu;
int i; int i;
menu = MLX5_ADDR_OF(menu_resource_dump_response, data, menu); if (!start_idx) {
num_of_items = MLX5_GET(resource_dump_menu_segment, menu, num_of_records); menu = MLX5_ADDR_OF(menu_resource_dump_response, data, menu);
rsc_dump->number_of_menu_items = MLX5_GET(resource_dump_menu_segment, menu,
num_of_records);
size = MLX5_RSC_DUMP_MENU_HEADER_SIZE;
data += size;
}
num_of_items = rsc_dump->number_of_menu_items;
for (i = 0; start_idx + i < num_of_items; i++) {
size += MLX5_ST_SZ_BYTES(resource_dump_menu_record);
if (size >= read_size)
return start_idx + i;
for (i = 0; i < num_of_items; i++) { member = data + MLX5_ST_SZ_BYTES(resource_dump_menu_record) * i;
member = MLX5_ADDR_OF(resource_dump_menu_segment, menu, record[i]);
sgmt_name = MLX5_ADDR_OF(resource_dump_menu_record, member, segment_name); sgmt_name = MLX5_ADDR_OF(resource_dump_menu_record, member, segment_name);
sgmt_idx = mlx5_rsc_dump_sgmt_get_by_name(sgmt_name); sgmt_idx = mlx5_rsc_dump_sgmt_get_by_name(sgmt_name);
if (sgmt_idx == -EINVAL) if (sgmt_idx == -EINVAL)
...@@ -72,6 +89,7 @@ static void mlx5_rsc_dump_read_menu_sgmt(struct mlx5_rsc_dump *rsc_dump, struct ...@@ -72,6 +89,7 @@ static void mlx5_rsc_dump_read_menu_sgmt(struct mlx5_rsc_dump *rsc_dump, struct
rsc_dump->fw_segment_type[sgmt_idx] = MLX5_GET(resource_dump_menu_record, rsc_dump->fw_segment_type[sgmt_idx] = MLX5_GET(resource_dump_menu_record,
member, segment_type); member, segment_type);
} }
return 0;
} }
static int mlx5_rsc_dump_trigger(struct mlx5_core_dev *dev, struct mlx5_rsc_dump_cmd *cmd, static int mlx5_rsc_dump_trigger(struct mlx5_core_dev *dev, struct mlx5_rsc_dump_cmd *cmd,
...@@ -168,6 +186,7 @@ static int mlx5_rsc_dump_menu(struct mlx5_core_dev *dev) ...@@ -168,6 +186,7 @@ static int mlx5_rsc_dump_menu(struct mlx5_core_dev *dev)
struct mlx5_rsc_dump_cmd *cmd = NULL; struct mlx5_rsc_dump_cmd *cmd = NULL;
struct mlx5_rsc_key key = {}; struct mlx5_rsc_key key = {};
struct page *page; struct page *page;
int start_idx = 0;
int size; int size;
int err; int err;
...@@ -189,7 +208,7 @@ static int mlx5_rsc_dump_menu(struct mlx5_core_dev *dev) ...@@ -189,7 +208,7 @@ static int mlx5_rsc_dump_menu(struct mlx5_core_dev *dev)
if (err < 0) if (err < 0)
goto destroy_cmd; goto destroy_cmd;
mlx5_rsc_dump_read_menu_sgmt(dev->rsc_dump, page); start_idx = mlx5_rsc_dump_read_menu_sgmt(dev->rsc_dump, page, size, start_idx);
} while (err > 0); } while (err > 0);
......
...@@ -309,8 +309,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, ...@@ -309,8 +309,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
if (err) if (err)
return err; return err;
err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer, port_buff_cell_sz, err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer, xoff,
xoff, &port_buffer, &update_buffer); port_buff_cell_sz, &port_buffer, &update_buffer);
if (err) if (err)
return err; return err;
} }
......
...@@ -145,8 +145,7 @@ mlx5e_tc_act_post_parse(struct mlx5e_tc_act_parse_state *parse_state, ...@@ -145,8 +145,7 @@ mlx5e_tc_act_post_parse(struct mlx5e_tc_act_parse_state *parse_state,
flow_action_for_each(i, act, flow_action) { flow_action_for_each(i, act, flow_action) {
tc_act = mlx5e_tc_act_get(act->id, ns_type); tc_act = mlx5e_tc_act_get(act->id, ns_type);
if (!tc_act || !tc_act->post_parse || if (!tc_act || !tc_act->post_parse)
!tc_act->can_offload(parse_state, act, i, attr))
continue; continue;
err = tc_act->post_parse(parse_state, priv, attr); err = tc_act->post_parse(parse_state, priv, attr);
......
...@@ -45,12 +45,41 @@ tc_act_parse_ct(struct mlx5e_tc_act_parse_state *parse_state, ...@@ -45,12 +45,41 @@ tc_act_parse_ct(struct mlx5e_tc_act_parse_state *parse_state,
if (mlx5e_is_eswitch_flow(parse_state->flow)) if (mlx5e_is_eswitch_flow(parse_state->flow))
attr->esw_attr->split_count = attr->esw_attr->out_count; attr->esw_attr->split_count = attr->esw_attr->out_count;
if (!clear_action) { if (clear_action) {
parse_state->ct_clear = true;
} else {
attr->flags |= MLX5_ATTR_FLAG_CT; attr->flags |= MLX5_ATTR_FLAG_CT;
flow_flag_set(parse_state->flow, CT); flow_flag_set(parse_state->flow, CT);
parse_state->ct = true; parse_state->ct = true;
} }
parse_state->ct_clear = clear_action;
return 0;
}
static int
tc_act_post_parse_ct(struct mlx5e_tc_act_parse_state *parse_state,
struct mlx5e_priv *priv,
struct mlx5_flow_attr *attr)
{
struct mlx5e_tc_mod_hdr_acts *mod_acts = &attr->parse_attr->mod_hdr_acts;
int err;
/* If ct action exist, we can ignore previous ct_clear actions */
if (parse_state->ct)
return 0;
if (parse_state->ct_clear) {
err = mlx5_tc_ct_set_ct_clear_regs(parse_state->ct_priv, mod_acts);
if (err) {
NL_SET_ERR_MSG_MOD(parse_state->extack,
"Failed to set registers for ct clear");
return err;
}
attr->action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
/* Prevent handling of additional, redundant clear actions */
parse_state->ct_clear = false;
}
return 0; return 0;
} }
...@@ -70,5 +99,6 @@ struct mlx5e_tc_act mlx5e_tc_act_ct = { ...@@ -70,5 +99,6 @@ struct mlx5e_tc_act mlx5e_tc_act_ct = {
.can_offload = tc_act_can_offload_ct, .can_offload = tc_act_can_offload_ct,
.parse_action = tc_act_parse_ct, .parse_action = tc_act_parse_ct,
.is_multi_table_act = tc_act_is_multi_table_act_ct, .is_multi_table_act = tc_act_is_multi_table_act_ct,
.post_parse = tc_act_post_parse_ct,
}; };
...@@ -582,6 +582,12 @@ mlx5_tc_ct_entry_set_registers(struct mlx5_tc_ct_priv *ct_priv, ...@@ -582,6 +582,12 @@ mlx5_tc_ct_entry_set_registers(struct mlx5_tc_ct_priv *ct_priv,
return 0; return 0;
} }
int mlx5_tc_ct_set_ct_clear_regs(struct mlx5_tc_ct_priv *priv,
struct mlx5e_tc_mod_hdr_acts *mod_acts)
{
return mlx5_tc_ct_entry_set_registers(priv, mod_acts, 0, 0, 0, 0);
}
static int static int
mlx5_tc_ct_parse_mangle_to_mod_act(struct flow_action_entry *act, mlx5_tc_ct_parse_mangle_to_mod_act(struct flow_action_entry *act,
char *modact) char *modact)
...@@ -1410,9 +1416,6 @@ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv, ...@@ -1410,9 +1416,6 @@ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
const struct flow_action_entry *act, const struct flow_action_entry *act,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
bool clear_action = act->ct.action & TCA_CT_ACT_CLEAR;
int err;
if (!priv) { if (!priv) {
NL_SET_ERR_MSG_MOD(extack, NL_SET_ERR_MSG_MOD(extack,
"offload of ct action isn't available"); "offload of ct action isn't available");
...@@ -1423,17 +1426,6 @@ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv, ...@@ -1423,17 +1426,6 @@ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
attr->ct_attr.ct_action = act->ct.action; attr->ct_attr.ct_action = act->ct.action;
attr->ct_attr.nf_ft = act->ct.flow_table; attr->ct_attr.nf_ft = act->ct.flow_table;
if (!clear_action)
goto out;
err = mlx5_tc_ct_entry_set_registers(priv, mod_acts, 0, 0, 0, 0);
if (err) {
NL_SET_ERR_MSG_MOD(extack, "Failed to set registers for ct clear");
return err;
}
attr->action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
out:
return 0; return 0;
} }
...@@ -1749,6 +1741,8 @@ mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg) ...@@ -1749,6 +1741,8 @@ mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg)
static void static void
mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft) mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
{ {
struct mlx5e_priv *priv;
if (!refcount_dec_and_test(&ft->refcount)) if (!refcount_dec_and_test(&ft->refcount))
return; return;
...@@ -1758,6 +1752,8 @@ mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft) ...@@ -1758,6 +1752,8 @@ mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
rhashtable_free_and_destroy(&ft->ct_entries_ht, rhashtable_free_and_destroy(&ft->ct_entries_ht,
mlx5_tc_ct_flush_ft_entry, mlx5_tc_ct_flush_ft_entry,
ct_priv); ct_priv);
priv = netdev_priv(ct_priv->netdev);
flush_workqueue(priv->wq);
mlx5_tc_ct_free_pre_ct_tables(ft); mlx5_tc_ct_free_pre_ct_tables(ft);
mapping_remove(ct_priv->zone_mapping, ft->zone_restore_id); mapping_remove(ct_priv->zone_mapping, ft->zone_restore_id);
kfree(ft); kfree(ft);
......
...@@ -129,6 +129,10 @@ bool ...@@ -129,6 +129,10 @@ bool
mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv, mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
struct sk_buff *skb, u8 zone_restore_id); struct sk_buff *skb, u8 zone_restore_id);
int
mlx5_tc_ct_set_ct_clear_regs(struct mlx5_tc_ct_priv *priv,
struct mlx5e_tc_mod_hdr_acts *mod_acts);
#else /* CONFIG_MLX5_TC_CT */ #else /* CONFIG_MLX5_TC_CT */
static inline struct mlx5_tc_ct_priv * static inline struct mlx5_tc_ct_priv *
...@@ -170,6 +174,13 @@ mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec) ...@@ -170,6 +174,13 @@ mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec)
return 0; return 0;
} }
static inline int
mlx5_tc_ct_set_ct_clear_regs(struct mlx5_tc_ct_priv *priv,
struct mlx5e_tc_mod_hdr_acts *mod_acts)
{
return -EOPNOTSUPP;
}
static inline int static inline int
mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv, mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
struct mlx5_flow_attr *attr, struct mlx5_flow_attr *attr,
......
...@@ -713,6 +713,7 @@ int mlx5e_tc_tun_route_lookup(struct mlx5e_priv *priv, ...@@ -713,6 +713,7 @@ int mlx5e_tc_tun_route_lookup(struct mlx5e_priv *priv,
struct net_device *filter_dev) struct net_device *filter_dev)
{ {
struct mlx5_esw_flow_attr *esw_attr = flow_attr->esw_attr; struct mlx5_esw_flow_attr *esw_attr = flow_attr->esw_attr;
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
struct mlx5e_tc_int_port *int_port; struct mlx5e_tc_int_port *int_port;
TC_TUN_ROUTE_ATTR_INIT(attr); TC_TUN_ROUTE_ATTR_INIT(attr);
u16 vport_num; u16 vport_num;
...@@ -747,7 +748,7 @@ int mlx5e_tc_tun_route_lookup(struct mlx5e_priv *priv, ...@@ -747,7 +748,7 @@ int mlx5e_tc_tun_route_lookup(struct mlx5e_priv *priv,
esw_attr->rx_tun_attr->vni = MLX5_GET(fte_match_param, spec->match_value, esw_attr->rx_tun_attr->vni = MLX5_GET(fte_match_param, spec->match_value,
misc_parameters.vxlan_vni); misc_parameters.vxlan_vni);
esw_attr->rx_tun_attr->decap_vport = vport_num; esw_attr->rx_tun_attr->decap_vport = vport_num;
} else if (netif_is_ovs_master(attr.route_dev)) { } else if (netif_is_ovs_master(attr.route_dev) && mlx5e_tc_int_port_supported(esw)) {
int_port = mlx5e_tc_int_port_get(mlx5e_get_int_port_priv(priv), int_port = mlx5e_tc_int_port_get(mlx5e_get_int_port_priv(priv),
attr.route_dev->ifindex, attr.route_dev->ifindex,
MLX5E_TC_INT_PORT_INGRESS); MLX5E_TC_INT_PORT_INGRESS);
......
...@@ -1200,6 +1200,16 @@ static int mlx5e_trust_initialize(struct mlx5e_priv *priv) ...@@ -1200,6 +1200,16 @@ static int mlx5e_trust_initialize(struct mlx5e_priv *priv)
return err; return err;
WRITE_ONCE(priv->dcbx_dp.trust_state, trust_state); WRITE_ONCE(priv->dcbx_dp.trust_state, trust_state);
if (priv->dcbx_dp.trust_state == MLX5_QPTS_TRUST_PCP && priv->dcbx.dscp_app_cnt) {
/*
* Align the driver state with the register state.
* Temporary state change is required to enable the app list reset.
*/
priv->dcbx_dp.trust_state = MLX5_QPTS_TRUST_DSCP;
mlx5e_dcbnl_delete_app(priv);
priv->dcbx_dp.trust_state = MLX5_QPTS_TRUST_PCP;
}
mlx5e_params_calc_trust_tx_min_inline_mode(priv->mdev, &priv->channels.params, mlx5e_params_calc_trust_tx_min_inline_mode(priv->mdev, &priv->channels.params,
priv->dcbx_dp.trust_state); priv->dcbx_dp.trust_state);
......
...@@ -2459,6 +2459,17 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, ...@@ -2459,6 +2459,17 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
match.key->vlan_priority); match.key->vlan_priority);
*match_level = MLX5_MATCH_L2; *match_level = MLX5_MATCH_L2;
if (!flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CVLAN) &&
match.mask->vlan_eth_type &&
MLX5_CAP_FLOWTABLE_TYPE(priv->mdev,
ft_field_support.outer_second_vid,
fs_type)) {
MLX5_SET(fte_match_set_misc, misc_c,
outer_second_cvlan_tag, 1);
spec->match_criteria_enable |=
MLX5_MATCH_MISC_PARAMETERS;
}
} }
} else if (*match_level != MLX5_MATCH_NONE) { } else if (*match_level != MLX5_MATCH_NONE) {
/* cvlan_tag enabled in match criteria and /* cvlan_tag enabled in match criteria and
......
...@@ -139,7 +139,7 @@ mlx5_eswitch_set_rule_source_port(struct mlx5_eswitch *esw, ...@@ -139,7 +139,7 @@ mlx5_eswitch_set_rule_source_port(struct mlx5_eswitch *esw,
if (mlx5_esw_indir_table_decap_vport(attr)) if (mlx5_esw_indir_table_decap_vport(attr))
vport = mlx5_esw_indir_table_decap_vport(attr); vport = mlx5_esw_indir_table_decap_vport(attr);
if (esw_attr->int_port) if (attr && !attr->chain && esw_attr->int_port)
metadata = metadata =
mlx5e_tc_int_port_get_metadata_for_match(esw_attr->int_port); mlx5e_tc_int_port_get_metadata_for_match(esw_attr->int_port);
else else
......
...@@ -155,6 +155,28 @@ static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev) ...@@ -155,6 +155,28 @@ static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev)
} }
} }
static void mlx5_stop_sync_reset_poll(struct mlx5_core_dev *dev)
{
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
del_timer_sync(&fw_reset->timer);
}
static int mlx5_sync_reset_clear_reset_requested(struct mlx5_core_dev *dev, bool poll_health)
{
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
if (!test_and_clear_bit(MLX5_FW_RESET_FLAGS_RESET_REQUESTED, &fw_reset->reset_flags)) {
mlx5_core_warn(dev, "Reset request was already cleared\n");
return -EALREADY;
}
mlx5_stop_sync_reset_poll(dev);
if (poll_health)
mlx5_start_health_poll(dev);
return 0;
}
static void mlx5_sync_reset_reload_work(struct work_struct *work) static void mlx5_sync_reset_reload_work(struct work_struct *work)
{ {
struct mlx5_fw_reset *fw_reset = container_of(work, struct mlx5_fw_reset, struct mlx5_fw_reset *fw_reset = container_of(work, struct mlx5_fw_reset,
...@@ -162,6 +184,7 @@ static void mlx5_sync_reset_reload_work(struct work_struct *work) ...@@ -162,6 +184,7 @@ static void mlx5_sync_reset_reload_work(struct work_struct *work)
struct mlx5_core_dev *dev = fw_reset->dev; struct mlx5_core_dev *dev = fw_reset->dev;
int err; int err;
mlx5_sync_reset_clear_reset_requested(dev, false);
mlx5_enter_error_state(dev, true); mlx5_enter_error_state(dev, true);
mlx5_unload_one(dev); mlx5_unload_one(dev);
err = mlx5_health_wait_pci_up(dev); err = mlx5_health_wait_pci_up(dev);
...@@ -171,23 +194,6 @@ static void mlx5_sync_reset_reload_work(struct work_struct *work) ...@@ -171,23 +194,6 @@ static void mlx5_sync_reset_reload_work(struct work_struct *work)
mlx5_fw_reset_complete_reload(dev); mlx5_fw_reset_complete_reload(dev);
} }
static void mlx5_stop_sync_reset_poll(struct mlx5_core_dev *dev)
{
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
del_timer_sync(&fw_reset->timer);
}
static void mlx5_sync_reset_clear_reset_requested(struct mlx5_core_dev *dev, bool poll_health)
{
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
mlx5_stop_sync_reset_poll(dev);
clear_bit(MLX5_FW_RESET_FLAGS_RESET_REQUESTED, &fw_reset->reset_flags);
if (poll_health)
mlx5_start_health_poll(dev);
}
#define MLX5_RESET_POLL_INTERVAL (HZ / 10) #define MLX5_RESET_POLL_INTERVAL (HZ / 10)
static void poll_sync_reset(struct timer_list *t) static void poll_sync_reset(struct timer_list *t)
{ {
...@@ -202,7 +208,6 @@ static void poll_sync_reset(struct timer_list *t) ...@@ -202,7 +208,6 @@ static void poll_sync_reset(struct timer_list *t)
if (fatal_error) { if (fatal_error) {
mlx5_core_warn(dev, "Got Device Reset\n"); mlx5_core_warn(dev, "Got Device Reset\n");
mlx5_sync_reset_clear_reset_requested(dev, false);
queue_work(fw_reset->wq, &fw_reset->reset_reload_work); queue_work(fw_reset->wq, &fw_reset->reset_reload_work);
return; return;
} }
...@@ -229,13 +234,17 @@ static int mlx5_fw_reset_set_reset_sync_nack(struct mlx5_core_dev *dev) ...@@ -229,13 +234,17 @@ static int mlx5_fw_reset_set_reset_sync_nack(struct mlx5_core_dev *dev)
return mlx5_reg_mfrl_set(dev, MLX5_MFRL_REG_RESET_LEVEL3, 0, 2, false); return mlx5_reg_mfrl_set(dev, MLX5_MFRL_REG_RESET_LEVEL3, 0, 2, false);
} }
static void mlx5_sync_reset_set_reset_requested(struct mlx5_core_dev *dev) static int mlx5_sync_reset_set_reset_requested(struct mlx5_core_dev *dev)
{ {
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
if (test_and_set_bit(MLX5_FW_RESET_FLAGS_RESET_REQUESTED, &fw_reset->reset_flags)) {
mlx5_core_warn(dev, "Reset request was already set\n");
return -EALREADY;
}
mlx5_stop_health_poll(dev, true); mlx5_stop_health_poll(dev, true);
set_bit(MLX5_FW_RESET_FLAGS_RESET_REQUESTED, &fw_reset->reset_flags);
mlx5_start_sync_reset_poll(dev); mlx5_start_sync_reset_poll(dev);
return 0;
} }
static void mlx5_fw_live_patch_event(struct work_struct *work) static void mlx5_fw_live_patch_event(struct work_struct *work)
...@@ -264,7 +273,9 @@ static void mlx5_sync_reset_request_event(struct work_struct *work) ...@@ -264,7 +273,9 @@ static void mlx5_sync_reset_request_event(struct work_struct *work)
err ? "Failed" : "Sent"); err ? "Failed" : "Sent");
return; return;
} }
mlx5_sync_reset_set_reset_requested(dev); if (mlx5_sync_reset_set_reset_requested(dev))
return;
err = mlx5_fw_reset_set_reset_sync_ack(dev); err = mlx5_fw_reset_set_reset_sync_ack(dev);
if (err) if (err)
mlx5_core_warn(dev, "PCI Sync FW Update Reset Ack Failed. Error code: %d\n", err); mlx5_core_warn(dev, "PCI Sync FW Update Reset Ack Failed. Error code: %d\n", err);
...@@ -362,7 +373,8 @@ static void mlx5_sync_reset_now_event(struct work_struct *work) ...@@ -362,7 +373,8 @@ static void mlx5_sync_reset_now_event(struct work_struct *work)
struct mlx5_core_dev *dev = fw_reset->dev; struct mlx5_core_dev *dev = fw_reset->dev;
int err; int err;
mlx5_sync_reset_clear_reset_requested(dev, false); if (mlx5_sync_reset_clear_reset_requested(dev, false))
return;
mlx5_core_warn(dev, "Sync Reset now. Device is going to reset.\n"); mlx5_core_warn(dev, "Sync Reset now. Device is going to reset.\n");
...@@ -391,10 +403,8 @@ static void mlx5_sync_reset_abort_event(struct work_struct *work) ...@@ -391,10 +403,8 @@ static void mlx5_sync_reset_abort_event(struct work_struct *work)
reset_abort_work); reset_abort_work);
struct mlx5_core_dev *dev = fw_reset->dev; struct mlx5_core_dev *dev = fw_reset->dev;
if (!test_bit(MLX5_FW_RESET_FLAGS_RESET_REQUESTED, &fw_reset->reset_flags)) if (mlx5_sync_reset_clear_reset_requested(dev, true))
return; return;
mlx5_sync_reset_clear_reset_requested(dev, true);
mlx5_core_warn(dev, "PCI Sync FW Update Reset Aborted.\n"); mlx5_core_warn(dev, "PCI Sync FW Update Reset Aborted.\n");
} }
......
...@@ -100,6 +100,14 @@ static void mlx5_lag_fib_event_flush(struct notifier_block *nb) ...@@ -100,6 +100,14 @@ static void mlx5_lag_fib_event_flush(struct notifier_block *nb)
flush_workqueue(mp->wq); flush_workqueue(mp->wq);
} }
static void mlx5_lag_fib_set(struct lag_mp *mp, struct fib_info *fi, u32 dst, int dst_len)
{
mp->fib.mfi = fi;
mp->fib.priority = fi->fib_priority;
mp->fib.dst = dst;
mp->fib.dst_len = dst_len;
}
struct mlx5_fib_event_work { struct mlx5_fib_event_work {
struct work_struct work; struct work_struct work;
struct mlx5_lag *ldev; struct mlx5_lag *ldev;
...@@ -110,10 +118,10 @@ struct mlx5_fib_event_work { ...@@ -110,10 +118,10 @@ struct mlx5_fib_event_work {
}; };
}; };
static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, unsigned long event,
unsigned long event, struct fib_entry_notifier_info *fen_info)
struct fib_info *fi)
{ {
struct fib_info *fi = fen_info->fi;
struct lag_mp *mp = &ldev->lag_mp; struct lag_mp *mp = &ldev->lag_mp;
struct fib_nh *fib_nh0, *fib_nh1; struct fib_nh *fib_nh0, *fib_nh1;
unsigned int nhs; unsigned int nhs;
...@@ -121,13 +129,15 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, ...@@ -121,13 +129,15 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev,
/* Handle delete event */ /* Handle delete event */
if (event == FIB_EVENT_ENTRY_DEL) { if (event == FIB_EVENT_ENTRY_DEL) {
/* stop track */ /* stop track */
if (mp->mfi == fi) if (mp->fib.mfi == fi)
mp->mfi = NULL; mp->fib.mfi = NULL;
return; return;
} }
/* Handle multipath entry with lower priority value */ /* Handle multipath entry with lower priority value */
if (mp->mfi && mp->mfi != fi && fi->fib_priority >= mp->mfi->fib_priority) if (mp->fib.mfi && mp->fib.mfi != fi &&
(mp->fib.dst != fen_info->dst || mp->fib.dst_len != fen_info->dst_len) &&
fi->fib_priority >= mp->fib.priority)
return; return;
/* Handle add/replace event */ /* Handle add/replace event */
...@@ -143,9 +153,9 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, ...@@ -143,9 +153,9 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev,
i++; i++;
mlx5_lag_set_port_affinity(ldev, i); mlx5_lag_set_port_affinity(ldev, i);
mlx5_lag_fib_set(mp, fi, fen_info->dst, fen_info->dst_len);
} }
mp->mfi = fi;
return; return;
} }
...@@ -165,7 +175,7 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, ...@@ -165,7 +175,7 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev,
} }
/* First time we see multipath route */ /* First time we see multipath route */
if (!mp->mfi && !__mlx5_lag_is_active(ldev)) { if (!mp->fib.mfi && !__mlx5_lag_is_active(ldev)) {
struct lag_tracker tracker; struct lag_tracker tracker;
tracker = ldev->tracker; tracker = ldev->tracker;
...@@ -173,7 +183,7 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, ...@@ -173,7 +183,7 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev,
} }
mlx5_lag_set_port_affinity(ldev, MLX5_LAG_NORMAL_AFFINITY); mlx5_lag_set_port_affinity(ldev, MLX5_LAG_NORMAL_AFFINITY);
mp->mfi = fi; mlx5_lag_fib_set(mp, fi, fen_info->dst, fen_info->dst_len);
} }
static void mlx5_lag_fib_nexthop_event(struct mlx5_lag *ldev, static void mlx5_lag_fib_nexthop_event(struct mlx5_lag *ldev,
...@@ -184,7 +194,7 @@ static void mlx5_lag_fib_nexthop_event(struct mlx5_lag *ldev, ...@@ -184,7 +194,7 @@ static void mlx5_lag_fib_nexthop_event(struct mlx5_lag *ldev,
struct lag_mp *mp = &ldev->lag_mp; struct lag_mp *mp = &ldev->lag_mp;
/* Check the nh event is related to the route */ /* Check the nh event is related to the route */
if (!mp->mfi || mp->mfi != fi) if (!mp->fib.mfi || mp->fib.mfi != fi)
return; return;
/* nh added/removed */ /* nh added/removed */
...@@ -214,7 +224,7 @@ static void mlx5_lag_fib_update(struct work_struct *work) ...@@ -214,7 +224,7 @@ static void mlx5_lag_fib_update(struct work_struct *work)
case FIB_EVENT_ENTRY_REPLACE: case FIB_EVENT_ENTRY_REPLACE:
case FIB_EVENT_ENTRY_DEL: case FIB_EVENT_ENTRY_DEL:
mlx5_lag_fib_route_event(ldev, fib_work->event, mlx5_lag_fib_route_event(ldev, fib_work->event,
fib_work->fen_info.fi); &fib_work->fen_info);
fib_info_put(fib_work->fen_info.fi); fib_info_put(fib_work->fen_info.fi);
break; break;
case FIB_EVENT_NH_ADD: case FIB_EVENT_NH_ADD:
...@@ -313,7 +323,7 @@ void mlx5_lag_mp_reset(struct mlx5_lag *ldev) ...@@ -313,7 +323,7 @@ void mlx5_lag_mp_reset(struct mlx5_lag *ldev)
/* Clear mfi, as it might become stale when a route delete event /* Clear mfi, as it might become stale when a route delete event
* has been missed, see mlx5_lag_fib_route_event(). * has been missed, see mlx5_lag_fib_route_event().
*/ */
ldev->lag_mp.mfi = NULL; ldev->lag_mp.fib.mfi = NULL;
} }
int mlx5_lag_mp_init(struct mlx5_lag *ldev) int mlx5_lag_mp_init(struct mlx5_lag *ldev)
...@@ -324,7 +334,7 @@ int mlx5_lag_mp_init(struct mlx5_lag *ldev) ...@@ -324,7 +334,7 @@ int mlx5_lag_mp_init(struct mlx5_lag *ldev)
/* always clear mfi, as it might become stale when a route delete event /* always clear mfi, as it might become stale when a route delete event
* has been missed * has been missed
*/ */
mp->mfi = NULL; mp->fib.mfi = NULL;
if (mp->fib_nb.notifier_call) if (mp->fib_nb.notifier_call)
return 0; return 0;
...@@ -354,5 +364,5 @@ void mlx5_lag_mp_cleanup(struct mlx5_lag *ldev) ...@@ -354,5 +364,5 @@ void mlx5_lag_mp_cleanup(struct mlx5_lag *ldev)
unregister_fib_notifier(&init_net, &mp->fib_nb); unregister_fib_notifier(&init_net, &mp->fib_nb);
destroy_workqueue(mp->wq); destroy_workqueue(mp->wq);
mp->fib_nb.notifier_call = NULL; mp->fib_nb.notifier_call = NULL;
mp->mfi = NULL; mp->fib.mfi = NULL;
} }
...@@ -15,7 +15,12 @@ enum mlx5_lag_port_affinity { ...@@ -15,7 +15,12 @@ enum mlx5_lag_port_affinity {
struct lag_mp { struct lag_mp {
struct notifier_block fib_nb; struct notifier_block fib_nb;
struct fib_info *mfi; /* used in tracking fib events */ struct {
const void *mfi; /* used in tracking fib events */
u32 priority;
u32 dst;
int dst_len;
} fib;
struct workqueue_struct *wq; struct workqueue_struct *wq;
}; };
......
...@@ -505,7 +505,7 @@ static int mlx5_lag_create_inner_ttc_table(struct mlx5_lag *ldev) ...@@ -505,7 +505,7 @@ static int mlx5_lag_create_inner_ttc_table(struct mlx5_lag *ldev)
struct ttc_params ttc_params = {}; struct ttc_params ttc_params = {};
mlx5_lag_set_inner_ttc_params(ldev, &ttc_params); mlx5_lag_set_inner_ttc_params(ldev, &ttc_params);
port_sel->inner.ttc = mlx5_create_ttc_table(dev, &ttc_params); port_sel->inner.ttc = mlx5_create_inner_ttc_table(dev, &ttc_params);
if (IS_ERR(port_sel->inner.ttc)) if (IS_ERR(port_sel->inner.ttc))
return PTR_ERR(port_sel->inner.ttc); return PTR_ERR(port_sel->inner.ttc);
......
...@@ -408,6 +408,8 @@ static int mlx5_generate_inner_ttc_table_rules(struct mlx5_core_dev *dev, ...@@ -408,6 +408,8 @@ static int mlx5_generate_inner_ttc_table_rules(struct mlx5_core_dev *dev,
for (tt = 0; tt < MLX5_NUM_TT; tt++) { for (tt = 0; tt < MLX5_NUM_TT; tt++) {
struct mlx5_ttc_rule *rule = &rules[tt]; struct mlx5_ttc_rule *rule = &rules[tt];
if (test_bit(tt, params->ignore_dests))
continue;
rule->rule = mlx5_generate_inner_ttc_rule(dev, ft, rule->rule = mlx5_generate_inner_ttc_rule(dev, ft,
&params->dests[tt], &params->dests[tt],
ttc_rules[tt].etype, ttc_rules[tt].etype,
......
...@@ -2431,7 +2431,7 @@ static int smsc911x_drv_probe(struct platform_device *pdev) ...@@ -2431,7 +2431,7 @@ static int smsc911x_drv_probe(struct platform_device *pdev)
if (irq == -EPROBE_DEFER) { if (irq == -EPROBE_DEFER) {
retval = -EPROBE_DEFER; retval = -EPROBE_DEFER;
goto out_0; goto out_0;
} else if (irq <= 0) { } else if (irq < 0) {
pr_warn("Could not allocate irq resource\n"); pr_warn("Could not allocate irq resource\n");
retval = -ENODEV; retval = -ENODEV;
goto out_0; goto out_0;
......
...@@ -454,6 +454,7 @@ static int intel_mgbe_common_data(struct pci_dev *pdev, ...@@ -454,6 +454,7 @@ static int intel_mgbe_common_data(struct pci_dev *pdev,
plat->has_gmac4 = 1; plat->has_gmac4 = 1;
plat->force_sf_dma_mode = 0; plat->force_sf_dma_mode = 0;
plat->tso_en = 1; plat->tso_en = 1;
plat->sph_disable = 1;
/* Multiplying factor to the clk_eee_i clock time /* Multiplying factor to the clk_eee_i clock time
* period to make it closer to 100 ns. This value * period to make it closer to 100 ns. This value
......
...@@ -907,6 +907,7 @@ static int sun8i_dwmac_register_mdio_mux(struct stmmac_priv *priv) ...@@ -907,6 +907,7 @@ static int sun8i_dwmac_register_mdio_mux(struct stmmac_priv *priv)
ret = mdio_mux_init(priv->device, mdio_mux, mdio_mux_syscon_switch_fn, ret = mdio_mux_init(priv->device, mdio_mux, mdio_mux_syscon_switch_fn,
&gmac->mux_handle, priv, priv->mii); &gmac->mux_handle, priv, priv->mii);
of_node_put(mdio_mux);
return ret; return ret;
} }
......
...@@ -7021,7 +7021,7 @@ int stmmac_dvr_probe(struct device *device, ...@@ -7021,7 +7021,7 @@ int stmmac_dvr_probe(struct device *device,
dev_info(priv->device, "TSO feature enabled\n"); dev_info(priv->device, "TSO feature enabled\n");
} }
if (priv->dma_cap.sphen) { if (priv->dma_cap.sphen && !priv->plat->sph_disable) {
ndev->hw_features |= NETIF_F_GRO; ndev->hw_features |= NETIF_F_GRO;
priv->sph_cap = true; priv->sph_cap = true;
priv->sph = priv->sph_cap; priv->sph = priv->sph_cap;
......
...@@ -1246,8 +1246,10 @@ static int cpsw_probe_dt(struct cpsw_common *cpsw) ...@@ -1246,8 +1246,10 @@ static int cpsw_probe_dt(struct cpsw_common *cpsw)
data->slave_data = devm_kcalloc(dev, CPSW_SLAVE_PORTS_NUM, data->slave_data = devm_kcalloc(dev, CPSW_SLAVE_PORTS_NUM,
sizeof(struct cpsw_slave_data), sizeof(struct cpsw_slave_data),
GFP_KERNEL); GFP_KERNEL);
if (!data->slave_data) if (!data->slave_data) {
of_node_put(tmp_node);
return -ENOMEM; return -ENOMEM;
}
/* Populate all the child nodes here... /* Populate all the child nodes here...
*/ */
...@@ -1341,6 +1343,7 @@ static int cpsw_probe_dt(struct cpsw_common *cpsw) ...@@ -1341,6 +1343,7 @@ static int cpsw_probe_dt(struct cpsw_common *cpsw)
err_node_put: err_node_put:
of_node_put(port_np); of_node_put(port_np);
of_node_put(tmp_node);
return ret; return ret;
} }
......
...@@ -823,10 +823,10 @@ static int xemaclite_mdio_write(struct mii_bus *bus, int phy_id, int reg, ...@@ -823,10 +823,10 @@ static int xemaclite_mdio_write(struct mii_bus *bus, int phy_id, int reg,
static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
{ {
struct mii_bus *bus; struct mii_bus *bus;
int rc;
struct resource res; struct resource res;
struct device_node *np = of_get_parent(lp->phy_node); struct device_node *np = of_get_parent(lp->phy_node);
struct device_node *npp; struct device_node *npp;
int rc, ret;
/* Don't register the MDIO bus if the phy_node or its parent node /* Don't register the MDIO bus if the phy_node or its parent node
* can't be found. * can't be found.
...@@ -836,8 +836,14 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) ...@@ -836,8 +836,14 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
return -ENODEV; return -ENODEV;
} }
npp = of_get_parent(np); npp = of_get_parent(np);
ret = of_address_to_resource(npp, 0, &res);
of_address_to_resource(npp, 0, &res); of_node_put(npp);
if (ret) {
dev_err(dev, "%s resource error!\n",
dev->of_node->full_name);
of_node_put(np);
return ret;
}
if (lp->ndev->mem_start != res.start) { if (lp->ndev->mem_start != res.start) {
struct phy_device *phydev; struct phy_device *phydev;
phydev = of_phy_find_device(lp->phy_node); phydev = of_phy_find_device(lp->phy_node);
...@@ -846,6 +852,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) ...@@ -846,6 +852,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
"MDIO of the phy is not registered yet\n"); "MDIO of the phy is not registered yet\n");
else else
put_device(&phydev->mdio.dev); put_device(&phydev->mdio.dev);
of_node_put(np);
return 0; return 0;
} }
...@@ -858,6 +865,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) ...@@ -858,6 +865,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
bus = mdiobus_alloc(); bus = mdiobus_alloc();
if (!bus) { if (!bus) {
dev_err(dev, "Failed to allocate mdiobus\n"); dev_err(dev, "Failed to allocate mdiobus\n");
of_node_put(np);
return -ENOMEM; return -ENOMEM;
} }
...@@ -870,6 +878,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) ...@@ -870,6 +878,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
bus->parent = dev; bus->parent = dev;
rc = of_mdiobus_register(bus, np); rc = of_mdiobus_register(bus, np);
of_node_put(np);
if (rc) { if (rc) {
dev_err(dev, "Failed to register mdio bus.\n"); dev_err(dev, "Failed to register mdio bus.\n");
goto err_register; goto err_register;
...@@ -926,8 +935,6 @@ static int xemaclite_open(struct net_device *dev) ...@@ -926,8 +935,6 @@ static int xemaclite_open(struct net_device *dev)
xemaclite_disable_interrupts(lp); xemaclite_disable_interrupts(lp);
if (lp->phy_node) { if (lp->phy_node) {
u32 bmcr;
lp->phy_dev = of_phy_connect(lp->ndev, lp->phy_node, lp->phy_dev = of_phy_connect(lp->ndev, lp->phy_node,
xemaclite_adjust_link, 0, xemaclite_adjust_link, 0,
PHY_INTERFACE_MODE_MII); PHY_INTERFACE_MODE_MII);
...@@ -938,19 +945,6 @@ static int xemaclite_open(struct net_device *dev) ...@@ -938,19 +945,6 @@ static int xemaclite_open(struct net_device *dev)
/* EmacLite doesn't support giga-bit speeds */ /* EmacLite doesn't support giga-bit speeds */
phy_set_max_speed(lp->phy_dev, SPEED_100); phy_set_max_speed(lp->phy_dev, SPEED_100);
/* Don't advertise 1000BASE-T Full/Half duplex speeds */
phy_write(lp->phy_dev, MII_CTRL1000, 0);
/* Advertise only 10 and 100mbps full/half duplex speeds */
phy_write(lp->phy_dev, MII_ADVERTISE, ADVERTISE_ALL |
ADVERTISE_CSMA);
/* Restart auto negotiation */
bmcr = phy_read(lp->phy_dev, MII_BMCR);
bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART);
phy_write(lp->phy_dev, MII_BMCR, bmcr);
phy_start(lp->phy_dev); phy_start(lp->phy_dev);
} }
......
...@@ -115,7 +115,7 @@ static int bcm6368_mdiomux_probe(struct platform_device *pdev) ...@@ -115,7 +115,7 @@ static int bcm6368_mdiomux_probe(struct platform_device *pdev)
md->mii_bus = devm_mdiobus_alloc(&pdev->dev); md->mii_bus = devm_mdiobus_alloc(&pdev->dev);
if (!md->mii_bus) { if (!md->mii_bus) {
dev_err(&pdev->dev, "mdiomux bus alloc failed\n"); dev_err(&pdev->dev, "mdiomux bus alloc failed\n");
return ENOMEM; return -ENOMEM;
} }
bus = md->mii_bus; bus = md->mii_bus;
......
...@@ -250,6 +250,7 @@ struct sfp { ...@@ -250,6 +250,7 @@ struct sfp {
struct sfp_eeprom_id id; struct sfp_eeprom_id id;
unsigned int module_power_mW; unsigned int module_power_mW;
unsigned int module_t_start_up; unsigned int module_t_start_up;
bool tx_fault_ignore;
#if IS_ENABLED(CONFIG_HWMON) #if IS_ENABLED(CONFIG_HWMON)
struct sfp_diag diag; struct sfp_diag diag;
...@@ -1956,6 +1957,12 @@ static int sfp_sm_mod_probe(struct sfp *sfp, bool report) ...@@ -1956,6 +1957,12 @@ static int sfp_sm_mod_probe(struct sfp *sfp, bool report)
else else
sfp->module_t_start_up = T_START_UP; sfp->module_t_start_up = T_START_UP;
if (!memcmp(id.base.vendor_name, "HUAWEI ", 16) &&
!memcmp(id.base.vendor_pn, "MA5671A ", 16))
sfp->tx_fault_ignore = true;
else
sfp->tx_fault_ignore = false;
return 0; return 0;
} }
...@@ -2409,7 +2416,10 @@ static void sfp_check_state(struct sfp *sfp) ...@@ -2409,7 +2416,10 @@ static void sfp_check_state(struct sfp *sfp)
mutex_lock(&sfp->st_mutex); mutex_lock(&sfp->st_mutex);
state = sfp_get_state(sfp); state = sfp_get_state(sfp);
changed = state ^ sfp->state; changed = state ^ sfp->state;
changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; if (sfp->tx_fault_ignore)
changed &= SFP_F_PRESENT | SFP_F_LOS;
else
changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT;
for (i = 0; i < GPIO_MAX; i++) for (i = 0; i < GPIO_MAX; i++)
if (changed & BIT(i)) if (changed & BIT(i))
......
...@@ -183,6 +183,7 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv) ...@@ -183,6 +183,7 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
{ {
struct nci_dev *ndev = priv->ndev; struct nci_dev *ndev = priv->ndev;
nci_unregister_device(ndev);
if (priv->ndev->nfc_dev->fw_download_in_progress) if (priv->ndev->nfc_dev->fw_download_in_progress)
nfcmrvl_fw_dnld_abort(priv); nfcmrvl_fw_dnld_abort(priv);
...@@ -191,7 +192,6 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv) ...@@ -191,7 +192,6 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
if (gpio_is_valid(priv->config.reset_n_io)) if (gpio_is_valid(priv->config.reset_n_io))
gpio_free(priv->config.reset_n_io); gpio_free(priv->config.reset_n_io);
nci_unregister_device(ndev);
nci_free_device(ndev); nci_free_device(ndev);
kfree(priv); kfree(priv);
} }
......
...@@ -270,5 +270,6 @@ struct plat_stmmacenet_data { ...@@ -270,5 +270,6 @@ struct plat_stmmacenet_data {
int msi_rx_base_vec; int msi_rx_base_vec;
int msi_tx_base_vec; int msi_tx_base_vec;
bool use_phy_wol; bool use_phy_wol;
bool sph_disable;
}; };
#endif #endif
...@@ -425,7 +425,7 @@ static inline void sk_rcv_saddr_set(struct sock *sk, __be32 addr) ...@@ -425,7 +425,7 @@ static inline void sk_rcv_saddr_set(struct sock *sk, __be32 addr)
} }
int __inet_hash_connect(struct inet_timewait_death_row *death_row, int __inet_hash_connect(struct inet_timewait_death_row *death_row,
struct sock *sk, u32 port_offset, struct sock *sk, u64 port_offset,
int (*check_established)(struct inet_timewait_death_row *, int (*check_established)(struct inet_timewait_death_row *,
struct sock *, __u16, struct sock *, __u16,
struct inet_timewait_sock **)); struct inet_timewait_sock **));
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
#include <linux/types.h> #include <linux/types.h>
u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport);
u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
__be16 dport); __be16 dport);
u32 secure_tcp_seq(__be32 saddr, __be32 daddr, u32 secure_tcp_seq(__be32 saddr, __be32 daddr,
__be16 sport, __be16 dport); __be16 sport, __be16 dport);
......
...@@ -1189,6 +1189,11 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len) ...@@ -1189,6 +1189,11 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
lock_sock(sk); lock_sock(sk);
if (so->bound) {
err = -EINVAL;
goto out;
}
/* do not register frame reception for functional addressing */ /* do not register frame reception for functional addressing */
if (so->opt.flags & CAN_ISOTP_SF_BROADCAST) if (so->opt.flags & CAN_ISOTP_SF_BROADCAST)
do_rx_reg = 0; do_rx_reg = 0;
...@@ -1199,10 +1204,6 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len) ...@@ -1199,10 +1204,6 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
goto out; goto out;
} }
if (so->bound && addr->can_ifindex == so->ifindex &&
rx_id == so->rxid && tx_id == so->txid)
goto out;
dev = dev_get_by_index(net, addr->can_ifindex); dev = dev_get_by_index(net, addr->can_ifindex);
if (!dev) { if (!dev) {
err = -ENODEV; err = -ENODEV;
...@@ -1237,22 +1238,6 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len) ...@@ -1237,22 +1238,6 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
dev_put(dev); dev_put(dev);
if (so->bound && do_rx_reg) {
/* unregister old filter */
if (so->ifindex) {
dev = dev_get_by_index(net, so->ifindex);
if (dev) {
can_rx_unregister(net, dev, so->rxid,
SINGLE_MASK(so->rxid),
isotp_rcv, sk);
can_rx_unregister(net, dev, so->txid,
SINGLE_MASK(so->txid),
isotp_rcv_echo, sk);
dev_put(dev);
}
}
}
/* switch to new settings */ /* switch to new settings */
so->ifindex = ifindex; so->ifindex = ifindex;
so->rxid = rx_id; so->rxid = rx_id;
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
static siphash_aligned_key_t net_secret; static siphash_aligned_key_t net_secret;
static siphash_aligned_key_t ts_secret; static siphash_aligned_key_t ts_secret;
#define EPHEMERAL_PORT_SHUFFLE_PERIOD (10 * HZ)
static __always_inline void net_secret_init(void) static __always_inline void net_secret_init(void)
{ {
net_get_random_once(&net_secret, sizeof(net_secret)); net_get_random_once(&net_secret, sizeof(net_secret));
...@@ -94,17 +96,19 @@ u32 secure_tcpv6_seq(const __be32 *saddr, const __be32 *daddr, ...@@ -94,17 +96,19 @@ u32 secure_tcpv6_seq(const __be32 *saddr, const __be32 *daddr,
} }
EXPORT_SYMBOL(secure_tcpv6_seq); EXPORT_SYMBOL(secure_tcpv6_seq);
u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
__be16 dport) __be16 dport)
{ {
const struct { const struct {
struct in6_addr saddr; struct in6_addr saddr;
struct in6_addr daddr; struct in6_addr daddr;
unsigned int timeseed;
__be16 dport; __be16 dport;
} __aligned(SIPHASH_ALIGNMENT) combined = { } __aligned(SIPHASH_ALIGNMENT) combined = {
.saddr = *(struct in6_addr *)saddr, .saddr = *(struct in6_addr *)saddr,
.daddr = *(struct in6_addr *)daddr, .daddr = *(struct in6_addr *)daddr,
.dport = dport .timeseed = jiffies / EPHEMERAL_PORT_SHUFFLE_PERIOD,
.dport = dport,
}; };
net_secret_init(); net_secret_init();
return siphash(&combined, offsetofend(typeof(combined), dport), return siphash(&combined, offsetofend(typeof(combined), dport),
...@@ -142,11 +146,13 @@ u32 secure_tcp_seq(__be32 saddr, __be32 daddr, ...@@ -142,11 +146,13 @@ u32 secure_tcp_seq(__be32 saddr, __be32 daddr,
} }
EXPORT_SYMBOL_GPL(secure_tcp_seq); EXPORT_SYMBOL_GPL(secure_tcp_seq);
u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport)
{ {
net_secret_init(); net_secret_init();
return siphash_3u32((__force u32)saddr, (__force u32)daddr, return siphash_4u32((__force u32)saddr, (__force u32)daddr,
(__force u16)dport, &net_secret); (__force u16)dport,
jiffies / EPHEMERAL_PORT_SHUFFLE_PERIOD,
&net_secret);
} }
EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral); EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral);
#endif #endif
......
...@@ -2403,9 +2403,10 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct ...@@ -2403,9 +2403,10 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
/* decrease mem now to avoid the memleak warning */ /* decrease mem now to avoid the memleak warning */
atomic_sub(struct_size(psl, sl_addr, psl->sl_max), atomic_sub(struct_size(psl, sl_addr, psl->sl_max),
&sk->sk_omem_alloc); &sk->sk_omem_alloc);
kfree_rcu(psl, rcu);
} }
rcu_assign_pointer(pmc->sflist, newpsl); rcu_assign_pointer(pmc->sflist, newpsl);
if (psl)
kfree_rcu(psl, rcu);
psl = newpsl; psl = newpsl;
} }
rv = 1; /* > 0 for insert logic below if sl_count is 0 */ rv = 1; /* > 0 for insert logic below if sl_count is 0 */
...@@ -2507,11 +2508,13 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex) ...@@ -2507,11 +2508,13 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex)
/* decrease mem now to avoid the memleak warning */ /* decrease mem now to avoid the memleak warning */
atomic_sub(struct_size(psl, sl_addr, psl->sl_max), atomic_sub(struct_size(psl, sl_addr, psl->sl_max),
&sk->sk_omem_alloc); &sk->sk_omem_alloc);
kfree_rcu(psl, rcu); } else {
} else
(void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode, (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
0, NULL, 0); 0, NULL, 0);
}
rcu_assign_pointer(pmc->sflist, newpsl); rcu_assign_pointer(pmc->sflist, newpsl);
if (psl)
kfree_rcu(psl, rcu);
pmc->sfmode = msf->imsf_fmode; pmc->sfmode = msf->imsf_fmode;
err = 0; err = 0;
done: done:
......
...@@ -504,7 +504,7 @@ static int __inet_check_established(struct inet_timewait_death_row *death_row, ...@@ -504,7 +504,7 @@ static int __inet_check_established(struct inet_timewait_death_row *death_row,
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
} }
static u32 inet_sk_port_offset(const struct sock *sk) static u64 inet_sk_port_offset(const struct sock *sk)
{ {
const struct inet_sock *inet = inet_sk(sk); const struct inet_sock *inet = inet_sk(sk);
...@@ -726,15 +726,17 @@ EXPORT_SYMBOL_GPL(inet_unhash); ...@@ -726,15 +726,17 @@ EXPORT_SYMBOL_GPL(inet_unhash);
* Note that we use 32bit integers (vs RFC 'short integers') * Note that we use 32bit integers (vs RFC 'short integers')
* because 2^16 is not a multiple of num_ephemeral and this * because 2^16 is not a multiple of num_ephemeral and this
* property might be used by clever attacker. * property might be used by clever attacker.
* RFC claims using TABLE_LENGTH=10 buckets gives an improvement, * RFC claims using TABLE_LENGTH=10 buckets gives an improvement, though
* we use 256 instead to really give more isolation and * attacks were since demonstrated, thus we use 65536 instead to really
* privacy, this only consumes 1 KB of kernel memory. * give more isolation and privacy, at the expense of 256kB of kernel
* memory.
*/ */
#define INET_TABLE_PERTURB_SHIFT 8 #define INET_TABLE_PERTURB_SHIFT 16
static u32 table_perturb[1 << INET_TABLE_PERTURB_SHIFT]; #define INET_TABLE_PERTURB_SIZE (1 << INET_TABLE_PERTURB_SHIFT)
static u32 *table_perturb;
int __inet_hash_connect(struct inet_timewait_death_row *death_row, int __inet_hash_connect(struct inet_timewait_death_row *death_row,
struct sock *sk, u32 port_offset, struct sock *sk, u64 port_offset,
int (*check_established)(struct inet_timewait_death_row *, int (*check_established)(struct inet_timewait_death_row *,
struct sock *, __u16, struct inet_timewait_sock **)) struct sock *, __u16, struct inet_timewait_sock **))
{ {
...@@ -774,10 +776,13 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row, ...@@ -774,10 +776,13 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
if (likely(remaining > 1)) if (likely(remaining > 1))
remaining &= ~1U; remaining &= ~1U;
net_get_random_once(table_perturb, sizeof(table_perturb)); net_get_random_once(table_perturb,
index = hash_32(port_offset, INET_TABLE_PERTURB_SHIFT); INET_TABLE_PERTURB_SIZE * sizeof(*table_perturb));
index = port_offset & (INET_TABLE_PERTURB_SIZE - 1);
offset = READ_ONCE(table_perturb[index]) + (port_offset >> 32);
offset %= remaining;
offset = (READ_ONCE(table_perturb[index]) + port_offset) % remaining;
/* In first pass we try ports of @low parity. /* In first pass we try ports of @low parity.
* inet_csk_get_port() does the opposite choice. * inet_csk_get_port() does the opposite choice.
*/ */
...@@ -831,11 +836,12 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row, ...@@ -831,11 +836,12 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
ok: ok:
/* If our first attempt found a candidate, skip next candidate /* Here we want to add a little bit of randomness to the next source
* in 1/16 of cases to add some noise. * port that will be chosen. We use a max() with a random here so that
* on low contention the randomness is maximal and on high contention
* it may be inexistent.
*/ */
if (!i && !(prandom_u32() % 16)) i = max_t(int, i, (prandom_u32() & 7) * 2);
i = 2;
WRITE_ONCE(table_perturb[index], READ_ONCE(table_perturb[index]) + i + 2); WRITE_ONCE(table_perturb[index], READ_ONCE(table_perturb[index]) + i + 2);
/* Head lock still held and bh's disabled */ /* Head lock still held and bh's disabled */
...@@ -859,7 +865,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row, ...@@ -859,7 +865,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
int inet_hash_connect(struct inet_timewait_death_row *death_row, int inet_hash_connect(struct inet_timewait_death_row *death_row,
struct sock *sk) struct sock *sk)
{ {
u32 port_offset = 0; u64 port_offset = 0;
if (!inet_sk(sk)->inet_num) if (!inet_sk(sk)->inet_num)
port_offset = inet_sk_port_offset(sk); port_offset = inet_sk_port_offset(sk);
...@@ -909,6 +915,12 @@ void __init inet_hashinfo2_init(struct inet_hashinfo *h, const char *name, ...@@ -909,6 +915,12 @@ void __init inet_hashinfo2_init(struct inet_hashinfo *h, const char *name,
low_limit, low_limit,
high_limit); high_limit);
init_hashinfo_lhash2(h); init_hashinfo_lhash2(h);
/* this one is used for source ports of outgoing connections */
table_perturb = kmalloc_array(INET_TABLE_PERTURB_SIZE,
sizeof(*table_perturb), GFP_KERNEL);
if (!table_perturb)
panic("TCP: failed to alloc table_perturb");
} }
int inet_hashinfo2_init_mod(struct inet_hashinfo *h) int inet_hashinfo2_init_mod(struct inet_hashinfo *h)
......
...@@ -308,7 +308,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row, ...@@ -308,7 +308,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
} }
static u32 inet6_sk_port_offset(const struct sock *sk) static u64 inet6_sk_port_offset(const struct sock *sk)
{ {
const struct inet_sock *inet = inet_sk(sk); const struct inet_sock *inet = inet_sk(sk);
...@@ -320,7 +320,7 @@ static u32 inet6_sk_port_offset(const struct sock *sk) ...@@ -320,7 +320,7 @@ static u32 inet6_sk_port_offset(const struct sock *sk)
int inet6_hash_connect(struct inet_timewait_death_row *death_row, int inet6_hash_connect(struct inet_timewait_death_row *death_row,
struct sock *sk) struct sock *sk)
{ {
u32 port_offset = 0; u64 port_offset = 0;
if (!inet_sk(sk)->inet_num) if (!inet_sk(sk)->inet_num)
port_offset = inet6_sk_port_offset(sk); port_offset = inet6_sk_port_offset(sk);
......
...@@ -460,10 +460,10 @@ int ip6_mc_source(int add, int omode, struct sock *sk, ...@@ -460,10 +460,10 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
newpsl->sl_addr[i] = psl->sl_addr[i]; newpsl->sl_addr[i] = psl->sl_addr[i];
atomic_sub(struct_size(psl, sl_addr, psl->sl_max), atomic_sub(struct_size(psl, sl_addr, psl->sl_max),
&sk->sk_omem_alloc); &sk->sk_omem_alloc);
kfree_rcu(psl, rcu);
} }
rcu_assign_pointer(pmc->sflist, newpsl);
kfree_rcu(psl, rcu);
psl = newpsl; psl = newpsl;
rcu_assign_pointer(pmc->sflist, psl);
} }
rv = 1; /* > 0 for insert logic below if sl_count is 0 */ rv = 1; /* > 0 for insert logic below if sl_count is 0 */
for (i = 0; i < psl->sl_count; i++) { for (i = 0; i < psl->sl_count; i++) {
...@@ -565,12 +565,12 @@ int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf, ...@@ -565,12 +565,12 @@ int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf,
psl->sl_count, psl->sl_addr, 0); psl->sl_count, psl->sl_addr, 0);
atomic_sub(struct_size(psl, sl_addr, psl->sl_max), atomic_sub(struct_size(psl, sl_addr, psl->sl_max),
&sk->sk_omem_alloc); &sk->sk_omem_alloc);
kfree_rcu(psl, rcu);
} else { } else {
ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0);
} }
mutex_unlock(&idev->mc_lock);
rcu_assign_pointer(pmc->sflist, newpsl); rcu_assign_pointer(pmc->sflist, newpsl);
mutex_unlock(&idev->mc_lock);
kfree_rcu(psl, rcu);
pmc->sfmode = gsf->gf_fmode; pmc->sfmode = gsf->gf_fmode;
err = 0; err = 0;
done: done:
......
...@@ -38,7 +38,7 @@ int nfc_fw_download(struct nfc_dev *dev, const char *firmware_name) ...@@ -38,7 +38,7 @@ int nfc_fw_download(struct nfc_dev *dev, const char *firmware_name)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -94,7 +94,7 @@ int nfc_dev_up(struct nfc_dev *dev) ...@@ -94,7 +94,7 @@ int nfc_dev_up(struct nfc_dev *dev)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -142,7 +142,7 @@ int nfc_dev_down(struct nfc_dev *dev) ...@@ -142,7 +142,7 @@ int nfc_dev_down(struct nfc_dev *dev)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -207,7 +207,7 @@ int nfc_start_poll(struct nfc_dev *dev, u32 im_protocols, u32 tm_protocols) ...@@ -207,7 +207,7 @@ int nfc_start_poll(struct nfc_dev *dev, u32 im_protocols, u32 tm_protocols)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -246,7 +246,7 @@ int nfc_stop_poll(struct nfc_dev *dev) ...@@ -246,7 +246,7 @@ int nfc_stop_poll(struct nfc_dev *dev)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -291,7 +291,7 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, u8 comm_mode) ...@@ -291,7 +291,7 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, u8 comm_mode)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -335,7 +335,7 @@ int nfc_dep_link_down(struct nfc_dev *dev) ...@@ -335,7 +335,7 @@ int nfc_dep_link_down(struct nfc_dev *dev)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -401,7 +401,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol) ...@@ -401,7 +401,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -448,7 +448,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 target_idx, u8 mode) ...@@ -448,7 +448,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 target_idx, u8 mode)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -495,7 +495,7 @@ int nfc_data_exchange(struct nfc_dev *dev, u32 target_idx, struct sk_buff *skb, ...@@ -495,7 +495,7 @@ int nfc_data_exchange(struct nfc_dev *dev, u32 target_idx, struct sk_buff *skb,
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
kfree_skb(skb); kfree_skb(skb);
goto error; goto error;
...@@ -552,7 +552,7 @@ int nfc_enable_se(struct nfc_dev *dev, u32 se_idx) ...@@ -552,7 +552,7 @@ int nfc_enable_se(struct nfc_dev *dev, u32 se_idx)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -601,7 +601,7 @@ int nfc_disable_se(struct nfc_dev *dev, u32 se_idx) ...@@ -601,7 +601,7 @@ int nfc_disable_se(struct nfc_dev *dev, u32 se_idx)
device_lock(&dev->dev); device_lock(&dev->dev);
if (!device_is_registered(&dev->dev)) { if (dev->shutting_down) {
rc = -ENODEV; rc = -ENODEV;
goto error; goto error;
} }
...@@ -1134,6 +1134,7 @@ int nfc_register_device(struct nfc_dev *dev) ...@@ -1134,6 +1134,7 @@ int nfc_register_device(struct nfc_dev *dev)
dev->rfkill = NULL; dev->rfkill = NULL;
} }
} }
dev->shutting_down = false;
device_unlock(&dev->dev); device_unlock(&dev->dev);
rc = nfc_genl_device_added(dev); rc = nfc_genl_device_added(dev);
...@@ -1166,12 +1167,10 @@ void nfc_unregister_device(struct nfc_dev *dev) ...@@ -1166,12 +1167,10 @@ void nfc_unregister_device(struct nfc_dev *dev)
rfkill_unregister(dev->rfkill); rfkill_unregister(dev->rfkill);
rfkill_destroy(dev->rfkill); rfkill_destroy(dev->rfkill);
} }
dev->shutting_down = true;
device_unlock(&dev->dev); device_unlock(&dev->dev);
if (dev->ops->check_presence) { if (dev->ops->check_presence) {
device_lock(&dev->dev);
dev->shutting_down = true;
device_unlock(&dev->dev);
del_timer_sync(&dev->check_pres_timer); del_timer_sync(&dev->check_pres_timer);
cancel_work_sync(&dev->check_pres_work); cancel_work_sync(&dev->check_pres_work);
} }
......
...@@ -1244,7 +1244,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name, ...@@ -1244,7 +1244,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name,
struct sk_buff *msg; struct sk_buff *msg;
void *hdr; void *hdr;
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
if (!msg) if (!msg)
return -ENOMEM; return -ENOMEM;
...@@ -1260,7 +1260,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name, ...@@ -1260,7 +1260,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name,
genlmsg_end(msg, hdr); genlmsg_end(msg, hdr);
genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
return 0; return 0;
......
...@@ -495,6 +495,14 @@ void rds_tcp_tune(struct socket *sock) ...@@ -495,6 +495,14 @@ void rds_tcp_tune(struct socket *sock)
tcp_sock_set_nodelay(sock->sk); tcp_sock_set_nodelay(sock->sk);
lock_sock(sk); lock_sock(sk);
/* TCP timer functions might access net namespace even after
* a process which created this net namespace terminated.
*/
if (!sk->sk_net_refcnt) {
sk->sk_net_refcnt = 1;
get_net_track(net, &sk->ns_tracker, GFP_KERNEL);
sock_inuse_add(net, 1);
}
if (rtn->sndbuf_size > 0) { if (rtn->sndbuf_size > 0) {
sk->sk_sndbuf = rtn->sndbuf_size; sk->sk_sndbuf = rtn->sndbuf_size;
sk->sk_userlocks |= SOCK_SNDBUF_LOCK; sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
......
...@@ -117,6 +117,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net) ...@@ -117,6 +117,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
local, srx->transport_type, srx->transport.family); local, srx->transport_type, srx->transport.family);
udp_conf.family = srx->transport.family; udp_conf.family = srx->transport.family;
udp_conf.use_udp_checksums = true;
if (udp_conf.family == AF_INET) { if (udp_conf.family == AF_INET) {
udp_conf.local_ip = srx->transport.sin.sin_addr; udp_conf.local_ip = srx->transport.sin.sin_addr;
udp_conf.local_udp_port = srx->transport.sin.sin_port; udp_conf.local_udp_port = srx->transport.sin.sin_port;
...@@ -124,6 +125,8 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net) ...@@ -124,6 +125,8 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
} else { } else {
udp_conf.local_ip6 = srx->transport.sin6.sin6_addr; udp_conf.local_ip6 = srx->transport.sin6.sin6_addr;
udp_conf.local_udp_port = srx->transport.sin6.sin6_port; udp_conf.local_udp_port = srx->transport.sin6.sin6_port;
udp_conf.use_udp6_tx_checksums = true;
udp_conf.use_udp6_rx_checksums = true;
#endif #endif
} }
ret = udp_sock_create(net, &udp_conf, &local->socket); ret = udp_sock_create(net, &udp_conf, &local->socket);
......
...@@ -190,7 +190,7 @@ setup_prepare() ...@@ -190,7 +190,7 @@ setup_prepare()
tc filter add dev $eth0 ingress chain $(IS2 0 0) pref 1 \ tc filter add dev $eth0 ingress chain $(IS2 0 0) pref 1 \
protocol ipv4 flower skip_sw ip_proto udp dst_port 5201 \ protocol ipv4 flower skip_sw ip_proto udp dst_port 5201 \
action police rate 50mbit burst 64k \ action police rate 50mbit burst 64k conform-exceed drop/pipe \
action goto chain $(IS2 1 0) action goto chain $(IS2 1 0)
} }
......
...@@ -30,7 +30,7 @@ TEST_PROGS += ioam6.sh ...@@ -30,7 +30,7 @@ TEST_PROGS += ioam6.sh
TEST_PROGS += gro.sh TEST_PROGS += gro.sh
TEST_PROGS += gre_gso.sh TEST_PROGS += gre_gso.sh
TEST_PROGS += cmsg_so_mark.sh TEST_PROGS += cmsg_so_mark.sh
TEST_PROGS += cmsg_time.sh TEST_PROGS += cmsg_time.sh cmsg_ipv6.sh
TEST_PROGS += srv6_end_dt46_l3vpn_test.sh TEST_PROGS += srv6_end_dt46_l3vpn_test.sh
TEST_PROGS += srv6_end_dt4_l3vpn_test.sh TEST_PROGS += srv6_end_dt4_l3vpn_test.sh
TEST_PROGS += srv6_end_dt6_l3vpn_test.sh TEST_PROGS += srv6_end_dt6_l3vpn_test.sh
...@@ -54,6 +54,7 @@ TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa ...@@ -54,6 +54,7 @@ TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa
TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict tls TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict tls
TEST_GEN_FILES += toeplitz TEST_GEN_FILES += toeplitz
TEST_GEN_FILES += cmsg_sender TEST_GEN_FILES += cmsg_sender
TEST_PROGS += test_vxlan_vnifiltering.sh
TEST_FILES := settings TEST_FILES := settings
......
...@@ -2,15 +2,31 @@ ...@@ -2,15 +2,31 @@
TEST_PROGS = bridge_igmp.sh \ TEST_PROGS = bridge_igmp.sh \
bridge_locked_port.sh \ bridge_locked_port.sh \
bridge_mld.sh \
bridge_port_isolation.sh \ bridge_port_isolation.sh \
bridge_sticky_fdb.sh \ bridge_sticky_fdb.sh \
bridge_vlan_aware.sh \ bridge_vlan_aware.sh \
bridge_vlan_mcast.sh \
bridge_vlan_unaware.sh \ bridge_vlan_unaware.sh \
custom_multipath_hash.sh \
dual_vxlan_bridge.sh \
ethtool_extended_state.sh \
ethtool.sh \ ethtool.sh \
gre_custom_multipath_hash.sh \
gre_inner_v4_multipath.sh \ gre_inner_v4_multipath.sh \
gre_inner_v6_multipath.sh \ gre_inner_v6_multipath.sh \
gre_multipath_nh_res.sh \
gre_multipath_nh.sh \
gre_multipath.sh \ gre_multipath.sh \
hw_stats_l3.sh \
ip6_forward_instats_vrf.sh \ ip6_forward_instats_vrf.sh \
ip6gre_custom_multipath_hash.sh \
ip6gre_flat_key.sh \
ip6gre_flat_keys.sh \
ip6gre_flat.sh \
ip6gre_hier_key.sh \
ip6gre_hier_keys.sh \
ip6gre_hier.sh \
ip6gre_inner_v4_multipath.sh \ ip6gre_inner_v4_multipath.sh \
ip6gre_inner_v6_multipath.sh \ ip6gre_inner_v6_multipath.sh \
ipip_flat_gre_key.sh \ ipip_flat_gre_key.sh \
...@@ -34,36 +50,53 @@ TEST_PROGS = bridge_igmp.sh \ ...@@ -34,36 +50,53 @@ TEST_PROGS = bridge_igmp.sh \
mirror_gre_vlan_bridge_1q.sh \ mirror_gre_vlan_bridge_1q.sh \
mirror_gre_vlan.sh \ mirror_gre_vlan.sh \
mirror_vlan.sh \ mirror_vlan.sh \
pedit_dsfield.sh \
pedit_ip.sh \
pedit_l4port.sh \
q_in_vni_ipv6.sh \
q_in_vni.sh \
router_bridge.sh \ router_bridge.sh \
router_bridge_vlan.sh \ router_bridge_vlan.sh \
router_broadcast.sh \ router_broadcast.sh \
router_mpath_nh_res.sh \
router_mpath_nh.sh \ router_mpath_nh.sh \
router_multicast.sh \ router_multicast.sh \
router_multipath.sh \ router_multipath.sh \
router_nh.sh \
router.sh \ router.sh \
router_vid_1.sh \ router_vid_1.sh \
sch_ets.sh \ sch_ets.sh \
sch_red.sh \
sch_tbf_ets.sh \ sch_tbf_ets.sh \
sch_tbf_prio.sh \ sch_tbf_prio.sh \
sch_tbf_root.sh \ sch_tbf_root.sh \
skbedit_priority.sh \
tc_actions.sh \ tc_actions.sh \
tc_chains.sh \ tc_chains.sh \
tc_flower_router.sh \ tc_flower_router.sh \
tc_flower.sh \ tc_flower.sh \
tc_mpls_l2vpn.sh \ tc_mpls_l2vpn.sh \
tc_police.sh \
tc_shblocks.sh \ tc_shblocks.sh \
tc_vlan_modify.sh \ tc_vlan_modify.sh \
vxlan_asymmetric_ipv6.sh \
vxlan_asymmetric.sh \ vxlan_asymmetric.sh \
vxlan_bridge_1d_ipv6.sh \
vxlan_bridge_1d_port_8472_ipv6.sh \
vxlan_bridge_1d_port_8472.sh \ vxlan_bridge_1d_port_8472.sh \
vxlan_bridge_1d.sh \ vxlan_bridge_1d.sh \
vxlan_bridge_1q_ipv6.sh \
vxlan_bridge_1q_port_8472_ipv6.sh
vxlan_bridge_1q_port_8472.sh \ vxlan_bridge_1q_port_8472.sh \
vxlan_bridge_1q.sh \ vxlan_bridge_1q.sh \
vxlan_symmetric_ipv6.sh \
vxlan_symmetric.sh vxlan_symmetric.sh
TEST_PROGS_EXTENDED := devlink_lib.sh \ TEST_PROGS_EXTENDED := devlink_lib.sh \
ethtool_lib.sh \ ethtool_lib.sh \
fib_offload_lib.sh \ fib_offload_lib.sh \
forwarding.config.sample \ forwarding.config.sample \
ip6gre_lib.sh \
ipip_lib.sh \ ipip_lib.sh \
lib.sh \ lib.sh \
mirror_gre_lib.sh \ mirror_gre_lib.sh \
......
...@@ -61,9 +61,12 @@ setup_prepare() ...@@ -61,9 +61,12 @@ setup_prepare()
vrf_prepare vrf_prepare
mirror_gre_topo_create mirror_gre_topo_create
# Avoid changing br1's PVID while it is operational as a L3 interface.
ip link set dev br1 down
ip link set dev $swp3 master br1 ip link set dev $swp3 master br1
bridge vlan add dev br1 vid 555 pvid untagged self bridge vlan add dev br1 vid 555 pvid untagged self
ip link set dev br1 up
ip address add dev br1 192.0.2.129/28 ip address add dev br1 192.0.2.129/28
ip address add dev br1 2001:db8:2::1/64 ip address add dev br1 2001:db8:2::1/64
......
...@@ -421,7 +421,7 @@ static void usage(const char *progname) ...@@ -421,7 +421,7 @@ static void usage(const char *progname)
"Options:\n" "Options:\n"
" -4 only IPv4\n" " -4 only IPv4\n"
" -6 only IPv6\n" " -6 only IPv6\n"
" -c <clock> monotonic (default) or tai\n" " -c <clock> monotonic or tai (default)\n"
" -D <addr> destination IP address (server)\n" " -D <addr> destination IP address (server)\n"
" -S <addr> source IP address (client)\n" " -S <addr> source IP address (client)\n"
" -r run rx mode\n" " -r run rx mode\n"
...@@ -475,7 +475,7 @@ static void parse_opts(int argc, char **argv) ...@@ -475,7 +475,7 @@ static void parse_opts(int argc, char **argv)
cfg_rx = true; cfg_rx = true;
break; break;
case 't': case 't':
cfg_start_time_ns = strtol(optarg, NULL, 0); cfg_start_time_ns = strtoll(optarg, NULL, 0);
break; break;
case 'm': case 'm':
cfg_mark = strtol(optarg, NULL, 0); cfg_mark = strtol(optarg, NULL, 0);
......
...@@ -22,10 +22,12 @@ ...@@ -22,10 +22,12 @@
# interfaces in $ns1 and $ns2. See https://www.wireguard.com/netns/ for further # interfaces in $ns1 and $ns2. See https://www.wireguard.com/netns/ for further
# details on how this is accomplished. # details on how this is accomplished.
set -e set -e
shopt -s extglob
exec 3>&1 exec 3>&1
export LANG=C export LANG=C
export WG_HIDE_KEYS=never export WG_HIDE_KEYS=never
NPROC=( /sys/devices/system/cpu/cpu+([0-9]) ); NPROC=${#NPROC[@]}
netns0="wg-test-$$-0" netns0="wg-test-$$-0"
netns1="wg-test-$$-1" netns1="wg-test-$$-1"
netns2="wg-test-$$-2" netns2="wg-test-$$-2"
...@@ -143,17 +145,15 @@ tests() { ...@@ -143,17 +145,15 @@ tests() {
n1 iperf3 -Z -t 3 -b 0 -u -c fd00::2 n1 iperf3 -Z -t 3 -b 0 -u -c fd00::2
# TCP over IPv4, in parallel # TCP over IPv4, in parallel
for max in 4 5 50; do local pids=( ) i
local pids=( ) for ((i=0; i < NPROC; ++i)) do
for ((i=0; i < max; ++i)) do n2 iperf3 -p $(( 5200 + i )) -s -1 -B 192.168.241.2 &
n2 iperf3 -p $(( 5200 + i )) -s -1 -B 192.168.241.2 & pids+=( $! ); waitiperf $netns2 $! $(( 5200 + i ))
pids+=( $! ); waitiperf $netns2 $! $(( 5200 + i ))
done
for ((i=0; i < max; ++i)) do
n1 iperf3 -Z -t 3 -p $(( 5200 + i )) -c 192.168.241.2 &
done
wait "${pids[@]}"
done done
for ((i=0; i < NPROC; ++i)) do
n1 iperf3 -Z -t 3 -p $(( 5200 + i )) -c 192.168.241.2 &
done
wait "${pids[@]}"
} }
[[ $(ip1 link show dev wg0) =~ mtu\ ([0-9]+) ]] && orig_mtu="${BASH_REMATCH[1]}" [[ $(ip1 link show dev wg0) =~ mtu\ ([0-9]+) ]] && orig_mtu="${BASH_REMATCH[1]}"
...@@ -280,7 +280,19 @@ read _ _ tx_bytes_before < <(n0 wg show wg1 transfer) ...@@ -280,7 +280,19 @@ read _ _ tx_bytes_before < <(n0 wg show wg1 transfer)
! n0 ping -W 1 -c 10 -f 192.168.241.2 || false ! n0 ping -W 1 -c 10 -f 192.168.241.2 || false
sleep 1 sleep 1
read _ _ tx_bytes_after < <(n0 wg show wg1 transfer) read _ _ tx_bytes_after < <(n0 wg show wg1 transfer)
(( tx_bytes_after - tx_bytes_before < 70000 )) if ! (( tx_bytes_after - tx_bytes_before < 70000 )); then
errstart=$'\x1b[37m\x1b[41m\x1b[1m'
errend=$'\x1b[0m'
echo "${errstart} ${errend}"
echo "${errstart} E R R O R ${errend}"
echo "${errstart} ${errend}"
echo "${errstart} This architecture does not do the right thing ${errend}"
echo "${errstart} with cross-namespace routing loops. This test ${errend}"
echo "${errstart} has thus technically failed but, as this issue ${errend}"
echo "${errstart} is as yet unsolved, these tests will continue ${errend}"
echo "${errstart} onward. :( ${errend}"
echo "${errstart} ${errend}"
fi
ip0 link del wg1 ip0 link del wg1
ip1 link del wg0 ip1 link del wg0
......
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
build/ build/
distfiles/ distfiles/
ccache/
...@@ -4,26 +4,24 @@ ...@@ -4,26 +4,24 @@
PWD := $(shell pwd) PWD := $(shell pwd)
CHOST := $(shell gcc -dumpmachine)
HOST_ARCH := $(firstword $(subst -, ,$(CHOST)))
ifneq (,$(ARCH))
CBUILD := $(subst -gcc,,$(lastword $(subst /, ,$(firstword $(wildcard $(foreach bindir,$(subst :, ,$(PATH)),$(bindir)/$(ARCH)-*-gcc))))))
ifeq (,$(CBUILD))
$(error The toolchain for $(ARCH) is not installed)
endif
else
CBUILD := $(CHOST)
ARCH := $(firstword $(subst -, ,$(CBUILD)))
endif
# Set these from the environment to override # Set these from the environment to override
KERNEL_PATH ?= $(PWD)/../../../../.. KERNEL_PATH ?= $(PWD)/../../../../..
BUILD_PATH ?= $(PWD)/build/$(ARCH) BUILD_PATH ?= $(PWD)/build/$(ARCH)
DISTFILES_PATH ?= $(PWD)/distfiles DISTFILES_PATH ?= $(PWD)/distfiles
NR_CPUS ?= 4 NR_CPUS ?= 4
ARCH ?=
CBUILD := $(shell gcc -dumpmachine)
HOST_ARCH := $(firstword $(subst -, ,$(CBUILD)))
ifeq ($(ARCH),)
ARCH := $(HOST_ARCH)
endif
MIRROR := https://download.wireguard.com/qemu-test/distfiles/ MIRROR := https://download.wireguard.com/qemu-test/distfiles/
KERNEL_BUILD_PATH := $(BUILD_PATH)/kernel$(if $(findstring yes,$(DEBUG_KERNEL)),-debug)
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
WIREGUARD_SOURCES := $(call rwildcard,$(KERNEL_PATH)/drivers/net/wireguard/,*)
default: qemu default: qemu
# variable name, tarball project name, version, tarball extension, default URI base # variable name, tarball project name, version, tarball extension, default URI base
...@@ -36,42 +34,33 @@ $(call file_download,$$($(1)_NAME)$(4),$(5),$(6)) ...@@ -36,42 +34,33 @@ $(call file_download,$$($(1)_NAME)$(4),$(5),$(6))
endef endef
define file_download = define file_download =
$(DISTFILES_PATH)/$(1): $(DISTFILES_PATH)/$(1): | $(4)
mkdir -p $(DISTFILES_PATH) mkdir -p $(DISTFILES_PATH)
flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -O $$@.tmp $(2)$(1) || rm -f $$@.tmp; [ -f $$@.tmp ] || exit 1; if echo "$(3) $$@.tmp" | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi' flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -O $$@.tmp $(2)$(1) || rm -f $$@.tmp; [ -f $$@.tmp ] || exit 1; if ([ -n "$(4)" ] && sed -n "s#^\([a-f0-9]\{64\}\) \($(1)\)\$$$$#\1 $(DISTFILES_PATH)/\2.tmp#p" "$(4)" || echo "$(3) $$@.tmp") | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi'
endef endef
$(eval $(call tar_download,MUSL,musl,1.2.0,.tar.gz,https://musl.libc.org/releases/,c6de7b191139142d3f9a7b5b702c9cae1b5ee6e7f57e582da9328629408fd4e8)) $(eval $(call tar_download,IPERF,iperf,3.11,.tar.gz,https://downloads.es.net/pub/iperf/,de8cb409fad61a0574f4cb07eb19ce1159707403ac2dc01b5d175e91240b7e5f))
$(eval $(call tar_download,IPERF,iperf,3.7,.tar.gz,https://downloads.es.net/pub/iperf/,d846040224317caf2f75c843d309a950a7db23f9b44b94688ccbe557d6d1710c)) $(eval $(call tar_download,BASH,bash,5.1.16,.tar.gz,https://ftp.gnu.org/gnu/bash/,5bac17218d3911834520dad13cd1f85ab944e1c09ae1aba55906be1f8192f558))
$(eval $(call tar_download,BASH,bash,5.0,.tar.gz,https://ftp.gnu.org/gnu/bash/,b4a80f2ac66170b2913efbfb9f2594f1f76c7b1afd11f799e22035d63077fb4d)) $(eval $(call tar_download,IPROUTE2,iproute2,5.17.0,.tar.gz,https://www.kernel.org/pub/linux/utils/net/iproute2/,bda331d5c4606138892f23a565d78fca18919b4d508a0b7ca8391c2da2db68b9))
$(eval $(call tar_download,IPROUTE2,iproute2,5.6.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,1b5b0e25ce6e23da7526ea1da044e814ad85ba761b10dd29c2b027c056b04692)) $(eval $(call tar_download,IPTABLES,iptables,1.8.7,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,c109c96bb04998cd44156622d36f8e04b140701ec60531a10668cfdff5e8d8f0))
$(eval $(call tar_download,IPTABLES,iptables,1.8.4,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,993a3a5490a544c2cbf2ef15cf7e7ed21af1845baf228318d5c36ef8827e157c)) $(eval $(call tar_download,NMAP,nmap,7.92,.tgz,https://nmap.org/dist/,064183ea642dc4c12b1ab3b5358ce1cef7d2e7e11ffa2849f16d339f5b717117))
$(eval $(call tar_download,NMAP,nmap,7.80,.tar.bz2,https://nmap.org/dist/,fcfa5a0e42099e12e4bf7a68ebe6fde05553383a682e816a7ec9256ab4773faa))
$(eval $(call tar_download,IPUTILS,iputils,s20190709,.tar.gz,https://github.com/iputils/iputils/archive/s20190709.tar.gz/#,a15720dd741d7538dd2645f9f516d193636ae4300ff7dbc8bfca757bf166490a)) $(eval $(call tar_download,IPUTILS,iputils,s20190709,.tar.gz,https://github.com/iputils/iputils/archive/s20190709.tar.gz/#,a15720dd741d7538dd2645f9f516d193636ae4300ff7dbc8bfca757bf166490a))
$(eval $(call tar_download,WIREGUARD_TOOLS,wireguard-tools,1.0.20200206,.tar.xz,https://git.zx2c4.com/wireguard-tools/snapshot/,f5207248c6a3c3e3bfc9ab30b91c1897b00802ed861e1f9faaed873366078c64)) $(eval $(call tar_download,WIREGUARD_TOOLS,wireguard-tools,1.0.20210914,.tar.xz,https://git.zx2c4.com/wireguard-tools/snapshot/,97ff31489217bb265b7ae850d3d0f335ab07d2652ba1feec88b734bc96bd05ac))
KERNEL_BUILD_PATH := $(BUILD_PATH)/kernel$(if $(findstring yes,$(DEBUG_KERNEL)),-debug)
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
WIREGUARD_SOURCES := $(call rwildcard,$(KERNEL_PATH)/drivers/net/wireguard/,*)
export CFLAGS ?= -O3 -pipe
export LDFLAGS ?=
export CPPFLAGS := -I$(BUILD_PATH)/include
export CFLAGS := -O3 -pipe
ifeq ($(HOST_ARCH),$(ARCH)) ifeq ($(HOST_ARCH),$(ARCH))
CROSS_COMPILE_FLAG := --host=$(CHOST)
CFLAGS += -march=native CFLAGS += -march=native
STRIP := strip
else
$(info Cross compilation: building for $(CBUILD) using $(CHOST))
CROSS_COMPILE_FLAG := --build=$(CBUILD) --host=$(CHOST)
export CROSS_COMPILE=$(CBUILD)-
STRIP := $(CBUILD)-strip
endif endif
export LDFLAGS :=
export CPPFLAGS :=
QEMU_VPORT_RESULT :=
ifeq ($(ARCH),aarch64) ifeq ($(ARCH),aarch64)
CHOST := aarch64-linux-musl
QEMU_ARCH := aarch64 QEMU_ARCH := aarch64
KERNEL_ARCH := arm64 KERNEL_ARCH := arm64
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm64/boot/Image KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm64/boot/Image
QEMU_VPORT_RESULT := virtio-serial-device
ifeq ($(HOST_ARCH),$(ARCH)) ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
else else
...@@ -79,9 +68,11 @@ QEMU_MACHINE := -cpu cortex-a53 -machine virt ...@@ -79,9 +68,11 @@ QEMU_MACHINE := -cpu cortex-a53 -machine virt
CFLAGS += -march=armv8-a -mtune=cortex-a53 CFLAGS += -march=armv8-a -mtune=cortex-a53
endif endif
else ifeq ($(ARCH),aarch64_be) else ifeq ($(ARCH),aarch64_be)
CHOST := aarch64_be-linux-musl
QEMU_ARCH := aarch64 QEMU_ARCH := aarch64
KERNEL_ARCH := arm64 KERNEL_ARCH := arm64
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm64/boot/Image KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm64/boot/Image
QEMU_VPORT_RESULT := virtio-serial-device
ifeq ($(HOST_ARCH),$(ARCH)) ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
else else
...@@ -89,9 +80,11 @@ QEMU_MACHINE := -cpu cortex-a53 -machine virt ...@@ -89,9 +80,11 @@ QEMU_MACHINE := -cpu cortex-a53 -machine virt
CFLAGS += -march=armv8-a -mtune=cortex-a53 CFLAGS += -march=armv8-a -mtune=cortex-a53
endif endif
else ifeq ($(ARCH),arm) else ifeq ($(ARCH),arm)
CHOST := arm-linux-musleabi
QEMU_ARCH := arm QEMU_ARCH := arm
KERNEL_ARCH := arm KERNEL_ARCH := arm
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm/boot/zImage KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm/boot/zImage
QEMU_VPORT_RESULT := virtio-serial-device
ifeq ($(HOST_ARCH),$(ARCH)) ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
else else
...@@ -99,9 +92,11 @@ QEMU_MACHINE := -cpu cortex-a15 -machine virt ...@@ -99,9 +92,11 @@ QEMU_MACHINE := -cpu cortex-a15 -machine virt
CFLAGS += -march=armv7-a -mtune=cortex-a15 -mabi=aapcs-linux CFLAGS += -march=armv7-a -mtune=cortex-a15 -mabi=aapcs-linux
endif endif
else ifeq ($(ARCH),armeb) else ifeq ($(ARCH),armeb)
CHOST := armeb-linux-musleabi
QEMU_ARCH := arm QEMU_ARCH := arm
KERNEL_ARCH := arm KERNEL_ARCH := arm
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm/boot/zImage KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm/boot/zImage
QEMU_VPORT_RESULT := virtio-serial-device
ifeq ($(HOST_ARCH),$(ARCH)) ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
else else
...@@ -110,6 +105,7 @@ CFLAGS += -march=armv7-a -mabi=aapcs-linux # We don't pass -mtune=cortex-a15 due ...@@ -110,6 +105,7 @@ CFLAGS += -march=armv7-a -mabi=aapcs-linux # We don't pass -mtune=cortex-a15 due
LDFLAGS += -Wl,--be8 LDFLAGS += -Wl,--be8
endif endif
else ifeq ($(ARCH),x86_64) else ifeq ($(ARCH),x86_64)
CHOST := x86_64-linux-musl
QEMU_ARCH := x86_64 QEMU_ARCH := x86_64
KERNEL_ARCH := x86_64 KERNEL_ARCH := x86_64
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
...@@ -120,6 +116,7 @@ QEMU_MACHINE := -cpu Skylake-Server -machine q35 ...@@ -120,6 +116,7 @@ QEMU_MACHINE := -cpu Skylake-Server -machine q35
CFLAGS += -march=skylake-avx512 CFLAGS += -march=skylake-avx512
endif endif
else ifeq ($(ARCH),i686) else ifeq ($(ARCH),i686)
CHOST := i686-linux-musl
QEMU_ARCH := i386 QEMU_ARCH := i386
KERNEL_ARCH := x86 KERNEL_ARCH := x86
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
...@@ -130,6 +127,7 @@ QEMU_MACHINE := -cpu coreduo -machine q35 ...@@ -130,6 +127,7 @@ QEMU_MACHINE := -cpu coreduo -machine q35
CFLAGS += -march=prescott CFLAGS += -march=prescott
endif endif
else ifeq ($(ARCH),mips64) else ifeq ($(ARCH),mips64)
CHOST := mips64-linux-musl
QEMU_ARCH := mips64 QEMU_ARCH := mips64
KERNEL_ARCH := mips KERNEL_ARCH := mips
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
...@@ -141,6 +139,7 @@ QEMU_MACHINE := -cpu MIPS64R2-generic -machine malta -smp 1 ...@@ -141,6 +139,7 @@ QEMU_MACHINE := -cpu MIPS64R2-generic -machine malta -smp 1
CFLAGS += -march=mips64r2 -EB CFLAGS += -march=mips64r2 -EB
endif endif
else ifeq ($(ARCH),mips64el) else ifeq ($(ARCH),mips64el)
CHOST := mips64el-linux-musl
QEMU_ARCH := mips64el QEMU_ARCH := mips64el
KERNEL_ARCH := mips KERNEL_ARCH := mips
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
...@@ -152,6 +151,7 @@ QEMU_MACHINE := -cpu MIPS64R2-generic -machine malta -smp 1 ...@@ -152,6 +151,7 @@ QEMU_MACHINE := -cpu MIPS64R2-generic -machine malta -smp 1
CFLAGS += -march=mips64r2 -EL CFLAGS += -march=mips64r2 -EL
endif endif
else ifeq ($(ARCH),mips) else ifeq ($(ARCH),mips)
CHOST := mips-linux-musl
QEMU_ARCH := mips QEMU_ARCH := mips
KERNEL_ARCH := mips KERNEL_ARCH := mips
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
...@@ -163,6 +163,7 @@ QEMU_MACHINE := -cpu 24Kf -machine malta -smp 1 ...@@ -163,6 +163,7 @@ QEMU_MACHINE := -cpu 24Kf -machine malta -smp 1
CFLAGS += -march=mips32r2 -EB CFLAGS += -march=mips32r2 -EB
endif endif
else ifeq ($(ARCH),mipsel) else ifeq ($(ARCH),mipsel)
CHOST := mipsel-linux-musl
QEMU_ARCH := mipsel QEMU_ARCH := mipsel
KERNEL_ARCH := mips KERNEL_ARCH := mips
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
...@@ -173,7 +174,18 @@ else ...@@ -173,7 +174,18 @@ else
QEMU_MACHINE := -cpu 24Kf -machine malta -smp 1 QEMU_MACHINE := -cpu 24Kf -machine malta -smp 1
CFLAGS += -march=mips32r2 -EL CFLAGS += -march=mips32r2 -EL
endif endif
else ifeq ($(ARCH),powerpc64)
CHOST := powerpc64-linux-musl
QEMU_ARCH := ppc64
KERNEL_ARCH := powerpc
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host,accel=kvm -machine pseries
else
QEMU_MACHINE := -machine pseries
endif
else ifeq ($(ARCH),powerpc64le) else ifeq ($(ARCH),powerpc64le)
CHOST := powerpc64le-linux-musl
QEMU_ARCH := ppc64 QEMU_ARCH := ppc64
KERNEL_ARCH := powerpc KERNEL_ARCH := powerpc
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
...@@ -182,8 +194,8 @@ QEMU_MACHINE := -cpu host,accel=kvm -machine pseries ...@@ -182,8 +194,8 @@ QEMU_MACHINE := -cpu host,accel=kvm -machine pseries
else else
QEMU_MACHINE := -machine pseries QEMU_MACHINE := -machine pseries
endif endif
CFLAGS += -mcpu=powerpc64le -mlong-double-64
else ifeq ($(ARCH),powerpc) else ifeq ($(ARCH),powerpc)
CHOST := powerpc-linux-musl
QEMU_ARCH := ppc QEMU_ARCH := ppc
KERNEL_ARCH := powerpc KERNEL_ARCH := powerpc
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/powerpc/boot/uImage KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/powerpc/boot/uImage
...@@ -192,26 +204,79 @@ QEMU_MACHINE := -cpu host,accel=kvm -machine ppce500 ...@@ -192,26 +204,79 @@ QEMU_MACHINE := -cpu host,accel=kvm -machine ppce500
else else
QEMU_MACHINE := -machine ppce500 QEMU_MACHINE := -machine ppce500
endif endif
CFLAGS += -mcpu=powerpc -mlong-double-64 -msecure-plt
else ifeq ($(ARCH),m68k) else ifeq ($(ARCH),m68k)
CHOST := m68k-linux-musl
QEMU_ARCH := m68k QEMU_ARCH := m68k
KERNEL_ARCH := m68k KERNEL_ARCH := m68k
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
KERNEL_CMDLINE := $(shell sed -n 's/CONFIG_CMDLINE=\(.*\)/\1/p' arch/m68k.config) KERNEL_CMDLINE := $(shell sed -n 's/CONFIG_CMDLINE=\(.*\)/\1/p' arch/m68k.config)
ifeq ($(HOST_ARCH),$(ARCH)) ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host,accel=kvm -machine q800 -smp 1 -append $(KERNEL_CMDLINE) QEMU_MACHINE := -cpu host,accel=kvm -machine q800 -append $(KERNEL_CMDLINE)
else else
QEMU_MACHINE := -machine q800 -smp 1 -append $(KERNEL_CMDLINE) QEMU_MACHINE := -machine q800 -smp 1 -append $(KERNEL_CMDLINE)
endif endif
else ifeq ($(ARCH),riscv64)
CHOST := riscv64-linux-musl
QEMU_ARCH := riscv64
KERNEL_ARCH := riscv
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/riscv/boot/Image
QEMU_VPORT_RESULT := virtio-serial-device
ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host,accel=kvm -machine virt
else
QEMU_MACHINE := -cpu rv64 -machine virt
endif
else ifeq ($(ARCH),riscv32)
CHOST := riscv32-linux-musl
QEMU_ARCH := riscv32
KERNEL_ARCH := riscv
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/riscv/boot/Image
QEMU_VPORT_RESULT := virtio-serial-device
ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host,accel=kvm -machine virt
else
QEMU_MACHINE := -cpu rv32 -machine virt
endif
else ifeq ($(ARCH),s390x)
CHOST := s390x-linux-musl
QEMU_ARCH := s390x
KERNEL_ARCH := s390
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/s390/boot/bzImage
KERNEL_CMDLINE := $(shell sed -n 's/CONFIG_CMDLINE=\(.*\)/\1/p' arch/s390x.config)
QEMU_VPORT_RESULT := virtio-serial-ccw
ifeq ($(HOST_ARCH),$(ARCH))
QEMU_MACHINE := -cpu host,accel=kvm -machine s390-ccw-virtio -append $(KERNEL_CMDLINE)
else
QEMU_MACHINE := -machine s390-ccw-virtio -append $(KERNEL_CMDLINE)
endif
else else
$(error I only build: x86_64, i686, arm, armeb, aarch64, aarch64_be, mips, mipsel, mips64, mips64el, powerpc64le, powerpc, m68k) $(error I only build: x86_64, i686, arm, armeb, aarch64, aarch64_be, mips, mipsel, mips64, mips64el, powerpc64, powerpc64le, powerpc, m68k, riscv64, riscv32, s390x)
endif
TOOLCHAIN_FILENAME := $(CHOST)-cross.tgz
TOOLCHAIN_TAR := $(DISTFILES_PATH)/$(TOOLCHAIN_FILENAME)
TOOLCHAIN_PATH := $(BUILD_PATH)/$(CHOST)-cross
TOOLCHAIN_DIR := https://download.wireguard.com/qemu-test/toolchains/20211123/
$(eval $(call file_download,toolchain-sha256sums-20211123,$(TOOLCHAIN_DIR)SHA256SUMS#,83da033fd8c798df476c21d9612da2dfb896ec62fbed4ceec5eefc0e56b3f0c8))
$(eval $(call file_download,$(TOOLCHAIN_FILENAME),$(TOOLCHAIN_DIR),,$(DISTFILES_PATH)/toolchain-sha256sums-20211123))
STRIP := $(CHOST)-strip
CROSS_COMPILE_FLAG := --build=$(CBUILD) --host=$(CHOST)
$(info Building for $(CHOST) using $(CBUILD))
export CROSS_COMPILE := $(CHOST)-
export PATH := $(TOOLCHAIN_PATH)/bin:$(PATH)
export CC := $(CHOST)-gcc
CCACHE_PATH := $(shell which ccache 2>/dev/null)
ifneq ($(CCACHE_PATH),)
export KBUILD_BUILD_TIMESTAMP := Fri Jun 5 15:58:00 CEST 2015
export PATH := $(TOOLCHAIN_PATH)/bin/ccache:$(PATH)
export CCACHE_SLOPPINESS := file_macro,time_macros
export CCACHE_DIR ?= $(PWD)/ccache
endif endif
REAL_CC := $(CBUILD)-gcc USERSPACE_DEPS := $(TOOLCHAIN_PATH)/.installed $(TOOLCHAIN_PATH)/$(CHOST)/include/linux/.installed
MUSL_CC := $(BUILD_PATH)/musl-gcc
export CC := $(MUSL_CC)
USERSPACE_DEPS := $(MUSL_CC) $(BUILD_PATH)/include/.installed $(BUILD_PATH)/include/linux/.installed
comma := ,
build: $(KERNEL_BZIMAGE) build: $(KERNEL_BZIMAGE)
qemu: $(KERNEL_BZIMAGE) qemu: $(KERNEL_BZIMAGE)
rm -f $(BUILD_PATH)/result rm -f $(BUILD_PATH)/result
...@@ -222,13 +287,14 @@ qemu: $(KERNEL_BZIMAGE) ...@@ -222,13 +287,14 @@ qemu: $(KERNEL_BZIMAGE)
$(QEMU_MACHINE) \ $(QEMU_MACHINE) \
-m $$(grep -q CONFIG_DEBUG_KMEMLEAK=y $(KERNEL_BUILD_PATH)/.config && echo 1G || echo 256M) \ -m $$(grep -q CONFIG_DEBUG_KMEMLEAK=y $(KERNEL_BUILD_PATH)/.config && echo 1G || echo 256M) \
-serial stdio \ -serial stdio \
-serial file:$(BUILD_PATH)/result \ -chardev file,path=$(BUILD_PATH)/result,id=result \
$(if $(QEMU_VPORT_RESULT),-device $(QEMU_VPORT_RESULT) -device virtserialport$(comma)chardev=result,-serial chardev:result) \
-no-reboot \ -no-reboot \
-monitor none \ -monitor none \
-kernel $< -kernel $<
grep -Fq success $(BUILD_PATH)/result grep -Fq success $(BUILD_PATH)/result
$(BUILD_PATH)/init-cpio-spec.txt: $(BUILD_PATH)/init-cpio-spec.txt: $(TOOLCHAIN_PATH)/.installed $(BUILD_PATH)/init
mkdir -p $(BUILD_PATH) mkdir -p $(BUILD_PATH)
echo "file /init $(BUILD_PATH)/init 755 0 0" > $@ echo "file /init $(BUILD_PATH)/init 755 0 0" > $@
echo "file /init.sh $(PWD)/../netns.sh 755 0 0" >> $@ echo "file /init.sh $(PWD)/../netns.sh 755 0 0" >> $@
...@@ -246,10 +312,10 @@ $(BUILD_PATH)/init-cpio-spec.txt: ...@@ -246,10 +312,10 @@ $(BUILD_PATH)/init-cpio-spec.txt:
echo "slink /bin/iptables xtables-legacy-multi 777 0 0" >> $@ echo "slink /bin/iptables xtables-legacy-multi 777 0 0" >> $@
echo "slink /bin/ping6 ping 777 0 0" >> $@ echo "slink /bin/ping6 ping 777 0 0" >> $@
echo "dir /lib 755 0 0" >> $@ echo "dir /lib 755 0 0" >> $@
echo "file /lib/libc.so $(MUSL_PATH)/lib/libc.so 755 0 0" >> $@ echo "file /lib/libc.so $(TOOLCHAIN_PATH)/$(CHOST)/lib/libc.so 755 0 0" >> $@
echo "slink /lib/ld-linux.so.1 libc.so 777 0 0" >> $@ echo "slink $$($(CHOST)-readelf -p .interp '$(BUILD_PATH)/init'| grep -o '/lib/.*') libc.so 777 0 0" >> $@
$(KERNEL_BUILD_PATH)/.config: kernel.config arch/$(ARCH).config $(KERNEL_BUILD_PATH)/.config: $(TOOLCHAIN_PATH)/.installed kernel.config arch/$(ARCH).config
mkdir -p $(KERNEL_BUILD_PATH) mkdir -p $(KERNEL_BUILD_PATH)
cp kernel.config $(KERNEL_BUILD_PATH)/minimal.config cp kernel.config $(KERNEL_BUILD_PATH)/minimal.config
printf 'CONFIG_NR_CPUS=$(NR_CPUS)\nCONFIG_INITRAMFS_SOURCE="$(BUILD_PATH)/init-cpio-spec.txt"\n' >> $(KERNEL_BUILD_PATH)/minimal.config printf 'CONFIG_NR_CPUS=$(NR_CPUS)\nCONFIG_INITRAMFS_SOURCE="$(BUILD_PATH)/init-cpio-spec.txt"\n' >> $(KERNEL_BUILD_PATH)/minimal.config
...@@ -258,29 +324,24 @@ $(KERNEL_BUILD_PATH)/.config: kernel.config arch/$(ARCH).config ...@@ -258,29 +324,24 @@ $(KERNEL_BUILD_PATH)/.config: kernel.config arch/$(ARCH).config
cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config $(KERNEL_BUILD_PATH)/minimal.config cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config $(KERNEL_BUILD_PATH)/minimal.config
$(if $(findstring yes,$(DEBUG_KERNEL)),cp debug.config $(KERNEL_BUILD_PATH) && cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config debug.config,) $(if $(findstring yes,$(DEBUG_KERNEL)),cp debug.config $(KERNEL_BUILD_PATH) && cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config debug.config,)
$(KERNEL_BZIMAGE): $(KERNEL_BUILD_PATH)/.config $(BUILD_PATH)/init-cpio-spec.txt $(MUSL_PATH)/lib/libc.so $(IPERF_PATH)/src/iperf3 $(IPUTILS_PATH)/ping $(BASH_PATH)/bash $(IPROUTE2_PATH)/misc/ss $(IPROUTE2_PATH)/ip/ip $(IPTABLES_PATH)/iptables/xtables-legacy-multi $(NMAP_PATH)/ncat/ncat $(WIREGUARD_TOOLS_PATH)/src/wg $(BUILD_PATH)/init ../netns.sh $(WIREGUARD_SOURCES) $(KERNEL_BZIMAGE): $(TOOLCHAIN_PATH)/.installed $(KERNEL_BUILD_PATH)/.config $(BUILD_PATH)/init-cpio-spec.txt $(IPERF_PATH)/src/iperf3 $(IPUTILS_PATH)/ping $(BASH_PATH)/bash $(IPROUTE2_PATH)/misc/ss $(IPROUTE2_PATH)/ip/ip $(IPTABLES_PATH)/iptables/xtables-legacy-multi $(NMAP_PATH)/ncat/ncat $(WIREGUARD_TOOLS_PATH)/src/wg $(BUILD_PATH)/init ../netns.sh $(WIREGUARD_SOURCES)
$(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
$(BUILD_PATH)/include/linux/.installed: | $(KERNEL_BUILD_PATH)/.config $(TOOLCHAIN_PATH)/$(CHOST)/include/linux/.installed: | $(KERNEL_BUILD_PATH)/.config $(TOOLCHAIN_PATH)/.installed
$(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) INSTALL_HDR_PATH=$(BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) headers_install rm -rf $(TOOLCHAIN_PATH)/$(CHOST)/include/linux
$(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) INSTALL_HDR_PATH=$(TOOLCHAIN_PATH)/$(CHOST) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) headers_install
touch $@ touch $@
$(MUSL_PATH)/lib/libc.so: $(MUSL_TAR) $(TOOLCHAIN_PATH)/.installed: $(TOOLCHAIN_TAR)
mkdir -p $(BUILD_PATH) mkdir -p $(BUILD_PATH)
flock -s $<.lock tar -C $(BUILD_PATH) -xf $< flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
cd $(MUSL_PATH) && CC=$(REAL_CC) ./configure --prefix=/ --disable-static --build=$(CBUILD) $(STRIP) -s $(TOOLCHAIN_PATH)/$(CHOST)/lib/libc.so
$(MAKE) -C $(MUSL_PATH) ifneq ($(CCACHE_PATH),)
$(STRIP) -s $@ mkdir -p $(TOOLCHAIN_PATH)/bin/ccache
ln -s $(CCACHE_PATH) $(TOOLCHAIN_PATH)/bin/ccache/$(CC)
$(BUILD_PATH)/include/.installed: $(MUSL_PATH)/lib/libc.so endif
$(MAKE) -C $(MUSL_PATH) DESTDIR=$(BUILD_PATH) install-headers
touch $@ touch $@
$(MUSL_CC): $(MUSL_PATH)/lib/libc.so
sh $(MUSL_PATH)/tools/musl-gcc.specs.sh $(BUILD_PATH)/include $(MUSL_PATH)/lib /lib/ld-linux.so.1 > $(BUILD_PATH)/musl-gcc.specs
printf '#!/bin/sh\nexec "$(REAL_CC)" --specs="$(BUILD_PATH)/musl-gcc.specs" "$$@"\n' > $(BUILD_PATH)/musl-gcc
chmod +x $(BUILD_PATH)/musl-gcc
$(IPERF_PATH)/.installed: $(IPERF_TAR) $(IPERF_PATH)/.installed: $(IPERF_TAR)
mkdir -p $(BUILD_PATH) mkdir -p $(BUILD_PATH)
flock -s $<.lock tar -C $(BUILD_PATH) -xf $< flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
...@@ -289,6 +350,7 @@ $(IPERF_PATH)/.installed: $(IPERF_TAR) ...@@ -289,6 +350,7 @@ $(IPERF_PATH)/.installed: $(IPERF_TAR)
touch $@ touch $@
$(IPERF_PATH)/src/iperf3: | $(IPERF_PATH)/.installed $(USERSPACE_DEPS) $(IPERF_PATH)/src/iperf3: | $(IPERF_PATH)/.installed $(USERSPACE_DEPS)
cd $(IPERF_PATH) && autoreconf -fi
cd $(IPERF_PATH) && CFLAGS="$(CFLAGS) -D_GNU_SOURCE" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --with-openssl=no cd $(IPERF_PATH) && CFLAGS="$(CFLAGS) -D_GNU_SOURCE" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --with-openssl=no
$(MAKE) -C $(IPERF_PATH) $(MAKE) -C $(IPERF_PATH)
$(STRIP) -s $@ $(STRIP) -s $@
...@@ -304,7 +366,7 @@ $(WIREGUARD_TOOLS_PATH)/src/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(USERSPACE ...@@ -304,7 +366,7 @@ $(WIREGUARD_TOOLS_PATH)/src/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(USERSPACE
$(BUILD_PATH)/init: init.c | $(USERSPACE_DEPS) $(BUILD_PATH)/init: init.c | $(USERSPACE_DEPS)
mkdir -p $(BUILD_PATH) mkdir -p $(BUILD_PATH)
$(MUSL_CC) -o $@ $(CFLAGS) $(LDFLAGS) -std=gnu11 $< $(CC) -o $@ $(CFLAGS) $(LDFLAGS) -std=gnu11 $<
$(STRIP) -s $@ $(STRIP) -s $@
$(IPUTILS_PATH)/.installed: $(IPUTILS_TAR) $(IPUTILS_PATH)/.installed: $(IPUTILS_TAR)
...@@ -323,15 +385,15 @@ $(BASH_PATH)/.installed: $(BASH_TAR) ...@@ -323,15 +385,15 @@ $(BASH_PATH)/.installed: $(BASH_TAR)
touch $@ touch $@
$(BASH_PATH)/bash: | $(BASH_PATH)/.installed $(USERSPACE_DEPS) $(BASH_PATH)/bash: | $(BASH_PATH)/.installed $(USERSPACE_DEPS)
cd $(BASH_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --without-bash-malloc --disable-debugger --disable-help-builtin --disable-history --disable-multibyte --disable-progcomp --disable-readline --disable-mem-scramble cd $(BASH_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --without-bash-malloc --disable-debugger --disable-help-builtin --disable-history --disable-progcomp --disable-readline --disable-mem-scramble
$(MAKE) -C $(BASH_PATH) $(MAKE) -C $(BASH_PATH)
$(STRIP) -s $@ $(STRIP) -s $@
$(IPROUTE2_PATH)/.installed: $(IPROUTE2_TAR) $(IPROUTE2_PATH)/.installed: $(IPROUTE2_TAR)
mkdir -p $(BUILD_PATH) mkdir -p $(BUILD_PATH)
flock -s $<.lock tar -C $(BUILD_PATH) -xf $< flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
printf 'CC:=$(CC)\nPKG_CONFIG:=pkg-config\nTC_CONFIG_XT:=n\nTC_CONFIG_ATM:=n\nTC_CONFIG_IPSET:=n\nIP_CONFIG_SETNS:=y\nHAVE_ELF:=n\nHAVE_MNL:=n\nHAVE_BERKELEY_DB:=n\nHAVE_LATEX:=n\nHAVE_PDFLATEX:=n\nCFLAGS+=-DHAVE_SETNS\n' > $(IPROUTE2_PATH)/config.mk printf 'CC:=$(CC)\nPKG_CONFIG:=pkg-config\nTC_CONFIG_XT:=n\nTC_CONFIG_ATM:=n\nTC_CONFIG_IPSET:=n\nIP_CONFIG_SETNS:=y\nHAVE_ELF:=n\nHAVE_MNL:=n\nHAVE_BERKELEY_DB:=n\nHAVE_LATEX:=n\nHAVE_PDFLATEX:=n\nCFLAGS+=-DHAVE_SETNS -DHAVE_HANDLE_AT\n' > $(IPROUTE2_PATH)/config.mk
printf 'lib: snapshot\n\t$$(MAKE) -C lib\nip/ip: lib\n\t$$(MAKE) -C ip ip\nmisc/ss: lib\n\t$$(MAKE) -C misc ss\n' >> $(IPROUTE2_PATH)/Makefile printf 'libutil.a.done:\n\tflock -x $$@.lock $$(MAKE) -C lib\n\ttouch $$@\nip/ip: libutil.a.done\n\t$$(MAKE) -C ip ip\nmisc/ss: libutil.a.done\n\t$$(MAKE) -C misc ss\n' >> $(IPROUTE2_PATH)/Makefile
touch $@ touch $@
$(IPROUTE2_PATH)/ip/ip: | $(IPROUTE2_PATH)/.installed $(USERSPACE_DEPS) $(IPROUTE2_PATH)/ip/ip: | $(IPROUTE2_PATH)/.installed $(USERSPACE_DEPS)
...@@ -370,8 +432,13 @@ clean: ...@@ -370,8 +432,13 @@ clean:
distclean: clean distclean: clean
rm -rf $(DISTFILES_PATH) rm -rf $(DISTFILES_PATH)
cacheclean: clean
ifneq ($(CCACHE_DIR),)
rm -rf $(CCACHE_DIR)
endif
menuconfig: $(KERNEL_BUILD_PATH)/.config menuconfig: $(KERNEL_BUILD_PATH)/.config
$(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) menuconfig $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) menuconfig
.PHONY: qemu build clean distclean menuconfig .PHONY: qemu build clean distclean cacheclean menuconfig
.DELETE_ON_ERROR: .DELETE_ON_ERROR:
CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyAMA0 wg.success=ttyAMA1" CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
CONFIG_FRAME_WARN=1280 CONFIG_FRAME_WARN=1280
CONFIG_CPU_BIG_ENDIAN=y CONFIG_CPU_BIG_ENDIAN=y
CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyAMA0 wg.success=ttyAMA1" CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
CONFIG_FRAME_WARN=1280 CONFIG_FRAME_WARN=1280
...@@ -4,6 +4,9 @@ CONFIG_ARCH_VIRT=y ...@@ -4,6 +4,9 @@ CONFIG_ARCH_VIRT=y
CONFIG_THUMB2_KERNEL=n CONFIG_THUMB2_KERNEL=n
CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyAMA0 wg.success=ttyAMA1" CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
...@@ -4,7 +4,10 @@ CONFIG_ARCH_VIRT=y ...@@ -4,7 +4,10 @@ CONFIG_ARCH_VIRT=y
CONFIG_THUMB2_KERNEL=n CONFIG_THUMB2_KERNEL=n
CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyAMA0 wg.success=ttyAMA1" CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
CONFIG_CPU_BIG_ENDIAN=y CONFIG_CPU_BIG_ENDIAN=y
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
...@@ -2,5 +2,5 @@ CONFIG_ACPI=y ...@@ -2,5 +2,5 @@ CONFIG_ACPI=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1" CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
...@@ -5,5 +5,5 @@ CONFIG_MAC=y ...@@ -5,5 +5,5 @@ CONFIG_MAC=y
CONFIG_SERIAL_PMACZILOG=y CONFIG_SERIAL_PMACZILOG=y
CONFIG_SERIAL_PMACZILOG_TTYS=y CONFIG_SERIAL_PMACZILOG_TTYS=y
CONFIG_SERIAL_PMACZILOG_CONSOLE=y CONFIG_SERIAL_PMACZILOG_CONSOLE=y
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1" CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
...@@ -7,5 +7,5 @@ CONFIG_POWER_RESET_SYSCON=y ...@@ -7,5 +7,5 @@ CONFIG_POWER_RESET_SYSCON=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1" CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
...@@ -10,5 +10,5 @@ CONFIG_POWER_RESET_SYSCON=y ...@@ -10,5 +10,5 @@ CONFIG_POWER_RESET_SYSCON=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1" CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
CONFIG_FRAME_WARN=1280 CONFIG_FRAME_WARN=1280
...@@ -11,5 +11,5 @@ CONFIG_POWER_RESET_SYSCON=y ...@@ -11,5 +11,5 @@ CONFIG_POWER_RESET_SYSCON=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1" CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
CONFIG_FRAME_WARN=1280 CONFIG_FRAME_WARN=1280
...@@ -8,5 +8,5 @@ CONFIG_POWER_RESET_SYSCON=y ...@@ -8,5 +8,5 @@ CONFIG_POWER_RESET_SYSCON=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1" CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
...@@ -6,5 +6,5 @@ CONFIG_SERIAL_8250=y ...@@ -6,5 +6,5 @@ CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_MATH_EMULATION=y CONFIG_MATH_EMULATION=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1" CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
CONFIG_PPC64=y
CONFIG_PPC_PSERIES=y
CONFIG_ALTIVEC=y
CONFIG_VSX=y
CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
CONFIG_PPC_RADIX_MMU=y
CONFIG_HVC_CONSOLE=y
CONFIG_CPU_BIG_ENDIAN=y
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=hvc0 wg.success=hvc1 panic_on_warn=1"
CONFIG_SECTION_MISMATCH_WARN_ONLY=y
CONFIG_FRAME_WARN=1280
CONFIG_THREAD_SHIFT=14
...@@ -7,7 +7,7 @@ CONFIG_PPC_RADIX_MMU=y ...@@ -7,7 +7,7 @@ CONFIG_PPC_RADIX_MMU=y
CONFIG_HVC_CONSOLE=y CONFIG_HVC_CONSOLE=y
CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=hvc0 wg.success=hvc1" CONFIG_CMDLINE="console=hvc0 wg.success=hvc1 panic_on_warn=1"
CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_SECTION_MISMATCH_WARN_ONLY=y
CONFIG_FRAME_WARN=1280 CONFIG_FRAME_WARN=1280
CONFIG_THREAD_SHIFT=14 CONFIG_THREAD_SHIFT=14
CONFIG_ARCH_RV32I=y
CONFIG_MMU=y
CONFIG_FPU=y
CONFIG_SOC_VIRT=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_CMDLINE="console=ttyS0 wg.success=vport0p1 panic_on_warn=1"
CONFIG_CMDLINE_FORCE=y
CONFIG_ARCH_RV64I=y
CONFIG_MMU=y
CONFIG_FPU=y
CONFIG_SOC_VIRT=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_CMDLINE="console=ttyS0 wg.success=vport0p1 panic_on_warn=1"
CONFIG_CMDLINE_FORCE=y
CONFIG_SCLP_VT220_TTY=y
CONFIG_SCLP_VT220_CONSOLE=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_S390_GUEST=y
CONFIG_CMDLINE="console=ttysclp0 wg.success=vport0p1 panic_on_warn=1"
...@@ -2,5 +2,5 @@ CONFIG_ACPI=y ...@@ -2,5 +2,5 @@ CONFIG_ACPI=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1" CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
CONFIG_FRAME_WARN=1280 CONFIG_FRAME_WARN=1280
...@@ -110,12 +110,6 @@ static void enable_logging(void) ...@@ -110,12 +110,6 @@ static void enable_logging(void)
panic("write(exception-trace)"); panic("write(exception-trace)");
close(fd); close(fd);
} }
fd = open("/proc/sys/kernel/panic_on_warn", O_WRONLY);
if (fd >= 0) {
if (write(fd, "1\n", 2) != 2)
panic("write(panic_on_warn)");
close(fd);
}
} }
static void kmod_selftests(void) static void kmod_selftests(void)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册