Due to the nature of round_up(), its first argument is
decremented by one. drm_suballoc_hole_soffset() may return 0,
which is then passed to round_up() and may wrap around.
Remedy that by adding a guard against that value.
Fixes: 849ee8a2f0df ("drm/suballoc: Extract amdgpu_sa.c as generic
suballocation helper")
Cc: Maarten Lankhorst <[email protected]>
Cc: <[email protected]> # v6.4+
Signed-off-by: Krzysztof Karas <[email protected]>
---
drivers/gpu/drm/drm_suballoc.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_suballoc.c b/drivers/gpu/drm/drm_suballoc.c
index 879ea33dbbc4..7f01e9d9fcfd 100644
--- a/drivers/gpu/drm/drm_suballoc.c
+++ b/drivers/gpu/drm/drm_suballoc.c
@@ -165,11 +165,13 @@ static bool drm_suballoc_try_alloc(struct
drm_suballoc_manager *sa_manager,
struct drm_suballoc *sa,
size_t size, size_t align)
{
- size_t soffset, eoffset, wasted;
+ size_t soffset, eoffset, wasted = 0;
soffset = drm_suballoc_hole_soffset(sa_manager);
eoffset = drm_suballoc_hole_eoffset(sa_manager);
- wasted = round_up(soffset, align) - soffset;
+
+ if (soffset)
+ wasted = round_up(soffset, align) - soffset;
if ((eoffset - soffset) >= (size + wasted)) {
soffset += wasted;
--
2.34.1