Sparse spit out these warnings: drivers/staging/cxt1e1/musycc.c:68:1: warning: context imbalance in 'musycc_dump_rxbuffer_ring' - different lock contexts for basic block drivers/staging/cxt1e1/musycc.c:136:1: warning: context imbalance in 'musycc_dump_txbuffer_ring' - different lock contexts for basic block The new functions musycc_dump_[rt]xbuffer_ring_locked() assume that the lock is held. musycc_dump_[rt]xbuffer_ring() take the lock. Signed-off-by: Wolfgang Ocker <weo@xxxxxxx> --- drivers/staging/cxt1e1/musycc.c | 54 ++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 19 deletions(-) Eudyptula challenge task 16 diff --git a/drivers/staging/cxt1e1/musycc.c b/drivers/staging/cxt1e1/musycc.c index 0bcbd8a..9495c0b 100644 --- a/drivers/staging/cxt1e1/musycc.c +++ b/drivers/staging/cxt1e1/musycc.c @@ -65,10 +65,9 @@ void musycc_update_timeslots(mpi_t *); /*******************************************************************/ static int -musycc_dump_rxbuffer_ring(mch_t *ch, int lockit) +musycc_dump_rxbuffer_ring_locked(mch_t *ch) { struct mdesc *m; - unsigned long flags = 0; u_int32_t status; int n; @@ -77,8 +76,6 @@ musycc_dump_rxbuffer_ring(mch_t *ch, int lockit) u_int32_t *dp; int len = 0; #endif - if (lockit) - spin_lock_irqsave(&ch->ch_rxlock, flags); if (ch->rxd_num == 0) pr_info(" ZERO receive buffers allocated for this channel."); else { @@ -127,16 +124,26 @@ musycc_dump_rxbuffer_ring(mch_t *ch, int lockit) } pr_info("\n"); - if (lockit) - spin_unlock_irqrestore(&ch->ch_rxlock, flags); return 0; } static int -musycc_dump_txbuffer_ring(mch_t *ch, int lockit) +musycc_dump_rxbuffer_ring(mch_t *ch) { - struct mdesc *m; unsigned long flags = 0; + int ret; + + spin_lock_irqsave(&ch->ch_rxlock, flags); + ret = musycc_dump_rxbuffer_ring_locked(ch); + spin_unlock_irqrestore(&ch->ch_rxlock, flags); + + return ret; +} + +static int +musycc_dump_txbuffer_ring_locked(mch_t *ch) +{ + struct mdesc *m; u_int32_t status; int n; #ifdef RLD_DUMP_BUFDATA @@ -144,8 +151,6 @@ musycc_dump_txbuffer_ring(mch_t *ch, int lockit) int len = 0; #endif - if (lockit) - spin_lock_irqsave(&ch->ch_txlock, flags); if (ch->txd_num == 0) pr_info(" ZERO transmit buffers allocated for this channel."); else { @@ -188,11 +193,22 @@ musycc_dump_txbuffer_ring(mch_t *ch, int lockit) } /* -for- */ pr_info("\n"); - if (lockit) - spin_unlock_irqrestore(&ch->ch_txlock, flags); return 0; } +static int +musycc_dump_txbuffer_ring(mch_t *ch) +{ + unsigned long flags = 0; + int ret; + + spin_lock_irqsave(&ch->ch_txlock, flags); + ret = musycc_dump_txbuffer_ring_locked(ch); + spin_unlock_irqrestore(&ch->ch_txlock, flags); + + return ret; +} + /* * The following supports a backdoor debug facility which can be used to * display the state of a board's channel. @@ -234,11 +250,11 @@ musycc_dump_ring(ci_t *ci, unsigned int chan) ch->user, ch->txd_irq_srv, ch->txd_usr_add, sd_queue_stopped(ch->user), ch->ch_start_tx, ch->tx_full, ch->txd_free, ch->p.chan_mode); - musycc_dump_txbuffer_ring(ch, 1); + musycc_dump_txbuffer_ring(ch); pr_info("RX Buffer Ring - Channel %d, rxd_num %d. IRQ_SRV[%d] 0x%p, start_rx %x rxpkt %lu\n", chan, ch->rxd_num, ch->rxix_irq_srv, &ch->mdr[ch->rxix_irq_srv], ch->ch_start_rx, ch->s.rx_packets); - musycc_dump_rxbuffer_ring(ch, 1); + musycc_dump_rxbuffer_ring(ch); return SBE_DRVR_SUCCESS; } @@ -380,7 +396,7 @@ musycc_wq_chan_restart(void *arg) /* channel private structure */ ch->channum, ch->rxix_irq_srv, md, le32_to_cpu(md->status), ch->s.rx_packets); - musycc_dump_rxbuffer_ring(ch, 1); /* RLD DEBUG */ + musycc_dump_rxbuffer_ring(ch); /* RLD DEBUG */ #endif } #endif @@ -420,7 +436,7 @@ musycc_wq_chan_restart(void *arg) /* channel private structure */ ch->channum, md, le32_to_cpu(md->status), le32_to_cpu(md->data), ch->ch_start_tx); - musycc_dump_txbuffer_ring(ch, 0); + musycc_dump_txbuffer_ring_locked(ch); } #endif } @@ -903,7 +919,7 @@ musycc_bh_tx_eom(mpi_t *pi, int gchan) sd_queue_stopped(ch->user), ch->ch_start_tx, ch->tx_full, ch->txd_free, ch->p.chan_mode); - musycc_dump_txbuffer_ring(ch, 0); + musycc_dump_txbuffer_ring_locked(ch); } break; /* Not our mdesc, done */ } else { @@ -1412,7 +1428,7 @@ musycc_intr_bh_tasklet(ci_t *ci) ch->tx_full, ch->txd_free, ch->p.chan_mode); - musycc_dump_txbuffer_ring(ch, 0); + musycc_dump_txbuffer_ring_locked(ch); } #endif } @@ -1432,7 +1448,7 @@ musycc_intr_bh_tasklet(ci_t *ci) ci->devname, ch->channum, ch->p.chan_mode); #ifdef RLD_DEBUG - musycc_dump_rxbuffer_ring(ch, 0); + musycc_dump_rxbuffer_ring_locked(ch); #endif } } -- 1.9.3 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel