]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cxl/region: Use do_div() for 64-bit modulo operation
authorAlison Schofield <alison.schofield@intel.com>
Sat, 17 Jan 2026 04:47:30 +0000 (20:47 -0800)
committerDave Jiang <dave.jiang@intel.com>
Thu, 22 Jan 2026 23:58:14 +0000 (16:58 -0700)
div64_u64_rem() was the wrong choice for doing a modulo operation
and it was used incorrectly, causing a kernel oops by passing NULL
as the remainder parameter. Replace it with the do_div() helper
that does the intended math (gran_offset = offset % gran) and is
architecture safe.

This bug appeared during testing of unaligned address translations.
The visibility to userspace would be limited to folks doing poison
injection or clear by HPA on unaligned regions.

Fixes: 78b50b598462 ("cxl/region: Translate HPA to DPA and memdev in unaligned regions")
Signed-off-by: Alison Schofield <alison.schofield@intel.com>
Link: https://patch.msgid.link/20260117044732.567831-1-alison.schofield@intel.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/region.c

index d5979000fba12a1136b8ab3b46f44ffeb2217a57..96888d87a8df298301c6f8e42a7d7c9cde9b9260 100644 (file)
@@ -3324,6 +3324,7 @@ static int unaligned_region_offset_to_dpa_result(struct cxl_region *cxlr,
        u64 interleave_width, interleave_index;
        u64 gran, gran_offset, dpa_offset;
        u64 hpa = p->res->start + offset;
+       u64 tmp = offset;
 
        /*
         * Unaligned addresses are not algebraically invertible. Calculate
@@ -3333,7 +3334,7 @@ static int unaligned_region_offset_to_dpa_result(struct cxl_region *cxlr,
        gran = cxld->interleave_granularity;
        interleave_width = gran * cxld->interleave_ways;
        interleave_index = div64_u64(offset, interleave_width);
-       gran_offset = div64_u64_rem(offset, gran, NULL);
+       gran_offset = do_div(tmp, gran);
 
        dpa_offset = interleave_index * gran + gran_offset;