[linux-yocto] [PATCH 07/28] LSI AXM55xx: Fix concurrency issue for variable.

Charlie Paul cpaul.windriver at gmail.com
Fri May 2 12:16:44 PDT 2014


From: Michael Bringmann <michael.bringmann at lsi.com>

Used 'atomic' counter to track available inbound messages between
interrupt and foreground code.
Also, enable both SRIO modules by default with check for SRIO link
ready status to validated the accesses.

Signed-off-by: Michael Bringmann <michael.bringmann at lsi.com>
---
 arch/arm/boot/dts/axm55xx.dts               |    4 ++--
 drivers/rapidio/devices/lsi/axxia-rio-irq.c |   18 ++++++++++++------
 drivers/rapidio/devices/lsi/axxia-rio-irq.h |    2 +-
 3 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/arch/arm/boot/dts/axm55xx.dts b/arch/arm/boot/dts/axm55xx.dts
index 1cba111..826a6e6 100644
--- a/arch/arm/boot/dts/axm55xx.dts
+++ b/arch/arm/boot/dts/axm55xx.dts
@@ -439,7 +439,7 @@
 
         rio0: rapidio at 0x3100000000 {
                 index = <0>;
-                status = "disabled";
+                status = "okay";
                 #address-cells = <2>;
                 #size-cells = <2>;
                 compatible = "axxia,rapidio-delta";
@@ -454,7 +454,7 @@
 
         rio1: rapidio at 0x3140000000 {
                 index = <1>;
-                status = "disabled";
+                status = "okay";
                 #address-cells = <2>;
                 #size-cells = <2>;
                 compatible = "axxia,rapidio-delta";
diff --git a/drivers/rapidio/devices/lsi/axxia-rio-irq.c b/drivers/rapidio/devices/lsi/axxia-rio-irq.c
index 9879b7e..73b5a4c 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio-irq.c
+++ b/drivers/rapidio/devices/lsi/axxia-rio-irq.c
@@ -1115,7 +1115,7 @@ static struct rio_msg_dme *alloc_message_engine(struct rio_mport *mport,
 	me->entries_in_use = 0;
 	me->write_idx = 0;
 	me->read_idx = 0;
-	me->pending = 0;
+	atomic_set(&me->pending, 0);
 	me->tx_dme_tmo = 0;
 	me->dme_no = dme_no;
 
@@ -1474,6 +1474,7 @@ static void ib_dme_irq_handler(struct rio_irq_handler *h, u32 state)
 		u32 dw0;
 		int dme_no = 31 - CNTLZW(dme_mask);
 		int num_new;
+		int nPending;
 		dme_mask ^= (1 << dme_no);
 
 		while (mb->me[letter]->dme_no != dme_no)
@@ -1550,7 +1551,7 @@ static void ib_dme_irq_handler(struct rio_irq_handler *h, u32 state)
 				me->write_idx = (me->write_idx + 1) %
 						 me->entries;
 				num_new++;
-				me->pending++;
+				atomic_inc(&me->pending);
 				if (num_new == me->entries)
 					break;
 			}
@@ -1564,7 +1565,8 @@ static void ib_dme_irq_handler(struct rio_irq_handler *h, u32 state)
 			__ib_dme_event_dbg(priv, dme_no,
 					   1 << RIO_IB_DME_RX_RING_FULL);
 
-		if (me->pending &&
+		nPending = atomic_read(&me->pending);
+		if (nPending &&
 		    mport->inb_msg[mbox_no].mcback) {
 
 			mport->inb_msg[mbox_no].mcback(mport,
@@ -2345,6 +2347,7 @@ void *axxia_get_inb_message(struct rio_mport *mport, int mbox, int letter,
 	struct rio_rx_mbox *mb;
 	struct rio_msg_dme *me;
 	unsigned long iflags;
+	int nPending;
 	void *buf = NULL;
 
 	if ((mbox < 0) || (mbox >= RIO_MAX_RX_MBOX))
@@ -2371,7 +2374,8 @@ void *axxia_get_inb_message(struct rio_mport *mport, int mbox, int letter,
 		__rio_local_write_config_32(mport, RAB_INTR_ENAB_IDME, intr);
 	}
 
-	while (me->pending) {
+	nPending = atomic_read(&me->pending);
+	while (nPending) {
 		struct rio_msg_desc *desc = &me->desc[me->read_idx];
 		u32 dw0, dw1;
 
@@ -2399,7 +2403,8 @@ void *axxia_get_inb_message(struct rio_mport *mport, int mbox, int letter,
 					(dw0 & 0xff) | DME_DESC_DW0_VALID);
 			}
 			me->read_idx = (me->read_idx + 1) % me->entries;
-			me->pending--;
+			atomic_dec(&me->pending);
+			nPending--;
 			__ib_dme_event_dbg(priv, me->dme_no,
 					   1 << RIO_IB_DME_DESC_ERR);
 		} else {
@@ -2447,7 +2452,8 @@ void *axxia_get_inb_message(struct rio_mport *mport, int mbox, int letter,
 			mb->next_rx_slot = (mb->next_rx_slot + 1) %
 					    mb->ring_size;
 			me->read_idx = (me->read_idx + 1) % me->entries;
-			me->pending--;
+			atomic_dec(&me->pending);
+			nPending--;
 			goto done;
 		}
 	}
diff --git a/drivers/rapidio/devices/lsi/axxia-rio-irq.h b/drivers/rapidio/devices/lsi/axxia-rio-irq.h
index fde7140..7ed5fd8 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio-irq.h
+++ b/drivers/rapidio/devices/lsi/axxia-rio-irq.h
@@ -216,7 +216,7 @@ struct rio_msg_dme {
 	int entries_in_use;
 	int write_idx;
 	int read_idx;
-	int pending;
+	atomic_t pending;
 	int tx_dme_tmo;
 	void *dev_id;
 	int dme_no;
-- 
1.7.9.5



More information about the linux-yocto mailing list