From: Dan Carpenter <error27@gmail.com>
To: kernel-janitors@vger.kernel.org
Subject: [patch] Staging: iio/dds: double locking bugs
Date: Sat, 13 Nov 2010 09:05:32 +0000 [thread overview]
Message-ID: <20101113090532.GN3533@bicker> (raw)
This is a static checker patch and I don't have this hardware.
This code is unusual because while I've often seen a double lock, this
is the first time I've seen code that takes a lock 11 times in a row. I
feel like I must have missed something. But I've looked very carefully
I don't see any way the original code is correct. Does spi_sync()
somehow release the lock in a way that I can't see? Even if it does,
the locking would still be wrong.
Signed-off-by: Dan Carpenter <error27@gmail.com>
---
This should be easy to test for someone with the hardware. The ad9910
driver should lock up on init.
diff --git a/drivers/staging/iio/dds/ad9951.c b/drivers/staging/iio/dds/ad9951.c
index bc3beff..57eddf6 100644
--- a/drivers/staging/iio/dds/ad9951.c
+++ b/drivers/staging/iio/dds/ad9951.c
@@ -79,7 +79,6 @@ static ssize_t ad9951_set_parameter(struct device *dev,
xfer.len = 2;
xfer.tx_buf = &config->arr[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -89,7 +88,6 @@ static ssize_t ad9951_set_parameter(struct device *dev,
xfer.len = 5;
xfer.tx_buf = &config->ftw0[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -99,7 +97,6 @@ static ssize_t ad9951_set_parameter(struct device *dev,
xfer.len = 3;
xfer.tx_buf = &config->ftw1[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -143,8 +140,6 @@ static void ad9951_init(struct ad9951_state *st)
cfr[2] = HSPD_SYNC;
cfr[3] = 0;
- mutex_lock(&st->lock);
-
xfer.len = 4;
xfer.tx_buf = 𝔠
diff --git a/drivers/staging/iio/dds/ad9910.c b/drivers/staging/iio/dds/ad9910.c
index c59b4079..e8fb75c 100644
--- a/drivers/staging/iio/dds/ad9910.c
+++ b/drivers/staging/iio/dds/ad9910.c
@@ -138,7 +138,6 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 5;
xfer.tx_buf = &config->ioupd[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -148,7 +147,6 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 5;
xfer.tx_buf = &config->ftw[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -158,7 +156,6 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 3;
xfer.tx_buf = &config->pow[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -168,7 +165,6 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 5;
xfer.tx_buf = &config->asf[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -178,7 +174,6 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 5;
xfer.tx_buf = &config->multc[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -188,7 +183,6 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 9;
xfer.tx_buf = &config->dig_rampl[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -198,7 +192,6 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 9;
xfer.tx_buf = &config->dig_ramps[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -208,7 +201,6 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 5;
xfer.tx_buf = &config->dig_rampr[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -218,25 +210,24 @@ static ssize_t ad9910_set_parameter(struct device *dev,
xfer.len = 9;
xfer.tx_buf = &config->sin_tonep0[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(st->sdev, &msg);
if (ret)
goto error_ret;
+
xfer.len = 9;
xfer.tx_buf = &config->sin_tonep1[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(st->sdev, &msg);
if (ret)
goto error_ret;
+
xfer.len = 9;
xfer.tx_buf = &config->sin_tonep2[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -245,43 +236,42 @@ static ssize_t ad9910_set_parameter(struct device *dev,
goto error_ret;
xfer.len = 9;
xfer.tx_buf = &config->sin_tonep3[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(st->sdev, &msg);
if (ret)
goto error_ret;
+
xfer.len = 9;
xfer.tx_buf = &config->sin_tonep4[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(st->sdev, &msg);
if (ret)
goto error_ret;
+
xfer.len = 9;
xfer.tx_buf = &config->sin_tonep5[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(st->sdev, &msg);
if (ret)
goto error_ret;
+
xfer.len = 9;
xfer.tx_buf = &config->sin_tonep6[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(st->sdev, &msg);
if (ret)
goto error_ret;
+
xfer.len = 9;
xfer.tx_buf = &config->sin_tonep7[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -326,8 +316,6 @@ static void ad9910_init(struct ad9910_state *st)
cfr[3] = TX_ENA | PDCLK_INV | PDCLK_ENB;
cfr[4] = PARA_ENA;
- mutex_lock(&st->lock);
-
xfer.len = 5;
xfer.tx_buf = 𝔠
@@ -343,8 +331,6 @@ static void ad9910_init(struct ad9910_state *st)
cfr[3] = REFCLK_RST | REFCLK_BYP;
cfr[4] = 0;
- mutex_lock(&st->lock);
-
xfer.len = 5;
xfer.tx_buf = 𝔠
diff --git a/drivers/staging/iio/dds/ad9852.c b/drivers/staging/iio/dds/ad9852.c
index 0a41d25..594fb6a 100644
--- a/drivers/staging/iio/dds/ad9852.c
+++ b/drivers/staging/iio/dds/ad9852.c
@@ -86,7 +86,6 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 3;
xfer.tx_buf = &config->phajst1[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -96,7 +95,6 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 6;
xfer.tx_buf = &config->fretun1[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -106,7 +104,6 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 6;
xfer.tx_buf = &config->fretun2[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -116,7 +113,6 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 6;
xfer.tx_buf = &config->dltafre[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -126,7 +122,6 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 5;
xfer.tx_buf = &config->updtclk[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -136,7 +131,6 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 4;
xfer.tx_buf = &config->ramprat[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -146,7 +140,6 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 5;
xfer.tx_buf = &config->control[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -156,7 +149,6 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 3;
xfer.tx_buf = &config->outpskm[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
@@ -166,16 +158,15 @@ static ssize_t ad9852_set_parameter(struct device *dev,
xfer.len = 2;
xfer.tx_buf = &config->outpskr[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(st->sdev, &msg);
if (ret)
goto error_ret;
+
xfer.len = 3;
xfer.tx_buf = &config->daccntl[0];
- mutex_lock(&st->lock);
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
diff --git a/drivers/staging/iio/dds/ad9832.c b/drivers/staging/iio/dds/ad9832.c
index a4bb048..e911893 100644
--- a/drivers/staging/iio/dds/ad9832.c
+++ b/drivers/staging/iio/dds/ad9832.c
@@ -166,8 +166,6 @@ static void ad9832_init(struct ad9832_state *st)
config = 0x3 << 14;
- mutex_lock(&st->lock);
-
xfer.len = 2;
xfer.tx_buf = &config;
next reply other threads:[~2010-11-13 9:05 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-13 9:05 Dan Carpenter [this message]
2010-11-14 20:46 ` [patch] Staging: iio/dds: double locking bugs Hennerich, Michael
2010-11-15 1:20 ` Cai, Cliff
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101113090532.GN3533@bicker \
--to=error27@gmail.com \
--cc=kernel-janitors@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).