HomeFreeBSD

linuxkpi: Fix __sg_alloc_table_from_pages loop

Description

linuxkpi: Fix __sg_alloc_table_from_pages loop

Commit 3e0856b63fe0e375a0951e05c2ef98bb2ebd9421 updated
__sg_alloc_table_from_pages to use the same API as linux, but modified
the loop condition when going over the pages in a sg list. Part of the
change included moving the sg_next call out of the for loop and into the
body, which causes an off by one error when traversing the list. Since
sg_next is called before the loop body it will skip the first element
and read one past the last element.

This caused panics when running PRIME with nvidia-drm as the off-by-one
issue causes a NULL dereference.

(cherry picked from commit 3f686532c9b4fd603d4ad2d3392232cff24188f4)

Commit 3f686532c9b4 tried to fix an issue with not properly starting
at the first page in the sg list to prevent a panic. This worked but
with the side effect of incrementing "s" during the final iteration
causing it to be NULL since the list had ended.
In cases non-DEBUG kernels this causes a panic with drm-5.15, since
"s" is NULL when we later pass it to sg_mark_end().
This change decouples the iteration sg from the return value so that
it is never incremented past the final page in the chain.

(cherry picked from commit 09b0401e91a92bcb58ea1873857b42f8211f660f)

Details

Provenance
ashafer_badland.ioAuthored on Apr 21 2023, 7:56 AM
bzCommitted on Nov 29 2023, 4:36 PM
Parents
rG88910886fa50: LinuxKPI: skbuff: fix tracing
Branches
Unknown
Tags
Unknown