On 10/29/25 00:01, Claudio Imbrenda wrote:
> For hugetlbs, gmap puds have the present bit set. For normal puds
> (which point to ptes), the bit is not set. This is in contrast to the
> normal userspace puds, which always have the bit set for present pmds.
> 
> This causes issues when ___pte_offset_map() is modified to only check
> for the present bit.
> 
> The solution to the problem is simply to always set the present bit for
> present gmap pmds.
> 
> Signed-off-by: Claudio Imbrenda <[email protected]>
> Link: 
> https://lore.kernel.org/lkml/[email protected]/
> Tested-by: Christian Borntraeger <[email protected]>
> Acked-by: Christian Borntraeger <[email protected]>
> ---
>  arch/s390/mm/gmap.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
> index 8ff6bba107e8..22c448b32340 100644
> --- a/arch/s390/mm/gmap.c
> +++ b/arch/s390/mm/gmap.c
> @@ -599,8 +599,9 @@ int __gmap_link(struct gmap *gmap, unsigned long gaddr, 
> unsigned long vmaddr)
>                                       | _SEGMENT_ENTRY_GMAP_UC
>                                       | _SEGMENT_ENTRY;
>                       } else
> -                             *table = pmd_val(*pmd) &
> -                                     _SEGMENT_ENTRY_HARDWARE_BITS;
> +                             *table = (pmd_val(*pmd) &
> +                                     _SEGMENT_ENTRY_HARDWARE_BITS)
> +                                     | _SEGMENT_ENTRY;
>               }
>       } else if (*table & _SEGMENT_ENTRY_PROTECT &&
>                  !(pmd_val(*pmd) & _SEGMENT_ENTRY_PROTECT)) {

Acked-by: Balbir Singh <[email protected]>

Reply via email to