I sent this 9 days ago but got no answer.
Is anything wrong with this patch?
Commit 73d5c5c864f40 made sure that media/usb drivers don't do DMA on stack.
That made pctv452e oops while initialising:
[...]
BUG: unable to handle kernel NULL pointer dereference at (null)
[...]
[ 9.051527] [<ffffffff8179c507>] mutex_lock+0x17/0x30
[ 9.051531] [<ffffffffa062fc75>] pctv452e_power_ctrl+0x85/0x190
[dvb_usb_pctv452e]
[ 9.051536] [<ffffffffa06bb4ef>] dvb_usb_device_power_ctrl+0x3f/0x50
[dvb_usb]
[ 9.051541] [<ffffffffa06bb725>] dvb_usb_device_init+0x225/0x620
[dvb_usb]
[ 9.051546] [<ffffffffa0630251>] pctv452e_usb_probe+0x51/0x60
[dvb_usb_pctv452e]
[ 9.051550] [<ffffffff815dcf69>] usb_probe_interface+0x159/0x2d0
[...]
Commit 7724325a1 fixed most drivers but not all - I guess that only
those using data_mutex for locking got fixes. But some gave the
mutex a different name, in pctv452e it was ca_mutex.
This patches only pctv452e but grep mutex_lock in usb/dvb-usb makes me
believe that more drivers need to be fixed.
Fixes: 73d5c5c8 ("[media] pctv452e: don't do DMA on stack")
WolfgangSigned-off-by: Rohdewald <[email protected]>
CC: Mauro Carvalho Chehab <[email protected]>
---
drivers/media/usb/dvb-usb/pctv452e.c | 31 +++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/drivers/media/usb/dvb-usb/pctv452e.c b/drivers/media/usb/dvb-
usb/pctv452e.c
index 07fa08b..5f9cd32 100644
--- a/drivers/media/usb/dvb-usb/pctv452e.c
+++ b/drivers/media/usb/dvb-usb/pctv452e.c
@@ -92,7 +92,6 @@ static struct stb0899_postproc pctv45e_postproc[] = {
*/
struct pctv452e_state {
struct dvb_ca_en50221 ca;
- struct mutex ca_mutex;
u8 c; /* transaction counter, wraps around... */
u8 initialized; /* set to 1 if 0x15 has been sent */
@@ -114,7 +113,7 @@ static int tt3650_ci_msg(struct dvb_usb_device *d, u8
cmd, u8 *data,
return -EIO;
}
- mutex_lock(&state->ca_mutex);
+ mutex_lock(&d->data_mutex);
id = state->c++;
state->data[0] = SYNC_BYTE_OUT;
@@ -136,14 +135,14 @@ static int tt3650_ci_msg(struct dvb_usb_device *d, u8
cmd, u8 *data,
memcpy(data, state->data + 4, read_len);
- mutex_unlock(&state->ca_mutex);
+ mutex_unlock(&d->data_mutex);
return 0;
failed:
err("CI error %d; %02X %02X %02X -> %*ph.",
ret, SYNC_BYTE_OUT, id, cmd, 3, state->data);
- mutex_unlock(&state->ca_mutex);
+ mutex_unlock(&d->data_mutex);
return ret;
}
@@ -155,9 +154,9 @@ static int tt3650_ci_msg_locked(struct dvb_ca_en50221
*ca,
struct pctv452e_state *state = (struct pctv452e_state *)d->priv;
int ret;
- mutex_lock(&state->ca_mutex);
+ mutex_lock(&d->data_mutex);
ret = tt3650_ci_msg(d, cmd, data, write_len, read_len);
- mutex_unlock(&state->ca_mutex);
+ mutex_unlock(&d->data_mutex);
return ret;
}
@@ -296,7 +295,7 @@ static int tt3650_ci_slot_reset(struct dvb_ca_en50221
*ca, int slot)
buf[0] = 0;
- mutex_lock(&state->ca_mutex);
+ mutex_lock(&d->data_mutex);
ret = tt3650_ci_msg(d, TT3650_CMD_CI_RESET, buf, 1, 1);
if (0 != ret)
@@ -317,7 +316,7 @@ static int tt3650_ci_slot_reset(struct dvb_ca_en50221
*ca, int slot)
ret = tt3650_ci_msg(d, TT3650_CMD_CI_SET_VIDEO_PORT, buf, 1, 1);
failed:
- mutex_unlock(&state->ca_mutex);
+ mutex_unlock(&d->data_mutex);
return ret;
}
@@ -376,7 +375,7 @@ static int tt3650_ci_init(struct dvb_usb_adapter *a)
ci_dbg("%s", __func__);
- mutex_init(&state->ca_mutex);
+ mutex_init(&d->data_mutex);
state->ca.owner = THIS_MODULE;
state->ca.read_attribute_mem = tt3650_ci_read_attribute_mem;
@@ -413,7 +412,7 @@ static int pctv452e_i2c_msg(struct dvb_usb_device *d, u8
addr,
u8 id;
int ret;
- mutex_lock(&state->ca_mutex);
+ mutex_lock(&d->data_mutex);
id = state->c++;
ret = -EINVAL;
@@ -447,7 +446,7 @@ static int pctv452e_i2c_msg(struct dvb_usb_device *d, u8
addr,
goto failed;
memcpy(rcv_buf, state->data + 7, rcv_len);
- mutex_unlock(&state->ca_mutex);
+ mutex_unlock(&d->data_mutex);
return rcv_len;
@@ -456,7 +455,7 @@ static int pctv452e_i2c_msg(struct dvb_usb_device *d, u8
addr,
ret, SYNC_BYTE_OUT, id, addr << 1, snd_len, rcv_len,
7, state->data);
- mutex_unlock(&state->ca_mutex);
+ mutex_unlock(&d->data_mutex);
return ret;
}
@@ -520,7 +519,7 @@ static int pctv452e_power_ctrl(struct dvb_usb_device *d,
int i)
if (!rx)
return -ENOMEM;
- mutex_lock(&state->ca_mutex);
+ mutex_lock(&d->data_mutex);
/* hmm where shoud this should go? */
ret = usb_set_interface(d->udev, 0, ISOC_INTERFACE_ALTERNATIVE);
if (ret != 0)
@@ -548,7 +547,7 @@ static int pctv452e_power_ctrl(struct dvb_usb_device *d,
int i)
state->initialized = 1;
ret:
- mutex_unlock(&state->ca_mutex);
+ mutex_unlock(&d->data_mutex);
kfree(rx);
return ret;
}
@@ -559,7 +558,7 @@ static int pctv452e_rc_query(struct dvb_usb_device *d)
int ret, i;
u8 id;
- mutex_lock(&state->ca_mutex);
+ mutex_lock(&d->data_mutex);
id = state->c++;
/* prepare command header */
@@ -595,7 +594,7 @@ static int pctv452e_rc_query(struct dvb_usb_device *d)
state->last_rc_key = 0;
}
ret:
- mutex_unlock(&state->ca_mutex);
+ mutex_unlock(&d->data_mutex);
return ret;
}
--
Wolfgang
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html