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

Bruce Ashfield bruce.ashfield at windriver.com
Fri May 2 13:15:34 PDT 2014


On 14-05-02 03:16 PM, Charlie Paul wrote:
> 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.

Are these two changes related ? There's only a tenuous linkage between
the two. As such, they should be two commits.

Bruce

>
> 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;
>



More information about the linux-yocto mailing list