• Prakash Sangappa's avatar
    mm: hugetlb pages should not be reserved by shmat() if SHM_NORESERVE · e656c7a9
    Prakash Sangappa authored
    For shared memory of type SHM_HUGETLB, hugetlb pages are reserved in
    shmget() call.  If SHM_NORESERVE flags is specified then the hugetlb pages
    are not reserved.  However when the shared memory is attached with the
    shmat() call the hugetlb pages are getting reserved incorrectly for
    SHM_HUGETLB shared memory created with SHM_NORESERVE which is a bug.
    
    -------------------------------
    Following test shows the issue.
    
    $cat shmhtb.c
    
    int main()
    {
    	int shmflags = 0660 | IPC_CREAT | SHM_HUGETLB | SHM_NORESERVE;
    	int shmid;
    
    	shmid = shmget(SKEY, SHMSZ, shmflags);
    	if (shmid < 0)
    	{
    		printf("shmat: shmget() failed, %d\n", errno);
    		return 1;
    	}
    	printf("After shmget()\n");
    	system("cat /proc/meminfo | grep -i hugepages_");
    
    	shmat(shmid, NULL, 0);
    	printf("\nAfter shmat()\n");
    	system("cat /proc/meminfo | grep -i hugepages_");
    
    	shmctl(shmid, IPC_RMID, NULL);
    	return 0;
    }
    
     #sysctl -w vm.nr_hugepages=20
     #./shmhtb
    
    After shmget()
    HugePages_Total:      20
    HugePages_Free:       20
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    
    After shmat()
    HugePages_Total:      20
    HugePages_Free:       20
    HugePages_Rsvd:        5 <--
    HugePages_Surp:        0
    --------------------------------
    
    Fix is to ensure that hugetlb pages are not reserved for SHM_HUGETLB shared
    memory in the shmat() call.
    
    Link: https://lkml.kernel.org/r/1706040282-12388-1-git-send-email-prakash.sangappa@oracle.comSigned-off-by: default avatarPrakash Sangappa <prakash.sangappa@oracle.com>
    Acked-by: default avatarMuchun Song <muchun.song@linux.dev>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    e656c7a9
inode.c 44.5 KB