Skip to content

Commit c2f4d8c

Browse files
committed
dmaengine: idxd: Move dma_free_coherent() out of spinlocked context
jira LE-1907 Rebuild_History Non-Buildable kernel-5.14.0-427.16.1.el9_4 commit-author Rex Zhang <rex.zhang@intel.com> commit e271c0b 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 <rex.zhang@intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Fenghua Yu <fenghua.yu@intel.com> Link: https://lore.kernel.org/r/20231212022158.358619-2-rex.zhang@intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org> (cherry picked from commit e271c0b) Signed-off-by: Jonathan Maple <jmaple@ciq.com>
1 parent ce76443 commit c2f4d8c

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
@@ -807,6 +807,9 @@ static int idxd_device_evl_setup(struct idxd_device *idxd)
807807

808808
static void idxd_device_evl_free(struct idxd_device *idxd)
809809
{
810+
void *evl_log;
811+
unsigned int evl_log_size;
812+
dma_addr_t evl_dma;
810813
union gencfg_reg gencfg;
811814
union genctrl_reg genctrl;
812815
struct device *dev = &idxd->pdev->dev;
@@ -827,11 +830,15 @@ static void idxd_device_evl_free(struct idxd_device *idxd)
827830
iowrite64(0, idxd->reg_base + IDXD_EVLCFG_OFFSET);
828831
iowrite64(0, idxd->reg_base + IDXD_EVLCFG_OFFSET + 8);
829832

830-
dma_free_coherent(dev, evl->log_size, evl->log, evl->dma);
831833
bitmap_free(evl->bmap);
834+
evl_log = evl->log;
835+
evl_log_size = evl->log_size;
836+
evl_dma = evl->dma;
832837
evl->log = NULL;
833838
evl->size = IDXD_EVL_SIZE_MIN;
834839
spin_unlock(&evl->lock);
840+
841+
dma_free_coherent(dev, evl_log_size, evl_log, evl_dma);
835842
}
836843

837844
static void idxd_group_config_write(struct idxd_group *group)

0 commit comments

Comments
 (0)