lib/dma-debug.c: make locking work for RT
authorPankaj Gupta <[email protected]>
Wed, 3 May 2017 21:51:28 +0000 (14:51 -0700)
committerLinus Torvalds <[email protected]>
Wed, 3 May 2017 22:52:07 +0000 (15:52 -0700)
Interrupt enable/disabled with spinlock is not a valid operation for RT
as it can make executing tasks sleep from a non-sleepable context.  So
convert it to spin_lock_irq[save, restore].

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Pankaj Gupta <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Niklas Söderlund <[email protected]>
Cc: Vinod Koul <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Ville Syrjl <[email protected]>
Cc: Miles Chen <[email protected]>
Cc: Marcelo Tosatti <[email protected]>
Cc: Joerg Roedel <[email protected]>
Cc: Stanislaw Gruszka <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
lib/dma-debug.c

index b157b46cc9a69ca830a2cdbc8abcbc9baab4a63e..fe4d50c992df618a914e4696d7f698e4e8b76c83 100644 (file)
@@ -942,21 +942,17 @@ static int device_dma_allocations(struct device *dev, struct dma_debug_entry **o
        unsigned long flags;
        int count = 0, i;
 
-       local_irq_save(flags);
-
        for (i = 0; i < HASH_SIZE; ++i) {
-               spin_lock(&dma_entry_hash[i].lock);
+               spin_lock_irqsave(&dma_entry_hash[i].lock, flags);
                list_for_each_entry(entry, &dma_entry_hash[i].list, list) {
                        if (entry->dev == dev) {
                                count += 1;
                                *out_entry = entry;
                        }
                }
-               spin_unlock(&dma_entry_hash[i].lock);
+               spin_unlock_irqrestore(&dma_entry_hash[i].lock, flags);
        }
 
-       local_irq_restore(flags);
-
        return count;
 }