diff options
| author | Jinke Han <jinkehan@didiglobal.com> | 2026-09-08 15:37:42 +0800 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2026-09-17 09:48:42 +0200 |
| commit | a5f7a5bb3b7f28ba7e4fa246775b29a0e5537255 (patch) | |
| tree | 73fef824f9a846cf935869d0dbc5070ef6e2f741 /Documentation/scsi/lpfc.rst | |
| download | linux-stable-a5f7a5bb3b7f28ba7e4fa246775b29a0e5537255.tar.gz linux-stable-a5f7a5bb3b7f28ba7e4fa246775b29a0e5537255.zip | |
x86/kprobes: Fix crash when probing CS CALL instructionsgrafted
When using eBPF to probe CS CALL instructions within a function,
a crash can be triggered.
The eBPF tool probes offset 257 of the __hrtimer_run_queues()
function:
<__hrtimer_run_queues+249>: nopl 0x0(%rax,%rax,1)
<__hrtimer_run_queues+254>: mov %r14,%rdi
<__hrtimer_run_queues+257>: cs call <__x86_indirect_thunk_r12>
<__hrtimer_run_queues+263>: mov %eax,%r12d
<__hrtimer_run_queues+266>: xchg %ax,%ax
<__hrtimer_run_queues+268>: mov %r13,%rdi
Which triggers this crash:
BUG: unable to handle page fault for address: 00000000000f41c9
#PF: supervisor write access in kernel mode
#PF: error_code(0x0002) - not-present page
PGD 0 P4D 0
Oops: 0002 [#1] SMP NOPTI
CPU: 1 PID: 0 Comm: swapper/1 Kdump: loaded Tainted: P
RIP: 0010:__hrtimer_run_queues+0x106/0x230
Note that __hrtimer_run_queues+0x106 is __hrtimer_run_queues+262, which is
at the 6th byte of the above CS CALL instruction. Since the CS CALL
instruction occupies 6 bytes, the exception occurred in the middle of that
call instruction.
The root cause is that when using eBPF tools to probe in the middle of a
function, a kprobe with INT3 is used as the underlying implementation.
During single-step emulation of the original CALL instruction,
int3_emulate_call() assumes that the probed CALL instruction is 5 bytes
long. However, the actual CS-prefixed CALL instruction occupies 6 bytes,
so it constructs an incorrect exception return address. When the CPU
returns from the kprobe handler, the next instruction to be executed is at
the address of the last byte of that CS CALL instruction. Coincidentally,
starting from that address, the CPU fetches and decodes a completely
different instruction, which ultimately triggers a kernel crash.
Fix the issue by using the actual instruction length obtained from
the instruction decoder when constructing the exception return
address, rather than relying on the hardcoded CALL_INSN_SIZE macro.
[ mingo: Refined the changelog ]
Fixes: 6256e668b7af ("x86/kprobes: Use int3 instead of debug trap for single-step")
Suggested-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Jinke Han <jinkehan@didiglobal.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Acked-by: Yafang Shao <laoar.shao@gmail.com>
Acked-by: Borislav Petkov <bp@alien8.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://patch.msgid.link/20260908073742.GA10517@didi-ThinkCentre-M920t-N000
Diffstat (limited to 'Documentation/scsi/lpfc.rst')
| -rw-r--r-- | Documentation/scsi/lpfc.rst | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/Documentation/scsi/lpfc.rst b/Documentation/scsi/lpfc.rst new file mode 100644 index 000000000..6e217e82b --- /dev/null +++ b/Documentation/scsi/lpfc.rst @@ -0,0 +1,81 @@ +.. SPDX-License-Identifier: GPL-2.0 + +========================= +LPFC Driver Release Notes +========================= + + +.. important:: + + Starting in the 8.0.17 release, the driver began to be targeted strictly + toward the upstream kernel. As such, we removed #ifdefs for older kernels + (pre 2.6.10). The 8.0.16 release should be used if the driver is to be + run on one of the older kernels. + + The proposed modifications to the transport layer for FC remote ports + and extended attribute support is now part of the upstream kernel + as of 2.6.12. We no longer need to provide patches for this support, + nor a *full* version which has old an new kernel support. + + The driver now requires a 2.6.12 (if pre-release, 2.6.12-rc1) or later + kernel. + + Please heed these dependencies.... + + +The following information is provided for additional background on the +history of the driver as we push for upstream acceptance. + +Cable pull and temporary device Loss: + + In older revisions of the lpfc driver, the driver internally queued i/o + received from the midlayer. In the cases where a cable was pulled, link + jitter, or a device temporarily loses connectivity (due to its cable + being removed, a switch rebooting, or a device reboot), the driver could + hide the disappearance of the device from the midlayer. I/O's issued to + the LLDD would simply be queued for a short duration, allowing the device + to reappear or link come back alive, with no inadvertent side effects + to the system. If the driver did not hide these conditions, i/o would be + errored by the driver, the mid-layer would exhaust its retries, and the + device would be taken offline. Manual intervention would be required to + re-enable the device. + + The community supporting kernel.org has driven an effort to remove + internal queuing from all LLDDs. The philosophy is that internal + queuing is unnecessary as the block layer already performs the + queuing. Removing the queues from the LLDD makes a more predictable + and more simple LLDD. + + As a potential new addition to kernel.org, the 8.x driver was asked to + have all internal queuing removed. Emulex complied with this request. + In explaining the impacts of this change, Emulex has worked with the + community in modifying the behavior of the SCSI midlayer so that SCSI + devices can be temporarily suspended while transport events (such as + those described) can occur. + + The proposed patch was posted to the linux-scsi mailing list. The patch + is contained in the 2.6.10-rc2 (and later) patch kits. As such, this + patch is part of the standard 2.6.10 kernel. + + By default, the driver expects the patches for block/unblock interfaces + to be present in the kernel. No #define needs to be set to enable support. + + +Kernel Support +============== + + This source package is targeted for the upstream kernel only. (See notes + at the top of this file). It relies on interfaces that are slowing + migrating into the kernel.org kernel. + + At this time, the driver requires the 2.6.12 (if pre-release, 2.6.12-rc1) + kernel. + + If a driver is needed for older kernels please utilize the 8.0.16 + driver sources. + + +Patches +======= + + Thankfully, at this time, patches are not needed. |
