• Robin Murphy's avatar
    iommu/io-pgtable-arm: Support lockless operation · 2c3d273e
    Robin Murphy authored
    For parallel I/O with multiple concurrent threads servicing the same
    device (or devices, if several share a domain), serialising page table
    updates becomes a massive bottleneck. On reflection, though, we don't
    strictly need to do that - for valid IOMMU API usage, there are in fact
    only two races that we need to guard against: multiple map requests for
    different blocks within the same region, when the intermediate-level
    table for that region does not yet exist; and multiple unmaps of
    different parts of the same block entry. Both of those are fairly easily
    solved by using a cmpxchg to install the new table, such that if we then
    find that someone else's table got there first, we can simply free ours
    and continue.
    
    Make the requisite changes such that we can withstand being called
    without the caller maintaining a lock. In theory, this opens up a few
    corners in which wildly misbehaving callers making nonsensical
    overlapping requests might lead to crashes instead of just unpredictable
    results, but correct code really does not deserve to pay a significant
    performance cost for the sake of masking bugs in theoretical broken code.
    Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    2c3d273e
io-pgtable-arm.c 29.8 KB