• Scott Wood's avatar
    iommu/amd: Avoid locking get_irq_table() from atomic context · df42a04b
    Scott Wood authored
    get_irq_table() previously acquired amd_iommu_devtable_lock which is not
    a raw lock, and thus cannot be acquired from atomic context on
    PREEMPT_RT.  Many calls to modify_irte*() come from atomic context due to
    the IRQ desc->lock, as does amd_iommu_update_ga() due to the preemption
    disabling in vcpu_load/put().
    
    The only difference between calling get_irq_table() and reading from
    irq_lookup_table[] directly, other than the lock acquisition and
    amd_iommu_rlookup_table[] check, is if the table entry is unpopulated,
    which should never happen when looking up a devid that came from an
    irq_2_irte struct, as get_irq_table() would have already been called on
    that devid during irq_remapping_alloc().
    
    The lock acquisition is not needed in these cases because entries in
    irq_lookup_table[] never change once non-NULL -- nor would the
    amd_iommu_devtable_lock usage in get_irq_table() provide meaningful
    protection if they did, since it's released before using the looked up
    table in the get_irq_table() caller.
    
    Rename the old get_irq_table() to alloc_irq_table(), and create a new
    lockless get_irq_table() to be used in non-allocating contexts that WARNs
    if it doesn't find what it's looking for.
    Signed-off-by: default avatarScott Wood <swood@redhat.com>
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    df42a04b
amd_iommu.c 103 KB