[PATCH] hugetlb: Fix possible deadlock

Ethan Tidmore posted 1 patch 1 week, 2 days ago
mm/hugetlb.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
[PATCH] hugetlb: Fix possible deadlock
Posted by Ethan Tidmore 1 week, 2 days ago
In allocate_file_region_entries() error path the function region_chg()
returns but does not release the lock 'resv->lock'.

Release lock 'resv->lock' before returning.

Fixes: 0db9d74ed8845 ("hugetlb: disable region_add file_region coalescing")
Signed-off-by: Ethan Tidmore <ethantidmore06@gmail.com>
---
 mm/hugetlb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index d6ea11113f1d..230fd8c63588 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -807,8 +807,10 @@ static long region_chg(struct resv_map *resv, long f, long t,
 	if (*out_regions_needed == 0)
 		*out_regions_needed = 1;
 
-	if (allocate_file_region_entries(resv, *out_regions_needed))
+	if (allocate_file_region_entries(resv, *out_regions_needed)) {
+		spin_unlock(&resv->lock);
 		return -ENOMEM;
+	}
 
 	resv->adds_in_progress += *out_regions_needed;
 
-- 
2.53.0
Re: [PATCH] hugetlb: Fix possible deadlock
Posted by Andrew Morton 1 week, 1 day ago
On Tue, 24 Mar 2026 19:46:53 -0500 Ethan Tidmore <ethantidmore06@gmail.com> wrote:

> In allocate_file_region_entries() error path the function region_chg()
> returns but does not release the lock 'resv->lock'.
> 
> Release lock 'resv->lock' before returning.
> 
> ...
>
> --- a/mm/hugetlb.c
> +++ b/mm/hugetlb.c
> @@ -807,8 +807,10 @@ static long region_chg(struct resv_map *resv, long f, long t,
>  	if (*out_regions_needed == 0)
>  		*out_regions_needed = 1;
>  
> -	if (allocate_file_region_entries(resv, *out_regions_needed))
> +	if (allocate_file_region_entries(resv, *out_regions_needed)) {
> +		spin_unlock(&resv->lock);
>  		return -ENOMEM;
> +	}
>  
>  	resv->adds_in_progress += *out_regions_needed;

Thanks, but please see how allocate_file_region_entries() leaves the
lock unheld if it's going to return -ENOMEM.