Is sg_set_page will not work with IOMMU?

Harsh Jain harshjain.prof at gmail.com
Mon Feb 27 23:58:34 EST 2017


Hi All,

I am trying to create new sg list from old list. The new list will
have length < 2048. When I populate the new sg list using
sg_set_page(). IOMMU starts giving following error.

 [  388.463656] DMAR: DRHD: handling fault status reg 2
[  388.468539] DMAR: [DMA Write] Request device [03:00.0] fault addr
ef66d000 [fault reason 05] PTE Write access is not set
[  389.464146] DMAR: DRHD: handling fault status reg 102
[  389.469203] DMAR: [DMA Write] Request device [03:00.0] fault addr
ef65d000 [fault reason 05] PTE Write access is not set


Function to create new sg list:


{
        struct scatterlist *newsg, *sg;
        int i, len, processed = 0;
        size_t size = 2048;

        newsg = kmalloc_array(nents, sizeof(struct scatterlist), GFP_KERNEL);
        if (!newsg)
                return ERR_PTR(-ENOMEM);
        sg = newsg;
        sg_init_table(sg, nents);
        for (i = 0; i < nents; i++) {
                len = min_t(u32, sgl->length - processed, 2048);
                sg_set_page(sg, sg_page(sgl), len, sgl->offset + processed);
                processed += len;
                if (processed == sgl->length) {
                        processed = 0;
                        sgl = sg_next(sgl);
                }
                sg = sg_next(sg);
        }

        return newsg;
}

Same driver works fine if I disable IOMMU.



More information about the Kernelnewbies mailing list