Browse Source

ipq40xx: essedma: Fix dead lock

edma_read_append_stats() gets called from two places in the driver.
The first place is the kernel timer that periodically updates
the statistics, so nothing gets lost due to overflows.
The second one it's part of the userspace ethtool ioctl handler
to provide up-to-date values.

For this configuration, the use of spin_lock() is not sufficient
and as per:
<https://mirrors.edge.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/c214.html>
the locking has to be upgraded to spin_lock_bh().

Signed-off-by: Masafumi UTSUGI <[email protected]>
[folded patch into 710-, rewrote message]
Signed-off-by: Christian Lamparter <[email protected]>
Masafumi UTSUGI 6 years ago
parent
commit
f1d761f95e

+ 2 - 2
target/linux/ipq40xx/patches-4.14/710-net-add-qualcomm-essedma-ethernet-driver.patch

@@ -2775,7 +2775,7 @@ Signed-off-by: Christian Lamparter <[email protected]>
 +	int i;
 +	u32 stat;
 +
-+	spin_lock(&edma_cinfo->stats_lock);
++	spin_lock_bh(&edma_cinfo->stats_lock);
 +	p = (uint32_t *)&(edma_cinfo->edma_ethstats);
 +
 +	for (i = 0; i < EDMA_MAX_TRANSMIT_QUEUE; i++) {
@@ -2802,7 +2802,7 @@ Signed-off-by: Christian Lamparter <[email protected]>
 +		p++;
 +	}
 +
-+	spin_unlock(&edma_cinfo->stats_lock);
++	spin_unlock_bh(&edma_cinfo->stats_lock);
 +}
 +
 +static void edma_statistics_timer(unsigned long data)

+ 2 - 2
target/linux/ipq40xx/patches-4.19/710-net-add-qualcomm-essedma-ethernet-driver.patch

@@ -2774,7 +2774,7 @@ Signed-off-by: Christian Lamparter <[email protected]>
 +	int i;
 +	u32 stat;
 +
-+	spin_lock(&edma_cinfo->stats_lock);
++	spin_lock_bh(&edma_cinfo->stats_lock);
 +	p = (uint32_t *)&(edma_cinfo->edma_ethstats);
 +
 +	for (i = 0; i < EDMA_MAX_TRANSMIT_QUEUE; i++) {
@@ -2801,7 +2801,7 @@ Signed-off-by: Christian Lamparter <[email protected]>
 +		p++;
 +	}
 +
-+	spin_unlock(&edma_cinfo->stats_lock);
++	spin_unlock_bh(&edma_cinfo->stats_lock);
 +}
 +
 +static void edma_statistics_timer(struct timer_list *t)