• Nicolin Chen's avatar
    iommufd/selftest: Fix mock_dev_num bug · fde372df
    Nicolin Chen authored
    Syzkaller reported the following bug:
      sysfs: cannot create duplicate filename '/devices/iommufd_mock4'
    
      Call Trace:
        sysfs_warn_dup+0x71/0x90
        sysfs_create_dir_ns+0x1ee/0x260
        ? sysfs_create_mount_point+0x80/0x80
        ? spin_bug+0x1d0/0x1d0
        ? do_raw_spin_unlock+0x54/0x220
        kobject_add_internal+0x221/0x970
        kobject_add+0x11c/0x1e0
        ? lockdep_hardirqs_on_prepare+0x273/0x3e0
        ? kset_create_and_add+0x160/0x160
        ? kobject_put+0x5d/0x390
        ? bus_get_dev_root+0x4a/0x60
        ? kobject_put+0x5d/0x390
        device_add+0x1d5/0x1550
        ? __fw_devlink_link_to_consumers.isra.0+0x1f0/0x1f0
        ? __init_waitqueue_head+0xcb/0x150
        iommufd_test+0x462/0x3b60
        ? lock_release+0x1fe/0x640
        ? __might_fault+0x117/0x170
        ? reacquire_held_locks+0x4b0/0x4b0
        ? iommufd_selftest_destroy+0xd0/0xd0
        ? __might_fault+0xbe/0x170
        iommufd_fops_ioctl+0x256/0x350
        ? iommufd_option+0x180/0x180
        ? __lock_acquire+0x1755/0x45f0
        __x64_sys_ioctl+0xa13/0x1640
    
    The bug is triggered when Syzkaller created multiple mock devices but
    didn't destroy them in the same sequence, messing up the mock_dev_num
    counter. Replace the atomic with an mock_dev_ida.
    
    Cc: stable@vger.kernel.org
    Fixes: 23a1b46f ("iommufd/selftest: Make the mock iommu driver into a real driver")
    Link: https://lore.kernel.org/r/5af41d5af6d5c013cc51de01427abb8141b3587e.1708636627.git.nicolinc@nvidia.com
    
    Reported-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: default avatarNicolin Chen <nicolinc@nvidia.com>
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    fde372df
selftest.c 37.4 KB