[UBUNTU 20.04] mlx5 driver crashes on accessing device attributes during recovery

Bug #1987287 reported by bugproxy
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Ubuntu on IBM z Systems
Fix Released
High
Skipper Bug Screeners
linux (Ubuntu)
Invalid
Undecided
Unassigned
Focal
Fix Released
Medium
Canonical Kernel Team

Bug Description

SRU Justification:
------------------

[Impact]

 * If the mlx5 driver is reloading while the recovery flow is happening,
   and if it receives new commands before the command interface is up
   again, this can lead to null pointer that tries to access non-
   initialized command structures.

 * So it's required to avoid processing commands before the command
   interface is up again.

 * This is accomplished by a new cmdif state that helps to avoid
   processing commands while cmdif is not ready.

[Fix]

 * backport of f7936ddd35d8 f7936ddd35d8b849daf0372770c7c9dbe7910fca "net/mlx5: Avoid processing commands before cmdif is ready"

[Test Plan]

 * An Ubuntu Server for s390x 18.04 or 20.04 LPAR or z/VM installation
   is needed that has Mellanox cards (RoCE Express 2.1) assigned,
   configured and enabled and that runs a 5.4 kernel (on bionic hwe-5.4).

 * Now trigger a recovery (guess that can be done at the Support Element)
   and reload the driver at the same time.

 * Make sure the module/driver mlx5 is loaded and in use
   (otherwise it can't be removed/unloaded).

 * Now remove/unload the module with:
   sudo modprobe -r mlx5
   and (re-)load it again with:
   sudo modprobe mlx5

 * Due to the lack of RoCE Express 2.1 hardware,
   IBM needs to do the verification.

[Where problems could occur]

 * In case there is an issue with 'cmdif' it might not have the correct
   interface state, which:
   - either might lead to the fact that commands are not properly blocked
     and the situation is similar like before
   - or the commands may get always blocked,
     which render the hardware useless
   - or might block in wrong situation,
     which will cause unexpected issues and broken behavior.

 * Since the patch got upstream accepted with v5.7-rc7 it's
   not new to the kernel, was already part of groovy (and above)
   and is therefor already in use by newer Ubuntu releases.

[Other Info]

 * Since the patch is upstream since v5.7-rc7,
   it's already included in jammy and kinetic.

 * Since the upstream patch incl. the line:
   Fixes: e126ba97dba9 ("mlx5: Add driver for Mellanox
   Connect-IB adapters") it looks to me that it was forgotten
   to mark the patch for upstream stable updates.

 * Such SRUs for focal's 5.4 will automatically land in bionic's
   hwe-5.4, too. But since this was especially requested for
   bionic's hwe-5.4, I wanted to mention this here.
__________

We recently got a bug report for systems running Ubuntu 20.04 that were
crashing with backtraces pointing at the mlx5 driver's handling of mlx5_ethtool_get_link_ksettings()
when this is called through the sysfs (going through ethtool might have different checks).
I managed to find a reliable way to reproduce the issue that I believe isn't tied to IBM Z at all.

The procedure to reproduce is as follows. I created a script to read
the sysfs attributes for the link's speed and duplex mode in a loop:

#!/usr/bin/env bash

if [ $# -lt 1 ]; then
        echo "Usage: $0 <netif>"
        exit 1
fi

while true; do
        cat /sys/class/net/$1/duplex > /dev/null
        cat /sys/class/net/$1/speed > /dev/null
done

Executed with:

# ./script.sh enP10p0s0

I ran this in one bash session and then in another one I triggered a PCI reset with
the follwoing command where one needs to replace <dev> with the PCI address of the NIC:

echo 1 > /sys/bus/pci/devices/<dev>/reset

Then first I got a lot of the following messages:

 mlx5_core 0010:00:00.0 enP16p0s0: mlx5e_ethtool_get_link_ksettings: query port ptys failed: -5

And then as the mlx5 driver's recovery kicks in the oops as below:

[ 659.103947] mlx5_core 0010:00:00.0: wait vital counter value 0x7b399f after 1 iterations
[ 659.103947] mlx5_core 0010:00:00.0: mlx5_pci_resume was called
[ 659.103966] mlx5_core 0010:00:00.0: firmware version: 14.32.1010
[ 659.104169] Unable to handle kernel pointer dereference in virtual kernel address space
[ 659.104171] Failing address: 0000000000000000 TEID: 0000000000000483
[ 659.104172] Fault in home space mode while using kernel ASCE.
[ 659.104173] AS:000000003d29c007 R3:00000000fffd0007 S:00000000fffd5800 P:000000000000003d
[ 659.104200] Oops: 0004 ilc:2 [#1] SMP
[ 659.104202] Modules linked in: s390_trng ism smc pnet chsc_sch eadm_sch vfio_ccw vfio_mdev mdev vfio_iommu_type1 vfio sch_fq_codel drm drm_panel_orientation_quirks i2c_core ip_tables x_tables btrfs zstd_compress zlib_deflate raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq libcrc32c raid1 raid0 linear mlx5_ib dm_service_time pkey zcrypt crc32_vx_s390 ib_uverbs ghash_s390 ib_core qeth_l2 prng aes_s390 des_s390 nvme libdes sha3_512_s390 sha3_256_s390 sha512_s390 sha256_s390 sha1_s390 sha_common mlx5_core tls mlxfw ptp nvme_core pps_core dasd_eckd_mod dasd_mod zfcp scsi_transport_fc qeth qdio ccwgroup scsi_dh_emc scsi_dh_rdac scsi_dh_alua dm_multipath
[ 659.104232] CPU: 6 PID: 438216 Comm: cat Not tainted 5.4.0-124-generic #140-Ubuntu
[ 659.104233] Hardware name: IBM 3931 XYZ XXXX (LPAR)
[ 659.104234] Krnl PSW : 0404c00180000000 000000003bfa661e (__queue_work+0xfe/0x520)
[ 659.104241] R:0 T:1 IO:0 EX:0 Key:0 M:1 W:0 P:0 AS:3 CC:0 PM:0 RI:0 EA:3
[ 659.104242] Krnl GPRS: 000000003c291570 0000000000000000 0000000000000007 000000007fffffff
[ 659.104243] 00000000e2fe46e0 0000000fffffffe0 0000000000000006 000000003d039588
[ 659.104244] 0000000000000000 0000000000000000 00000000e2fe46e0 00000000bfb3e000
[ 659.104245] 00000000e194c400 000003e007d6fb78 000000003bfa6602 000003e007d6f860
[ 659.104251] Krnl Code: 000000003bfa6612: a77400e5 brc 7,000000003bfa67dc
                          000000003bfa6616: 582003ac l %r2,940
                         #000000003bfa661a: a7180000 lhi %r1,0
                         >000000003bfa661e: ba129000 cs %r1,%r2,0(%r9)
                          000000003bfa6622: a77401a7 brc 7,000000003bfa6970
                          000000003bfa6626: e310b0180012 lt %r1,24(%r11)
                          000000003bfa662c: a78400ff brc 8,000000003bfa682a
                          000000003bfa6630: c0040000004b brcl 0,000000003bfa66c6
[ 659.104261] Call Trace:
[ 659.104263] ([<0000000000000000>] 0x0)
[ 659.104265] [<000000003bfa6aa2>] queue_work_on+0x62/0x70
[ 659.104329] [<000003ff80a2920a>] cmd_exec+0x4ea/0x840 [mlx5_core]
[ 659.104349] [<000003ff80a29680>] mlx5_cmd_exec+0x40/0x70 [mlx5_core]
[ 659.104369] [<000003ff80a334a8>] mlx5_core_access_reg+0x108/0x150 [mlx5_core]
[ 659.104387] [<000003ff80a3354e>] mlx5_query_port_ptys+0x5e/0x70 [mlx5_core]
[ 659.104407] [<000003ff80a5b928>] mlx5e_ethtool_get_link_ksettings+0x58/0x460 [mlx5_core]
[ 659.104410] [<000000003c662a68>] duplex_show+0x78/0xe0
[ 659.104414] [<000000003c538ecc>] dev_attr_show+0x2c/0x70
[ 659.104417] [<000000003c293386>] sysfs_kf_seq_show+0xa6/0x150
[ 659.104420] [<000000003c207470>] seq_read+0xe0/0x4f0
[ 659.104422] [<000000003c1d4cf4>] vfs_read+0x94/0x160
[ 659.104423] [<000000003c1d4ea8>] ksys_read+0x68/0x100
[ 659.104426] [<000000003c7f2034>] system_call+0xd8/0x2c8
[ 659.104427] Last Breaking-Event-Address:
[ 659.104428] [<000000003bfa65d6>] __queue_work+0xb6/0x520
[ 659.104430] ---[ end trace 9fc1a6358b456876 ]---

Digging into the code and git history I found the following upstream commit added in v5.7
which besides being part of the 5.6.x stable patches somehow didn't make it into
the 5.4.x stable queue nor Ubuntu 20.04, possibly because there is a (trivial) merge conflict:

commit f7936ddd35d8b849daf0372770c7c9dbe7910fca
Author: Eran Ben Elisha <email address hidden>
Date: Thu Mar 19 21:43:13 2020 +0200

    net/mlx5: Avoid processing commands before cmdif is ready

    When driver is reloading during recovery flow, it can't get new commands
    till command interface is up again. Otherwise we may get to null pointer
    trying to access non initialized command structures.

    Add cmdif state to avoid processing commands while cmdif is not ready.

    Fixes: e126ba97dba9 ("mlx5: Add driver for Mellanox Connect-IB adapters")
    Signed-off-by: Eran Ben Elisha <email address hidden>
    Signed-off-by: Moshe Shemesh <email address hidden>
    Signed-off-by: Saeed Mahameed <email address hidden>

With a quick backport onto 5.4.0-124.140 (patch attached below) the issue is gone
and the system no longer crashes but instead recovers successfully. I believe the
crash we saw is then exactly the null pointer access mentioned in the commit description.

== Comment: #4 - Niklas Schnelle - 2022-08-22 06:41:41 ==
There was only a trivial merge conflict where the context
of the struct decleration changed.

CVE References

Revision history for this message
bugproxy (bugproxy) wrote : Backport of upstream commit to 5.4.0-124.140

Default Comment by Bridge

tags: added: architecture-s3903164 bugnameltc-199463 severity-high targetmilestone-inin---
Changed in ubuntu:
assignee: nobody → Skipper Bug Screeners (skipper-screen-team)
affects: ubuntu → linux (Ubuntu)
Revision history for this message
Frank Heimes (fheimes) wrote :

The patch mentioned is upstream since kernel v5.7-rc7,
hence it's only needed for focal (already incl. in jammy and kinetic).

Changed in ubuntu-z-systems:
assignee: nobody → Skipper Bug Screeners (skipper-screen-team)
importance: Undecided → High
Changed in linux (Ubuntu):
status: New → Invalid
Changed in linux (Ubuntu Focal):
assignee: nobody → Skipper Bug Screeners (skipper-screen-team)
Changed in linux (Ubuntu):
assignee: Skipper Bug Screeners (skipper-screen-team) → nobody
Revision history for this message
bugproxy (bugproxy) wrote : Comment bridged from LTC Bugzilla

------- Comment From <email address hidden> 2022-08-22 11:48 EDT-------
@Canonical:
As the problem occurred in the Cloud environment running on a 18.04 HWE kernel, we need to make sure that the fix will also be included there.

With adding to focal, will the patch land in 18.04 HWE kernel as well or do we need to open an additional separate bug / launchpad entry for the 18.04 HWE kernel?

Revision history for this message
Frank Heimes (fheimes) wrote :

Yes, if it get it incl. in the focal 5.4 (GA), it will automatically find it's way into the bionic hwe-5.4 as well.

Revision history for this message
bugproxy (bugproxy) wrote :

------- Comment From <email address hidden> 2022-08-30 12:28 EDT-------
@Canonical, I'd like to know that when will the fix be back ported to hwe-5.4 kernel? Will it be a new hotpatch like this one ? https://launchpad.net/~canonical-support-eng/+archive/ubuntu/sf334332 or something else. Thanks so much. Sorry I am not familiar with the process, and just like to know how can I include the fix in our cloud environment. Thanks.

Revision history for this message
Frank Heimes (fheimes) wrote :

Hello 'nafeiy', we indeed wanted to pick this up in the next days.
Just notice that this is a development bug, opened at the Launchpad bug tracking system, that is mainly used for development.

We will usually produce a patched 20.04/focal/5.4 test kernel, that we make a available via a so called PPA (a special repository).
It will take then some steps in our SRU cycle until this patched kernel gets released.
These are the upcoming kernel Service Release Cycles (SRUs): https://kernel.ubuntu.com/

This 5.4 kernel will then be migrated by our kernel team to 18.04/bionic/hwe-5.4.
But in this case we may also create a dedicated hwe-5.4 test kernel for bionic for you, to save you some time.

The process for hotfixes is a different.

Revision history for this message
Frank Heimes (fheimes) wrote :

Test kernels are now available in the following PPA:
https://launchpad.net/~fheimes/+archive/ubuntu/lp1987287
(20.04/focal 5.4 as well as 18.04.5/bionic hwe-5.4)

Frank Heimes (fheimes)
description: updated
Frank Heimes (fheimes)
description: updated
Revision history for this message
Frank Heimes (fheimes) wrote :

Kernel SRU request submitted for focal:
https://lists.ubuntu.com/archives/kernel-team/2022-September/thread.html#132957
changing status to 'In Progress'.

Changed in linux (Ubuntu Focal):
status: New → In Progress
Changed in ubuntu-z-systems:
status: New → In Progress
Changed in linux (Ubuntu Focal):
assignee: Skipper Bug Screeners (skipper-screen-team) → Canonical Kernel Team (canonical-kernel-team)
Revision history for this message
bugproxy (bugproxy) wrote :

------- Comment From <email address hidden> 2022-09-05 08:55 EDT-------
(In reply to comment #16)
> Hello 'nafeiy', we indeed wanted to pick this up in the next days.
> Just notice that this is a development bug, opened at the Launchpad bug
> tracking system, that is mainly used for development.
>
> We will usually produce a patched 20.04/focal/5.4 test kernel, that we make
> a available via a so called PPA (a special repository).
> It will take then some steps in our SRU cycle until this patched kernel gets
> released.
> These are the upcoming kernel Service Release Cycles (SRUs):
> https://kernel.ubuntu.com/
>
> This 5.4 kernel will then be migrated by our kernel team to
> 18.04/bionic/hwe-5.4.
> But in this case we may also create a dedicated hwe-5.4 test kernel for
> bionic for you, to save you some time.
>
> The process for hotfixes is a different.

Hi Frank, I tested the provided PPA kernel "5.4.0-126-generic #142~lp1987287-Ubuntu" with the reset while reading duplex/speed test from the original report.
It worked as expected no crash and a clean recovery. Thanks!

Revision history for this message
Frank Heimes (fheimes) wrote :

Many thx, Niklas!

Stefan Bader (smb)
Changed in linux (Ubuntu Focal):
importance: Undecided → Medium
status: In Progress → Fix Committed
Frank Heimes (fheimes)
Changed in ubuntu-z-systems:
status: In Progress → Fix Committed
Revision history for this message
Ubuntu Kernel Bot (ubuntu-kernel-bot) wrote :

This bug is awaiting verification that the linux/5.4.0-128.144 kernel in -proposed solves the problem. Please test the kernel and update this bug with the results. If the problem is solved, change the tag 'verification-needed-focal' to 'verification-done-focal'. If the problem still exists, change the tag 'verification-needed-focal' to 'verification-failed-focal'.

If verification is not done by 5 working days from today, this fix will be dropped from the source code, and this bug will be closed.

See https://wiki.ubuntu.com/Testing/EnableProposed for documentation how to enable and use -proposed. Thank you!

Revision history for this message
bugproxy (bugproxy) wrote :

------- Comment From <email address hidden> 2022-09-26 04:01 EDT-------
@(In reply to comment #21)
> This bug is awaiting verification that the linux/5.4.0-128.144 kernel in
> -proposed solves the problem. Please test the kernel and update this bug
> with the results. If the problem is solved, change the tag
> 'verification-needed-focal' to 'verification-done-focal'. If the problem
> still exists, change the tag 'verification-needed-focal' to
> 'verification-failed-focal'.
>
> If verification is not done by 5 working days from today, this fix will be
> dropped from the source code, and this bug will be closed.
>
> See https://wiki.ubuntu.com/Testing/EnableProposed for documentation how to
> enable and use -proposed. Thank you!

@Niklas Schnelle , I also tested this fix on our development mzone, it works. So please go ahead to next step. Thanks.

root@dal1-qz2-sr3-rk196-s12:/home/sysop# uname -a
Linux dal1-qz2-sr3-rk196-s12 5.4.0-125-generic #141~18.04.1~lp1987287-Ubuntu SMP Wed Aug 31 08:38:45 UTC 2022 s390x s390x s390x GNU/Linux

It works after we include this lp1987287 fix.

Revision history for this message
Frank Heimes (fheimes) wrote :

Thx for testing!
The further process is already in place and on a high level (just dates) described here:
https://kernel.ubuntu.com/
So this fix is now incl. in the kernel SRU cycle "2022.09.19".
Means the updated kernel that incl. the fix will soon (ideally today) land in the '-proposed' pocket of the archive (and will be installable by everyone who has '-proposed' enabled.
And if no significant issues arise during the "Bug verification & Regression testing" phase, it will be released on '10-Oct'.
That is the currently plan (however, highly severe and critical fixes and CVE have the power to overrule this planned schedule, but this fortunately does not happen very often).

Revision history for this message
bugproxy (bugproxy) wrote :

------- Comment From <email address hidden> 2022-09-26 05:58 EDT-------
(In reply to comment #23)
> Thx for testing!
> The further process is already in place and on a high level (just dates)
> described here:
> https://kernel.ubuntu.com/
> So this fix is now incl. in the kernel SRU cycle "2022.09.19".
> Means the updated kernel that incl. the fix will soon (ideally today) land
> in the '-proposed' pocket of the archive (and will be installable by
> everyone who has '-proposed' enabled.
> And if no significant issues arise during the "Bug verification & Regression
> testing" phase, it will be released on '10-Oct'.
> That is the currently plan (however, highly severe and critical fixes and
> CVE have the power to overrule this planned schedule, but this fortunately
> does not happen very often).

I confirmed this works as expected now on 5.4.0-128-generic from proposed.

Revision history for this message
Launchpad Janitor (janitor) wrote :
Download full text (19.8 KiB)

This bug was fixed in the package linux - 5.4.0-128.144

---------------
linux (5.4.0-128.144) focal; urgency=medium

  * focal/linux: 5.4.0-128.144 -proposed tracker (LP: #1990152)

  * CVE-2022-3176
    - io_uring: disable polling pollfree files

  * ip/nexthop: fix default address selection for connected nexthop
    (LP: #1988809)
    - selftests/net: test nexthop without gw

  * ip/nexthop: fix default address selection for connected nexthop
    (LP: #1988809) // icmp_redirect.sh in ubuntu_kernel_selftests failed on
    Jammy 5.15.0-49.55 (LP: #1990124)
    - ip: fix triggering of 'icmp redirect'

linux (5.4.0-127.143) focal; urgency=medium

  * focal/linux: 5.4.0-127.143 -proposed tracker (LP: #1989892)

  * Packaging resync (LP: #1786013)
    - debian/dkms-versions -- update from kernel-versions (main/2022.09.19)

  * [UBUNTU 20.04] mlx5 driver crashes on accessing device attributes during
    recovery (LP: #1987287)
    - net/mlx5: Avoid processing commands before cmdif is ready

  * Focal update: v5.4.210 upstream stable release (LP: #1989230)
    - thermal: Fix NULL pointer dereferences in of_thermal_ functions
    - ACPI: video: Force backlight native for some TongFang devices
    - ACPI: video: Shortening quirk list by identifying Clevo by board_name only
    - ACPI: APEI: Better fix to avoid spamming the console with old error logs
    - bpf: Verifer, adjust_scalar_min_max_vals to always call update_reg_bounds()
    - selftests/bpf: Extend verifier and bpf_sock tests for dst_port loads
    - bpf: Test_verifier, #70 error message updates for 32-bit right shift
    - KVM: Don't null dereference ops->destroy
    - selftests: KVM: Handle compiler optimizations in ucall
    - media: v4l2-mem2mem: Apply DST_QUEUE_OFF_BASE on MMAP buffers across ioctls
    - macintosh/adb: fix oob read in do_adb_query() function
    - x86/speculation: Add RSB VM Exit protections
    - x86/speculation: Add LFENCE to RSB fill sequence
    - Linux 5.4.210

  * Focal update: v5.4.209 upstream stable release (LP: #1989228)
    - Bluetooth: L2CAP: Fix use-after-free caused by l2cap_chan_put
    - ntfs: fix use-after-free in ntfs_ucsncmp()
    - s390/archrandom: prevent CPACF trng invocations in interrupt context
    - tcp: Fix data-races around sysctl_tcp_dsack.
    - tcp: Fix a data-race around sysctl_tcp_app_win.
    - tcp: Fix a data-race around sysctl_tcp_adv_win_scale.
    - tcp: Fix a data-race around sysctl_tcp_frto.
    - tcp: Fix a data-race around sysctl_tcp_nometrics_save.
    - ice: check (DD | EOF) bits on Rx descriptor rather than (EOP | RS)
    - ice: do not setup vlan for loopback VSI
    - scsi: ufs: host: Hold reference returned by of_parse_phandle()
    - tcp: Fix a data-race around sysctl_tcp_limit_output_bytes.
    - tcp: Fix a data-race around sysctl_tcp_challenge_ack_limit.
    - net: ping6: Fix memleak in ipv6_renew_options().
    - ipv6/addrconf: fix a null-ptr-deref bug for ip6_ptr
    - igmp: Fix data-races around sysctl_igmp_qrv.
    - net: sungem_phy: Add of_node_put() for reference returned by of_get_parent()
    - tcp: Fix a data-race around sysctl_tcp_min_tso_segs.
    - tcp: Fix a data-race around sysctl_tcp_min_rtt_wlen.
    -...

Changed in linux (Ubuntu Focal):
status: Fix Committed → Fix Released
Frank Heimes (fheimes)
Changed in ubuntu-z-systems:
status: Fix Committed → Fix Released
bugproxy (bugproxy)
tags: added: targetmilestone-inin2004
removed: targetmilestone-inin---
Revision history for this message
bugproxy (bugproxy) wrote :

------- Comment From <email address hidden> 2022-11-14 10:41 EDT-------
*** Bug 200496 has been marked as a duplicate of this bug. ***

Revision history for this message
Ubuntu Kernel Bot (ubuntu-kernel-bot) wrote :

This bug is awaiting verification that the linux-xilinx-zynqmp/5.4.0-1020.24 kernel in -proposed solves the problem. Please test the kernel and update this bug with the results. If the problem is solved, change the tag 'verification-needed-focal' to 'verification-done-focal'. If the problem still exists, change the tag 'verification-needed-focal' to 'verification-failed-focal'.

If verification is not done by 5 working days from today, this fix will be dropped from the source code, and this bug will be closed.

See https://wiki.ubuntu.com/Testing/EnableProposed for documentation how to enable and use -proposed. Thank you!

tags: added: kernel-spammed-focal-linux-xilinx-zynqmp verification-needed-focal
Revision history for this message
Frank Heimes (fheimes) wrote :

This bug was not opened against linux-xilinx-zynqmp.
So I'm updating the verification tag just to unblock the further process.

tags: added: verification-done-focal
removed: verification-needed-focal
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.