mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge tag 'net-6.6-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski:
"Including fixes from bluetooth, netfilter, WiFi.
Feels like an up-tick in regression fixes, mostly for older releases.
The hfsc fix, tcp_disconnect() and Intel WWAN fixes stand out as
fairly clear-cut user reported regressions. The mlx5 DMA bug was
causing strife for 390x folks. The fixes themselves are not
particularly scary, tho. No open investigations / outstanding reports
at the time of writing.
Current release - regressions:
- eth: mlx5: perform DMA operations in the right locations, make
devices usable on s390x, again
- sched: sch_hfsc: upgrade 'rt' to 'sc' when it becomes a inner
curve, previous fix of rejecting invalid config broke some scripts
- rfkill: reduce data->mtx scope in rfkill_fop_open, avoid deadlock
- revert "ethtool: Fix mod state of verbose no_mask bitset", needs
more work
Current release - new code bugs:
- tcp: fix listen() warning with v4-mapped-v6 address
Previous releases - regressions:
- tcp: allow tcp_disconnect() again when threads are waiting, it was
denied to plug a constant source of bugs but turns out .NET depends
on it
- eth: mlx5: fix double-free if buffer refill fails under OOM
- revert "net: wwan: iosm: enable runtime pm support for 7560", it's
causing regressions and the WWAN team at Intel disappeared
- tcp: tsq: relax tcp_small_queue_check() when rtx queue contains a
single skb, fix single-stream perf regression on some devices
Previous releases - always broken:
- Bluetooth:
- fix issues in legacy BR/EDR PIN code pairing
- correctly bounds check and pad HCI_MON_NEW_INDEX name
- netfilter:
- more fixes / follow ups for the large "commit protocol" rework,
which went in as a fix to 6.5
- fix null-derefs on netlink attrs which user may not pass in
- tcp: fix excessive TLP and RACK timeouts from HZ rounding (bless
Debian for keeping HZ=250 alive)
- net: more strict VIRTIO_NET_HDR_GSO_UDP_L4 validation, prevent
letting frankenstein UDP super-frames from getting into the stack
- net: fix interface altnames when ifc moves to a new namespace
- eth: qed: fix the size of the RX buffers
- mptcp: avoid sending RST when closing the initial subflow"
* tag 'net-6.6-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (94 commits)
Revert "ethtool: Fix mod state of verbose no_mask bitset"
selftests: mptcp: join: no RST when rm subflow/addr
mptcp: avoid sending RST when closing the initial subflow
mptcp: more conservative check for zero probes
tcp: check mptcp-level constraints for backlog coalescing
selftests: mptcp: join: correctly check for no RST
net: ti: icssg-prueth: Fix r30 CMDs bitmasks
selftests: net: add very basic test for netdev names and namespaces
net: move altnames together with the netdevice
net: avoid UAF on deleted altname
net: check for altname conflicts when changing netdev's netns
net: fix ifname in netlink ntf during netns move
net: ethernet: ti: Fix mixed module-builtin object
net: phy: bcm7xxx: Add missing 16nm EPHY statistics
ipv4: fib: annotate races around nh->nh_saddr_genid and nh->nh_saddr
tcp_bpf: properly release resources on error paths
net/sched: sch_hfsc: upgrade 'rt' to 'sc' when it becomes a inner curve
net: mdio-mux: fix C45 access returning -EIO after API change
tcp: tsq: relax tcp_small_queue_check() when rtx queue contains a single skb
octeon_ep: update BQL sent bytes before ringing doorbell
...
This commit is contained in:
@@ -323,7 +323,7 @@ operations:
|
||||
- dev-name
|
||||
- sb-index
|
||||
reply: &sb-get-reply
|
||||
value: 11
|
||||
value: 13
|
||||
attributes: *sb-id-attrs
|
||||
dump:
|
||||
request:
|
||||
@@ -350,7 +350,7 @@ operations:
|
||||
- sb-index
|
||||
- sb-pool-index
|
||||
reply: &sb-pool-get-reply
|
||||
value: 15
|
||||
value: 17
|
||||
attributes: *sb-pool-id-attrs
|
||||
dump:
|
||||
request:
|
||||
@@ -378,7 +378,7 @@ operations:
|
||||
- sb-index
|
||||
- sb-pool-index
|
||||
reply: &sb-port-pool-get-reply
|
||||
value: 19
|
||||
value: 21
|
||||
attributes: *sb-port-pool-id-attrs
|
||||
dump:
|
||||
request:
|
||||
@@ -407,7 +407,7 @@ operations:
|
||||
- sb-pool-type
|
||||
- sb-tc-index
|
||||
reply: &sb-tc-pool-bind-get-reply
|
||||
value: 23
|
||||
value: 25
|
||||
attributes: *sb-tc-pool-bind-id-attrs
|
||||
dump:
|
||||
request:
|
||||
@@ -538,7 +538,7 @@ operations:
|
||||
- dev-name
|
||||
- trap-name
|
||||
reply: &trap-get-reply
|
||||
value: 61
|
||||
value: 63
|
||||
attributes: *trap-id-attrs
|
||||
dump:
|
||||
request:
|
||||
@@ -564,7 +564,7 @@ operations:
|
||||
- dev-name
|
||||
- trap-group-name
|
||||
reply: &trap-group-get-reply
|
||||
value: 65
|
||||
value: 67
|
||||
attributes: *trap-group-id-attrs
|
||||
dump:
|
||||
request:
|
||||
@@ -590,7 +590,7 @@ operations:
|
||||
- dev-name
|
||||
- trap-policer-id
|
||||
reply: &trap-policer-get-reply
|
||||
value: 69
|
||||
value: 71
|
||||
attributes: *trap-policer-id-attrs
|
||||
dump:
|
||||
request:
|
||||
@@ -617,7 +617,7 @@ operations:
|
||||
- port-index
|
||||
- rate-node-name
|
||||
reply: &rate-get-reply
|
||||
value: 74
|
||||
value: 76
|
||||
attributes: *rate-id-attrs
|
||||
dump:
|
||||
request:
|
||||
@@ -643,7 +643,7 @@ operations:
|
||||
- dev-name
|
||||
- linecard-index
|
||||
reply: &linecard-get-reply
|
||||
value: 78
|
||||
value: 80
|
||||
attributes: *linecard-id-attrs
|
||||
dump:
|
||||
request:
|
||||
|
||||
@@ -162,9 +162,11 @@ How are representors identified?
|
||||
The representor netdevice should *not* directly refer to a PCIe device (e.g.
|
||||
through ``net_dev->dev.parent`` / ``SET_NETDEV_DEV()``), either of the
|
||||
representee or of the switchdev function.
|
||||
Instead, it should implement the ``ndo_get_devlink_port()`` netdevice op, which
|
||||
the kernel uses to provide the ``phys_switch_id`` and ``phys_port_name`` sysfs
|
||||
nodes. (Some legacy drivers implement ``ndo_get_port_parent_id()`` and
|
||||
Instead, the driver should use the ``SET_NETDEV_DEVLINK_PORT`` macro to
|
||||
assign a devlink port instance to the netdevice before registering the
|
||||
netdevice; the kernel uses the devlink port to provide the ``phys_switch_id``
|
||||
and ``phys_port_name`` sysfs nodes.
|
||||
(Some legacy drivers implement ``ndo_get_port_parent_id()`` and
|
||||
``ndo_get_phys_port_name()`` directly, but this is deprecated.) See
|
||||
:ref:`Documentation/networking/devlink/devlink-port.rst <devlink_port>` for the
|
||||
details of this API.
|
||||
|
||||
@@ -962,13 +962,10 @@ static void btrtl_dmp_hdr(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
skb_put_data(skb, buf, strlen(buf));
|
||||
}
|
||||
|
||||
static int btrtl_register_devcoredump_support(struct hci_dev *hdev)
|
||||
static void btrtl_register_devcoredump_support(struct hci_dev *hdev)
|
||||
{
|
||||
int err;
|
||||
hci_devcd_register(hdev, btrtl_coredump, btrtl_dmp_hdr, NULL);
|
||||
|
||||
err = hci_devcd_register(hdev, btrtl_coredump, btrtl_dmp_hdr, NULL);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void btrtl_set_driver_name(struct hci_dev *hdev, const char *driver_name)
|
||||
@@ -1255,8 +1252,7 @@ int btrtl_download_firmware(struct hci_dev *hdev,
|
||||
}
|
||||
|
||||
done:
|
||||
if (!err)
|
||||
err = btrtl_register_devcoredump_support(hdev);
|
||||
btrtl_register_devcoredump_support(hdev);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -74,7 +74,10 @@ static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
struct vhci_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
|
||||
|
||||
mutex_lock(&data->open_mutex);
|
||||
skb_queue_tail(&data->readq, skb);
|
||||
mutex_unlock(&data->open_mutex);
|
||||
|
||||
wake_up_interruptible(&data->read_wait);
|
||||
return 0;
|
||||
|
||||
@@ -4023,7 +4023,7 @@ static inline const void *bond_pull_data(struct sk_buff *skb,
|
||||
if (likely(n <= hlen))
|
||||
return data;
|
||||
else if (skb && likely(pskb_may_pull(skb, n)))
|
||||
return skb->head;
|
||||
return skb->data;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -617,17 +617,16 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
|
||||
dn = of_find_compatible_node(NULL, NULL, "brcm,unimac-mdio");
|
||||
priv->master_mii_bus = of_mdio_find_bus(dn);
|
||||
if (!priv->master_mii_bus) {
|
||||
of_node_put(dn);
|
||||
return -EPROBE_DEFER;
|
||||
err = -EPROBE_DEFER;
|
||||
goto err_of_node_put;
|
||||
}
|
||||
|
||||
get_device(&priv->master_mii_bus->dev);
|
||||
priv->master_mii_dn = dn;
|
||||
|
||||
priv->slave_mii_bus = mdiobus_alloc();
|
||||
if (!priv->slave_mii_bus) {
|
||||
of_node_put(dn);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto err_put_master_mii_bus_dev;
|
||||
}
|
||||
|
||||
priv->slave_mii_bus->priv = priv;
|
||||
@@ -684,11 +683,17 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
|
||||
}
|
||||
|
||||
err = mdiobus_register(priv->slave_mii_bus);
|
||||
if (err && dn) {
|
||||
mdiobus_free(priv->slave_mii_bus);
|
||||
of_node_put(dn);
|
||||
}
|
||||
if (err && dn)
|
||||
goto err_free_slave_mii_bus;
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_slave_mii_bus:
|
||||
mdiobus_free(priv->slave_mii_bus);
|
||||
err_put_master_mii_bus_dev:
|
||||
put_device(&priv->master_mii_bus->dev);
|
||||
err_of_node_put:
|
||||
of_node_put(dn);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -696,6 +701,7 @@ static void bcm_sf2_mdio_unregister(struct bcm_sf2_priv *priv)
|
||||
{
|
||||
mdiobus_unregister(priv->slave_mii_bus);
|
||||
mdiobus_free(priv->slave_mii_bus);
|
||||
put_device(&priv->master_mii_bus->dev);
|
||||
of_node_put(priv->master_mii_dn);
|
||||
}
|
||||
|
||||
|
||||
@@ -911,7 +911,7 @@ static int csk_wait_memory(struct chtls_dev *cdev,
|
||||
struct sock *sk, long *timeo_p)
|
||||
{
|
||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
||||
int err = 0;
|
||||
int ret, err = 0;
|
||||
long current_timeo;
|
||||
long vm_wait = 0;
|
||||
bool noblock;
|
||||
@@ -942,10 +942,13 @@ static int csk_wait_memory(struct chtls_dev *cdev,
|
||||
|
||||
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
|
||||
sk->sk_write_pending++;
|
||||
sk_wait_event(sk, ¤t_timeo, sk->sk_err ||
|
||||
(sk->sk_shutdown & SEND_SHUTDOWN) ||
|
||||
(csk_mem_free(cdev, sk) && !vm_wait), &wait);
|
||||
ret = sk_wait_event(sk, ¤t_timeo, sk->sk_err ||
|
||||
(sk->sk_shutdown & SEND_SHUTDOWN) ||
|
||||
(csk_mem_free(cdev, sk) && !vm_wait),
|
||||
&wait);
|
||||
sk->sk_write_pending--;
|
||||
if (ret < 0)
|
||||
goto do_error;
|
||||
|
||||
if (vm_wait) {
|
||||
vm_wait -= current_timeo;
|
||||
@@ -1348,6 +1351,7 @@ static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||
int copied = 0;
|
||||
int target;
|
||||
long timeo;
|
||||
int ret;
|
||||
|
||||
buffers_freed = 0;
|
||||
|
||||
@@ -1423,7 +1427,11 @@ static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||
if (copied >= target)
|
||||
break;
|
||||
chtls_cleanup_rbuf(sk, copied);
|
||||
sk_wait_data(sk, &timeo, NULL);
|
||||
ret = sk_wait_data(sk, &timeo, NULL);
|
||||
if (ret < 0) {
|
||||
copied = copied ? : ret;
|
||||
goto unlock;
|
||||
}
|
||||
continue;
|
||||
found_ok_skb:
|
||||
if (!skb->len) {
|
||||
@@ -1518,6 +1526,8 @@ skip_copy:
|
||||
|
||||
if (buffers_freed)
|
||||
chtls_cleanup_rbuf(sk, copied);
|
||||
|
||||
unlock:
|
||||
release_sock(sk);
|
||||
return copied;
|
||||
}
|
||||
@@ -1534,6 +1544,7 @@ static int peekmsg(struct sock *sk, struct msghdr *msg,
|
||||
int copied = 0;
|
||||
size_t avail; /* amount of available data in current skb */
|
||||
long timeo;
|
||||
int ret;
|
||||
|
||||
lock_sock(sk);
|
||||
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||
@@ -1585,7 +1596,12 @@ static int peekmsg(struct sock *sk, struct msghdr *msg,
|
||||
release_sock(sk);
|
||||
lock_sock(sk);
|
||||
} else {
|
||||
sk_wait_data(sk, &timeo, NULL);
|
||||
ret = sk_wait_data(sk, &timeo, NULL);
|
||||
if (ret < 0) {
|
||||
/* here 'copied' is 0 due to previous checks */
|
||||
copied = ret;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(peek_seq != tp->copied_seq)) {
|
||||
@@ -1656,6 +1672,7 @@ int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||
int copied = 0;
|
||||
long timeo;
|
||||
int target; /* Read at least this many bytes */
|
||||
int ret;
|
||||
|
||||
buffers_freed = 0;
|
||||
|
||||
@@ -1747,7 +1764,11 @@ int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||
if (copied >= target)
|
||||
break;
|
||||
chtls_cleanup_rbuf(sk, copied);
|
||||
sk_wait_data(sk, &timeo, NULL);
|
||||
ret = sk_wait_data(sk, &timeo, NULL);
|
||||
if (ret < 0) {
|
||||
copied = copied ? : ret;
|
||||
goto unlock;
|
||||
}
|
||||
continue;
|
||||
|
||||
found_ok_skb:
|
||||
@@ -1816,6 +1837,7 @@ skip_copy:
|
||||
if (buffers_freed)
|
||||
chtls_cleanup_rbuf(sk, copied);
|
||||
|
||||
unlock:
|
||||
release_sock(sk);
|
||||
return copied;
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ static int gve_prefill_rx_pages(struct gve_rx_ring *rx)
|
||||
err = gve_rx_alloc_buffer(priv, &priv->pdev->dev, &rx->data.page_info[i],
|
||||
&rx->data.data_ring[i]);
|
||||
if (err)
|
||||
goto alloc_err;
|
||||
goto alloc_err_rda;
|
||||
}
|
||||
|
||||
if (!rx->data.raw_addressing) {
|
||||
@@ -171,12 +171,26 @@ static int gve_prefill_rx_pages(struct gve_rx_ring *rx)
|
||||
return slots;
|
||||
|
||||
alloc_err_qpl:
|
||||
/* Fully free the copy pool pages. */
|
||||
while (j--) {
|
||||
page_ref_sub(rx->qpl_copy_pool[j].page,
|
||||
rx->qpl_copy_pool[j].pagecnt_bias - 1);
|
||||
put_page(rx->qpl_copy_pool[j].page);
|
||||
}
|
||||
alloc_err:
|
||||
|
||||
/* Do not fully free QPL pages - only remove the bias added in this
|
||||
* function with gve_setup_rx_buffer.
|
||||
*/
|
||||
while (i--)
|
||||
page_ref_sub(rx->data.page_info[i].page,
|
||||
rx->data.page_info[i].pagecnt_bias - 1);
|
||||
|
||||
gve_unassign_qpl(priv, rx->data.qpl->id);
|
||||
rx->data.qpl = NULL;
|
||||
|
||||
return err;
|
||||
|
||||
alloc_err_rda:
|
||||
while (i--)
|
||||
gve_rx_free_buffer(&priv->pdev->dev,
|
||||
&rx->data.page_info[i],
|
||||
|
||||
@@ -1082,7 +1082,7 @@ void i40e_clear_hw(struct i40e_hw *hw)
|
||||
I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
|
||||
j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
|
||||
I40E_PFLAN_QALLOC_LASTQ_SHIFT;
|
||||
if (val & I40E_PFLAN_QALLOC_VALID_MASK)
|
||||
if (val & I40E_PFLAN_QALLOC_VALID_MASK && j >= base_queue)
|
||||
num_queues = (j - base_queue) + 1;
|
||||
else
|
||||
num_queues = 0;
|
||||
@@ -1092,7 +1092,7 @@ void i40e_clear_hw(struct i40e_hw *hw)
|
||||
I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
|
||||
j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
|
||||
I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
|
||||
if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
|
||||
if (val & I40E_PF_VT_PFALLOC_VALID_MASK && j >= i)
|
||||
num_vfs = (j - i) + 1;
|
||||
else
|
||||
num_vfs = 0;
|
||||
|
||||
@@ -1201,8 +1201,7 @@ static void ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctxt, struct ice_vsi *vsi)
|
||||
|
||||
ctxt->info.q_opt_rss = ((lut_type << ICE_AQ_VSI_Q_OPT_RSS_LUT_S) &
|
||||
ICE_AQ_VSI_Q_OPT_RSS_LUT_M) |
|
||||
((hash_type << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) &
|
||||
ICE_AQ_VSI_Q_OPT_RSS_HASH_M);
|
||||
(hash_type & ICE_AQ_VSI_Q_OPT_RSS_HASH_M);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <generated/utsrelease.h>
|
||||
#include <linux/crash_dump.h>
|
||||
#include "ice.h"
|
||||
#include "ice_base.h"
|
||||
#include "ice_lib.h"
|
||||
@@ -4683,6 +4684,9 @@ static void ice_init_features(struct ice_pf *pf)
|
||||
|
||||
static void ice_deinit_features(struct ice_pf *pf)
|
||||
{
|
||||
if (ice_is_safe_mode(pf))
|
||||
return;
|
||||
|
||||
ice_deinit_lag(pf);
|
||||
if (test_bit(ICE_FLAG_DCB_CAPABLE, pf->flags))
|
||||
ice_cfg_lldp_mib_change(&pf->hw, false);
|
||||
@@ -5014,6 +5018,20 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* when under a kdump kernel initiate a reset before enabling the
|
||||
* device in order to clear out any pending DMA transactions. These
|
||||
* transactions can cause some systems to machine check when doing
|
||||
* the pcim_enable_device() below.
|
||||
*/
|
||||
if (is_kdump_kernel()) {
|
||||
pci_save_state(pdev);
|
||||
pci_clear_master(pdev);
|
||||
err = pcie_flr(pdev);
|
||||
if (err)
|
||||
return err;
|
||||
pci_restore_state(pdev);
|
||||
}
|
||||
|
||||
/* this driver uses devres, see
|
||||
* Documentation/driver-api/driver-model/devres.rst
|
||||
*/
|
||||
|
||||
@@ -715,20 +715,19 @@ static netdev_tx_t octep_start_xmit(struct sk_buff *skb,
|
||||
hw_desc->dptr = tx_buffer->sglist_dma;
|
||||
}
|
||||
|
||||
/* Flush the hw descriptor before writing to doorbell */
|
||||
wmb();
|
||||
|
||||
/* Ring Doorbell to notify the NIC there is a new packet */
|
||||
writel(1, iq->doorbell_reg);
|
||||
netdev_tx_sent_queue(iq->netdev_q, skb->len);
|
||||
skb_tx_timestamp(skb);
|
||||
atomic_inc(&iq->instr_pending);
|
||||
wi++;
|
||||
if (wi == iq->max_count)
|
||||
wi = 0;
|
||||
iq->host_write_index = wi;
|
||||
/* Flush the hw descriptor before writing to doorbell */
|
||||
wmb();
|
||||
|
||||
netdev_tx_sent_queue(iq->netdev_q, skb->len);
|
||||
/* Ring Doorbell to notify the NIC there is a new packet */
|
||||
writel(1, iq->doorbell_reg);
|
||||
iq->stats.instr_posted++;
|
||||
skb_tx_timestamp(skb);
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
dma_map_sg_err:
|
||||
|
||||
@@ -2186,52 +2186,23 @@ static u16 cmdif_rev(struct mlx5_core_dev *dev)
|
||||
|
||||
int mlx5_cmd_init(struct mlx5_core_dev *dev)
|
||||
{
|
||||
int size = sizeof(struct mlx5_cmd_prot_block);
|
||||
int align = roundup_pow_of_two(size);
|
||||
struct mlx5_cmd *cmd = &dev->cmd;
|
||||
u32 cmd_l;
|
||||
int err;
|
||||
|
||||
cmd->pool = dma_pool_create("mlx5_cmd", mlx5_core_dma_dev(dev), size, align, 0);
|
||||
if (!cmd->pool)
|
||||
return -ENOMEM;
|
||||
|
||||
err = alloc_cmd_page(dev, cmd);
|
||||
if (err)
|
||||
goto err_free_pool;
|
||||
|
||||
cmd_l = (u32)(cmd->dma);
|
||||
if (cmd_l & 0xfff) {
|
||||
mlx5_core_err(dev, "invalid command queue address\n");
|
||||
err = -ENOMEM;
|
||||
goto err_cmd_page;
|
||||
}
|
||||
cmd->checksum_disabled = 1;
|
||||
|
||||
spin_lock_init(&cmd->alloc_lock);
|
||||
spin_lock_init(&cmd->token_lock);
|
||||
|
||||
create_msg_cache(dev);
|
||||
|
||||
set_wqname(dev);
|
||||
cmd->wq = create_singlethread_workqueue(cmd->wq_name);
|
||||
if (!cmd->wq) {
|
||||
mlx5_core_err(dev, "failed to create command workqueue\n");
|
||||
err = -ENOMEM;
|
||||
goto err_cache;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mlx5_cmdif_debugfs_init(dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_cache:
|
||||
destroy_msg_cache(dev);
|
||||
err_cmd_page:
|
||||
free_cmd_page(dev, cmd);
|
||||
err_free_pool:
|
||||
dma_pool_destroy(cmd->pool);
|
||||
return err;
|
||||
}
|
||||
|
||||
void mlx5_cmd_cleanup(struct mlx5_core_dev *dev)
|
||||
@@ -2240,15 +2211,15 @@ void mlx5_cmd_cleanup(struct mlx5_core_dev *dev)
|
||||
|
||||
mlx5_cmdif_debugfs_cleanup(dev);
|
||||
destroy_workqueue(cmd->wq);
|
||||
destroy_msg_cache(dev);
|
||||
free_cmd_page(dev, cmd);
|
||||
dma_pool_destroy(cmd->pool);
|
||||
}
|
||||
|
||||
int mlx5_cmd_enable(struct mlx5_core_dev *dev)
|
||||
{
|
||||
int size = sizeof(struct mlx5_cmd_prot_block);
|
||||
int align = roundup_pow_of_two(size);
|
||||
struct mlx5_cmd *cmd = &dev->cmd;
|
||||
u32 cmd_h, cmd_l;
|
||||
int err;
|
||||
|
||||
memset(&cmd->vars, 0, sizeof(cmd->vars));
|
||||
cmd->vars.cmdif_rev = cmdif_rev(dev);
|
||||
@@ -2281,10 +2252,21 @@ int mlx5_cmd_enable(struct mlx5_core_dev *dev)
|
||||
sema_init(&cmd->vars.pages_sem, 1);
|
||||
sema_init(&cmd->vars.throttle_sem, DIV_ROUND_UP(cmd->vars.max_reg_cmds, 2));
|
||||
|
||||
cmd->pool = dma_pool_create("mlx5_cmd", mlx5_core_dma_dev(dev), size, align, 0);
|
||||
if (!cmd->pool)
|
||||
return -ENOMEM;
|
||||
|
||||
err = alloc_cmd_page(dev, cmd);
|
||||
if (err)
|
||||
goto err_free_pool;
|
||||
|
||||
cmd_h = (u32)((u64)(cmd->dma) >> 32);
|
||||
cmd_l = (u32)(cmd->dma);
|
||||
if (WARN_ON(cmd_l & 0xfff))
|
||||
return -EINVAL;
|
||||
if (cmd_l & 0xfff) {
|
||||
mlx5_core_err(dev, "invalid command queue address\n");
|
||||
err = -ENOMEM;
|
||||
goto err_cmd_page;
|
||||
}
|
||||
|
||||
iowrite32be(cmd_h, &dev->iseg->cmdq_addr_h);
|
||||
iowrite32be(cmd_l, &dev->iseg->cmdq_addr_l_sz);
|
||||
@@ -2297,17 +2279,27 @@ int mlx5_cmd_enable(struct mlx5_core_dev *dev)
|
||||
cmd->mode = CMD_MODE_POLLING;
|
||||
cmd->allowed_opcode = CMD_ALLOWED_OPCODE_ALL;
|
||||
|
||||
create_msg_cache(dev);
|
||||
create_debugfs_files(dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_cmd_page:
|
||||
free_cmd_page(dev, cmd);
|
||||
err_free_pool:
|
||||
dma_pool_destroy(cmd->pool);
|
||||
return err;
|
||||
}
|
||||
|
||||
void mlx5_cmd_disable(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_cmd *cmd = &dev->cmd;
|
||||
|
||||
clean_debug_files(dev);
|
||||
flush_workqueue(cmd->wq);
|
||||
clean_debug_files(dev);
|
||||
destroy_msg_cache(dev);
|
||||
free_cmd_page(dev, cmd);
|
||||
dma_pool_destroy(cmd->pool);
|
||||
}
|
||||
|
||||
void mlx5_cmd_set_state(struct mlx5_core_dev *dev,
|
||||
|
||||
@@ -848,7 +848,7 @@ static void mlx5_fw_tracer_ownership_change(struct work_struct *work)
|
||||
|
||||
mlx5_core_dbg(tracer->dev, "FWTracer: ownership changed, current=(%d)\n", tracer->owner);
|
||||
if (tracer->owner) {
|
||||
tracer->owner = false;
|
||||
mlx5_fw_tracer_ownership_acquire(tracer);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -467,6 +467,17 @@ static int mlx5_esw_bridge_switchdev_event(struct notifier_block *nb,
|
||||
/* only handle the event on peers */
|
||||
if (mlx5_esw_bridge_is_local(dev, rep, esw))
|
||||
break;
|
||||
|
||||
fdb_info = container_of(info,
|
||||
struct switchdev_notifier_fdb_info,
|
||||
info);
|
||||
/* Mark for deletion to prevent the update wq task from
|
||||
* spuriously refreshing the entry which would mark it again as
|
||||
* offloaded in SW bridge. After this fallthrough to regular
|
||||
* async delete code.
|
||||
*/
|
||||
mlx5_esw_bridge_fdb_mark_deleted(dev, vport_num, esw_owner_vhca_id, br_offloads,
|
||||
fdb_info);
|
||||
fallthrough;
|
||||
case SWITCHDEV_FDB_ADD_TO_DEVICE:
|
||||
case SWITCHDEV_FDB_DEL_TO_DEVICE:
|
||||
|
||||
@@ -24,7 +24,8 @@ static int mlx5e_set_int_port_tunnel(struct mlx5e_priv *priv,
|
||||
|
||||
route_dev = dev_get_by_index(dev_net(e->out_dev), e->route_dev_ifindex);
|
||||
|
||||
if (!route_dev || !netif_is_ovs_master(route_dev))
|
||||
if (!route_dev || !netif_is_ovs_master(route_dev) ||
|
||||
attr->parse_attr->filter_dev == e->out_dev)
|
||||
goto out;
|
||||
|
||||
err = mlx5e_set_fwd_to_int_port_actions(priv, attr, e->route_dev_ifindex,
|
||||
|
||||
@@ -874,11 +874,11 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
|
||||
}
|
||||
|
||||
out:
|
||||
if (flags & XDP_XMIT_FLUSH) {
|
||||
if (sq->mpwqe.wqe)
|
||||
mlx5e_xdp_mpwqe_complete(sq);
|
||||
if (sq->mpwqe.wqe)
|
||||
mlx5e_xdp_mpwqe_complete(sq);
|
||||
|
||||
if (flags & XDP_XMIT_FLUSH)
|
||||
mlx5e_xmit_xdp_doorbell(sq);
|
||||
}
|
||||
|
||||
return nxmit;
|
||||
}
|
||||
|
||||
@@ -701,7 +701,7 @@ mlx5e_rep_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
|
||||
|
||||
/* update HW stats in background for next time */
|
||||
mlx5e_queue_update_stats(priv);
|
||||
memcpy(stats, &priv->stats.vf_vport, sizeof(*stats));
|
||||
mlx5e_stats_copy_rep_stats(stats, &priv->stats.rep_stats);
|
||||
}
|
||||
|
||||
static int mlx5e_rep_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
@@ -769,6 +769,7 @@ static int mlx5e_rep_max_nch_limit(struct mlx5_core_dev *mdev)
|
||||
|
||||
static void mlx5e_build_rep_params(struct net_device *netdev)
|
||||
{
|
||||
const bool take_rtnl = netdev->reg_state == NETREG_REGISTERED;
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
struct mlx5e_rep_priv *rpriv = priv->ppriv;
|
||||
struct mlx5_eswitch_rep *rep = rpriv->rep;
|
||||
@@ -794,8 +795,15 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
|
||||
/* RQ */
|
||||
mlx5e_build_rq_params(mdev, params);
|
||||
|
||||
/* If netdev is already registered (e.g. move from nic profile to uplink,
|
||||
* RTNL lock must be held before triggering netdev notifiers.
|
||||
*/
|
||||
if (take_rtnl)
|
||||
rtnl_lock();
|
||||
/* update XDP supported features */
|
||||
mlx5e_set_xdp_feature(netdev);
|
||||
if (take_rtnl)
|
||||
rtnl_unlock();
|
||||
|
||||
/* CQ moderation params */
|
||||
params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
|
||||
|
||||
@@ -457,26 +457,41 @@ static int mlx5e_alloc_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk)
|
||||
static int mlx5e_refill_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk)
|
||||
{
|
||||
int remaining = wqe_bulk;
|
||||
int i = 0;
|
||||
int total_alloc = 0;
|
||||
int refill_alloc;
|
||||
int refill;
|
||||
|
||||
/* The WQE bulk is split into smaller bulks that are sized
|
||||
* according to the page pool cache refill size to avoid overflowing
|
||||
* the page pool cache due to too many page releases at once.
|
||||
*/
|
||||
do {
|
||||
int refill = min_t(u16, rq->wqe.info.refill_unit, remaining);
|
||||
int alloc_count;
|
||||
refill = min_t(u16, rq->wqe.info.refill_unit, remaining);
|
||||
|
||||
mlx5e_free_rx_wqes(rq, ix + i, refill);
|
||||
alloc_count = mlx5e_alloc_rx_wqes(rq, ix + i, refill);
|
||||
i += alloc_count;
|
||||
if (unlikely(alloc_count != refill))
|
||||
break;
|
||||
mlx5e_free_rx_wqes(rq, ix + total_alloc, refill);
|
||||
refill_alloc = mlx5e_alloc_rx_wqes(rq, ix + total_alloc, refill);
|
||||
if (unlikely(refill_alloc != refill))
|
||||
goto err_free;
|
||||
|
||||
total_alloc += refill_alloc;
|
||||
remaining -= refill;
|
||||
} while (remaining);
|
||||
|
||||
return i;
|
||||
return total_alloc;
|
||||
|
||||
err_free:
|
||||
mlx5e_free_rx_wqes(rq, ix, total_alloc + refill_alloc);
|
||||
|
||||
for (int i = 0; i < total_alloc + refill; i++) {
|
||||
int j = mlx5_wq_cyc_ctr2ix(&rq->wqe.wq, ix + i);
|
||||
struct mlx5e_wqe_frag_info *frag;
|
||||
|
||||
frag = get_frag(rq, j);
|
||||
for (int k = 0; k < rq->wqe.info.num_frags; k++, frag++)
|
||||
frag->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -816,6 +831,8 @@ err_unmap:
|
||||
mlx5e_page_release_fragmented(rq, frag_page);
|
||||
}
|
||||
|
||||
bitmap_fill(wi->skip_release_bitmap, rq->mpwqe.pages_per_wqe);
|
||||
|
||||
err:
|
||||
rq->stats->buff_alloc_err++;
|
||||
|
||||
|
||||
@@ -484,11 +484,20 @@ struct mlx5e_stats {
|
||||
struct mlx5e_vnic_env_stats vnic;
|
||||
struct mlx5e_vport_stats vport;
|
||||
struct mlx5e_pport_stats pport;
|
||||
struct rtnl_link_stats64 vf_vport;
|
||||
struct mlx5e_pcie_stats pcie;
|
||||
struct mlx5e_rep_stats rep_stats;
|
||||
};
|
||||
|
||||
static inline void mlx5e_stats_copy_rep_stats(struct rtnl_link_stats64 *vf_vport,
|
||||
struct mlx5e_rep_stats *rep_stats)
|
||||
{
|
||||
memset(vf_vport, 0, sizeof(*vf_vport));
|
||||
vf_vport->rx_packets = rep_stats->vport_rx_packets;
|
||||
vf_vport->tx_packets = rep_stats->vport_tx_packets;
|
||||
vf_vport->rx_bytes = rep_stats->vport_rx_bytes;
|
||||
vf_vport->tx_bytes = rep_stats->vport_tx_bytes;
|
||||
}
|
||||
|
||||
extern mlx5e_stats_grp_t mlx5e_nic_stats_grps[];
|
||||
unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user