* [PATCH] cxl/region: Use do_div() for 64-bit modulo operation
@ 2026-01-17 4:47 Alison Schofield
2026-01-19 15:17 ` Dave Jiang
2026-01-19 15:43 ` Dave Jiang
0 siblings, 2 replies; 3+ messages in thread
From: Alison Schofield @ 2026-01-17 4:47 UTC (permalink / raw)
To: Davidlohr Bueso, Jonathan Cameron, Dave Jiang, Alison Schofield,
Vishal Verma, Ira Weiny, Dan Williams
Cc: linux-cxl
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>
---
drivers/cxl/core/region.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index d5979000fba1..96888d87a8df 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -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;
base-commit: 78b50b5984629d362f826e9615ce4599f429716e
--
2.37.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] cxl/region: Use do_div() for 64-bit modulo operation
2026-01-17 4:47 [PATCH] cxl/region: Use do_div() for 64-bit modulo operation Alison Schofield
@ 2026-01-19 15:17 ` Dave Jiang
2026-01-19 15:43 ` Dave Jiang
1 sibling, 0 replies; 3+ messages in thread
From: Dave Jiang @ 2026-01-19 15:17 UTC (permalink / raw)
To: Alison Schofield, Davidlohr Bueso, Jonathan Cameron, Vishal Verma,
Ira Weiny, Dan Williams
Cc: linux-cxl
On 1/16/26 9:47 PM, Alison Schofield wrote:
> 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>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Thanks Alison. I'll get this applied to next
> ---
> drivers/cxl/core/region.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index d5979000fba1..96888d87a8df 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -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;
>
>
> base-commit: 78b50b5984629d362f826e9615ce4599f429716e
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] cxl/region: Use do_div() for 64-bit modulo operation
2026-01-17 4:47 [PATCH] cxl/region: Use do_div() for 64-bit modulo operation Alison Schofield
2026-01-19 15:17 ` Dave Jiang
@ 2026-01-19 15:43 ` Dave Jiang
1 sibling, 0 replies; 3+ messages in thread
From: Dave Jiang @ 2026-01-19 15:43 UTC (permalink / raw)
To: Alison Schofield, Davidlohr Bueso, Jonathan Cameron, Vishal Verma,
Ira Weiny, Dan Williams
Cc: linux-cxl
On 1/16/26 9:47 PM, Alison Schofield wrote:
> 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>
Applied to cxl/next
345f23df5d08fe58fb865cd17b696cd345455224
> ---
> drivers/cxl/core/region.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index d5979000fba1..96888d87a8df 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -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;
>
>
> base-commit: 78b50b5984629d362f826e9615ce4599f429716e
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-01-19 15:43 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-17 4:47 [PATCH] cxl/region: Use do_div() for 64-bit modulo operation Alison Schofield
2026-01-19 15:17 ` Dave Jiang
2026-01-19 15:43 ` Dave Jiang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox