#include <linux/module.h>
 #include <linux/hrtimer.h>
 #include <linux/dma-mapping.h>
+#include <linux/kmsan.h>
 #include <linux/spinlock.h>
 #include <xen/xen.h>
 
                                   struct scatterlist *sg,
                                   enum dma_data_direction direction)
 {
-       if (!vq->use_dma_api)
+       if (!vq->use_dma_api) {
+               /*
+                * If DMA is not used, KMSAN doesn't know that the scatterlist
+                * is initialized by the hardware. Explicitly check/unpoison it
+                * depending on the direction.
+                */
+               kmsan_handle_dma(sg_page(sg), sg->offset, sg->length, direction);
                return (dma_addr_t)sg_phys(sg);
+       }
 
        /*
         * We can't use dma_map_sg, because we don't use scatterlists in