Skip to content

Commit e271c0b

Browse files
zhangl6vinodkoul
authored andcommitted
dmaengine: idxd: Move dma_free_coherent() out of spinlocked context
Task may be rescheduled within dma_free_coherent(). So dma_free_coherent() can't be called between spin_lock() and spin_unlock() to avoid Call Trace: Call Trace: <TASK> dump_stack_lvl+0x37/0x50 __might_resched+0x16a/0x1c0 vunmap+0x2c/0x70 __iommu_dma_free+0x96/0x100 idxd_device_evl_free+0xd5/0x100 [idxd] device_release_driver_internal+0x197/0x200 unbind_store+0xa1/0xb0 kernfs_fop_write_iter+0x120/0x1c0 vfs_write+0x2d3/0x400 ksys_write+0x63/0xe0 do_syscall_64+0x44/0xa0 entry_SYSCALL_64_after_hwframe+0x6e/0xd8 Move it out of the context. Fixes: 244da66 ("dmaengine: idxd: setup event log configuration") Signed-off-by: Rex Zhang <[email protected]> Reviewed-by: Dave Jiang <[email protected]> Reviewed-by: Fenghua Yu <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent 3b08b37 commit e271c0b

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

drivers/dma/idxd/device.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,9 @@ static int idxd_device_evl_setup(struct idxd_device *idxd)
802802

803803
static void idxd_device_evl_free(struct idxd_device *idxd)
804804
{
805+
void *evl_log;
806+
unsigned int evl_log_size;
807+
dma_addr_t evl_dma;
805808
union gencfg_reg gencfg;
806809
union genctrl_reg genctrl;
807810
struct device *dev = &idxd->pdev->dev;
@@ -822,11 +825,15 @@ static void idxd_device_evl_free(struct idxd_device *idxd)
822825
iowrite64(0, idxd->reg_base + IDXD_EVLCFG_OFFSET);
823826
iowrite64(0, idxd->reg_base + IDXD_EVLCFG_OFFSET + 8);
824827

825-
dma_free_coherent(dev, evl->log_size, evl->log, evl->dma);
826828
bitmap_free(evl->bmap);
829+
evl_log = evl->log;
830+
evl_log_size = evl->log_size;
831+
evl_dma = evl->dma;
827832
evl->log = NULL;
828833
evl->size = IDXD_EVL_SIZE_MIN;
829834
spin_unlock(&evl->lock);
835+
836+
dma_free_coherent(dev, evl_log_size, evl_log, evl_dma);
830837
}
831838

832839
static void idxd_group_config_write(struct idxd_group *group)

0 commit comments

Comments
 (0)