* [PATCH 34/50] wireless: libertas_tf: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:05 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, John W. Linville, libertas-dev
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: "John W. Linville" <linville@tuxdriver.com>
Cc: libertas-dev@lists.infradead.org
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/net/wireless/libertas_tf/if_usb.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c
index d576dd6..0e9e972 100644
--- a/drivers/net/wireless/libertas_tf/if_usb.c
+++ b/drivers/net/wireless/libertas_tf/if_usb.c
@@ -610,6 +610,8 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
struct if_usb_card *cardp,
struct lbtf_private *priv)
{
+ unsigned long flags;
+
if (recvlength > LBS_CMD_BUFFER_SIZE) {
lbtf_deb_usbd(&cardp->udev->dev,
"The receive buffer is too large\n");
@@ -619,12 +621,12 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
BUG_ON(!in_interrupt());
- spin_lock(&priv->driver_lock);
+ spin_lock_irqsave(&priv->driver_lock, flags);
memcpy(priv->cmd_resp_buff, recvbuff + MESSAGE_HEADER_LEN,
recvlength - MESSAGE_HEADER_LEN);
kfree_skb(skb);
lbtf_cmd_response_rx(priv);
- spin_unlock(&priv->driver_lock);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
}
/**
--
1.7.9.5
^ permalink raw reply related
* [PATCH 35/50] media: usb: cx231xx: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:05 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Mauro Carvalho Chehab, Hans Verkuil
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: Hans Verkuil <hans.verkuil@cisco.com>
Cc: linux-media@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/media/usb/cx231xx/cx231xx-audio.c | 6 ++++++
drivers/media/usb/cx231xx/cx231xx-core.c | 10 ++++++----
drivers/media/usb/cx231xx/cx231xx-vbi.c | 5 +++--
3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/drivers/media/usb/cx231xx/cx231xx-audio.c b/drivers/media/usb/cx231xx/cx231xx-audio.c
index 81a1d97..58c1b5c 100644
--- a/drivers/media/usb/cx231xx/cx231xx-audio.c
+++ b/drivers/media/usb/cx231xx/cx231xx-audio.c
@@ -136,6 +136,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
stride = runtime->frame_bits >> 3;
for (i = 0; i < urb->number_of_packets; i++) {
+ unsigned long flags;
int length = urb->iso_frame_desc[i].actual_length /
stride;
cp = (unsigned char *)urb->transfer_buffer +
@@ -158,6 +159,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
length * stride);
}
+ local_irq_save(flags);
snd_pcm_stream_lock(substream);
dev->adev.hwptr_done_capture += length;
@@ -174,6 +176,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
period_elapsed = 1;
}
snd_pcm_stream_unlock(substream);
+ local_irq_restore(flags);
}
if (period_elapsed)
snd_pcm_period_elapsed(substream);
@@ -224,6 +227,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
stride = runtime->frame_bits >> 3;
if (1) {
+ unsigned long flags;
int length = urb->actual_length /
stride;
cp = (unsigned char *)urb->transfer_buffer;
@@ -242,6 +246,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
length * stride);
}
+ local_irq_save(flags);
snd_pcm_stream_lock(substream);
dev->adev.hwptr_done_capture += length;
@@ -258,6 +263,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
period_elapsed = 1;
}
snd_pcm_stream_unlock(substream);
+ local_irq_restore(flags);
}
if (period_elapsed)
snd_pcm_period_elapsed(substream);
diff --git a/drivers/media/usb/cx231xx/cx231xx-core.c b/drivers/media/usb/cx231xx/cx231xx-core.c
index 4ba3ce0..593b397 100644
--- a/drivers/media/usb/cx231xx/cx231xx-core.c
+++ b/drivers/media/usb/cx231xx/cx231xx-core.c
@@ -798,6 +798,7 @@ static void cx231xx_isoc_irq_callback(struct urb *urb)
container_of(dma_q, struct cx231xx_video_mode, vidq);
struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
int i;
+ unsigned long flags;
switch (urb->status) {
case 0: /* success */
@@ -813,9 +814,9 @@ static void cx231xx_isoc_irq_callback(struct urb *urb)
}
/* Copy data from URB */
- spin_lock(&dev->video_mode.slock);
+ spin_lock_irqsave(&dev->video_mode.slock, flags);
dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
- spin_unlock(&dev->video_mode.slock);
+ spin_unlock_irqrestore(&dev->video_mode.slock, flags);
/* Reset urb buffers */
for (i = 0; i < urb->number_of_packets; i++) {
@@ -842,6 +843,7 @@ static void cx231xx_bulk_irq_callback(struct urb *urb)
struct cx231xx_video_mode *vmode =
container_of(dma_q, struct cx231xx_video_mode, vidq);
struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
+ unsigned long flags;
switch (urb->status) {
case 0: /* success */
@@ -857,9 +859,9 @@ static void cx231xx_bulk_irq_callback(struct urb *urb)
}
/* Copy data from URB */
- spin_lock(&dev->video_mode.slock);
+ spin_lock_irqsave(&dev->video_mode.slock, flags);
dev->video_mode.bulk_ctl.bulk_copy(dev, urb);
- spin_unlock(&dev->video_mode.slock);
+ spin_unlock_irqrestore(&dev->video_mode.slock, flags);
/* Reset urb buffers */
urb->status = usb_submit_urb(urb, GFP_ATOMIC);
diff --git a/drivers/media/usb/cx231xx/cx231xx-vbi.c b/drivers/media/usb/cx231xx/cx231xx-vbi.c
index c027942..38e78f8 100644
--- a/drivers/media/usb/cx231xx/cx231xx-vbi.c
+++ b/drivers/media/usb/cx231xx/cx231xx-vbi.c
@@ -306,6 +306,7 @@ static void cx231xx_irq_vbi_callback(struct urb *urb)
struct cx231xx_video_mode *vmode =
container_of(dma_q, struct cx231xx_video_mode, vidq);
struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
+ unsigned long flags;
switch (urb->status) {
case 0: /* success */
@@ -322,9 +323,9 @@ static void cx231xx_irq_vbi_callback(struct urb *urb)
}
/* Copy data from URB */
- spin_lock(&dev->vbi_mode.slock);
+ spin_lock_irqsave(&dev->vbi_mode.slock, flags);
dev->vbi_mode.bulk_ctl.bulk_copy(dev, urb);
- spin_unlock(&dev->vbi_mode.slock);
+ spin_unlock_irqrestore(&dev->vbi_mode.slock, flags);
/* Reset status */
urb->status = 0;
--
1.7.9.5
^ permalink raw reply related
* [PATCH 36/50] media: usb: em28xx: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:05 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Mauro Carvalho Chehab
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: linux-media@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/media/usb/em28xx/em28xx-core.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c
index fc157af..0d698f9 100644
--- a/drivers/media/usb/em28xx/em28xx-core.c
+++ b/drivers/media/usb/em28xx/em28xx-core.c
@@ -941,6 +941,7 @@ static void em28xx_irq_callback(struct urb *urb)
{
struct em28xx *dev = urb->context;
int i;
+ unsigned long flags;
switch (urb->status) {
case 0: /* success */
@@ -956,9 +957,9 @@ static void em28xx_irq_callback(struct urb *urb)
}
/* Copy data from URB */
- spin_lock(&dev->slock);
+ spin_lock_irqsave(&dev->slock, flags);
dev->usb_ctl.urb_data_copy(dev, urb);
- spin_unlock(&dev->slock);
+ spin_unlock_irqrestore(&dev->slock, flags);
/* Reset urb buffers */
for (i = 0; i < urb->number_of_packets; i++) {
--
1.7.9.5
^ permalink raw reply related
* [PATCH 37/50] media: usb: sn9x102: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Mauro Carvalho Chehab
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: linux-media@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/media/usb/sn9c102/sn9c102_core.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/media/usb/sn9c102/sn9c102_core.c b/drivers/media/usb/sn9c102/sn9c102_core.c
index 2cb44de..33dc595 100644
--- a/drivers/media/usb/sn9c102/sn9c102_core.c
+++ b/drivers/media/usb/sn9c102/sn9c102_core.c
@@ -784,12 +784,14 @@ end_of_frame:
cam->sensor.pix_format.pixelformat ==
V4L2_PIX_FMT_JPEG) && eof)) {
u32 b;
+ unsigned long flags;
b = (*f)->buf.bytesused;
(*f)->state = F_DONE;
(*f)->buf.sequence= ++cam->frame_count;
- spin_lock(&cam->queue_lock);
+ spin_lock_irqsave(&cam->queue_lock,
+ flags);
list_move_tail(&(*f)->frame,
&cam->outqueue);
if (!list_empty(&cam->inqueue))
@@ -799,7 +801,8 @@ end_of_frame:
frame );
else
(*f) = NULL;
- spin_unlock(&cam->queue_lock);
+ spin_unlock_irqrestore(&cam->queue_lock,
+ flags);
memcpy(cam->sysfs.frame_header,
cam->sof.header, soflen);
--
1.7.9.5
^ permalink raw reply related
* [PATCH 38/50] media: usb: tlg2300: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Mauro Carvalho Chehab
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: linux-media@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/media/usb/tlg2300/pd-video.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/media/usb/tlg2300/pd-video.c b/drivers/media/usb/tlg2300/pd-video.c
index 8df668d..4e5bd07 100644
--- a/drivers/media/usb/tlg2300/pd-video.c
+++ b/drivers/media/usb/tlg2300/pd-video.c
@@ -151,11 +151,12 @@ static void init_copy(struct video_data *video, bool index)
static bool get_frame(struct front_face *front, int *need_init)
{
struct videobuf_buffer *vb = front->curr_frame;
+ unsigned long flags;
if (vb)
return true;
- spin_lock(&front->queue_lock);
+ spin_lock_irqsave(&front->queue_lock, flags);
if (!list_empty(&front->active)) {
vb = list_entry(front->active.next,
struct videobuf_buffer, queue);
@@ -164,7 +165,7 @@ static bool get_frame(struct front_face *front, int *need_init)
front->curr_frame = vb;
list_del_init(&vb->queue);
}
- spin_unlock(&front->queue_lock);
+ spin_unlock_irqrestore(&front->queue_lock, flags);
return !!vb;
}
--
1.7.9.5
^ permalink raw reply related
* [PATCH 39/50] media: usb: tm6000: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Mauro Carvalho Chehab
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: linux-media@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/media/usb/tm6000/tm6000-video.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/media/usb/tm6000/tm6000-video.c b/drivers/media/usb/tm6000/tm6000-video.c
index cc1aa14..8bb440f 100644
--- a/drivers/media/usb/tm6000/tm6000-video.c
+++ b/drivers/media/usb/tm6000/tm6000-video.c
@@ -434,6 +434,7 @@ static void tm6000_irq_callback(struct urb *urb)
struct tm6000_dmaqueue *dma_q = urb->context;
struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
int i;
+ unsigned long flags;
switch (urb->status) {
case 0:
@@ -450,9 +451,9 @@ static void tm6000_irq_callback(struct urb *urb)
break;
}
- spin_lock(&dev->slock);
+ spin_lock_irqsave(&dev->slock, flags);
tm6000_isoc_copy(urb);
- spin_unlock(&dev->slock);
+ spin_unlock_irqrestore(&dev->slock, flags);
/* Reset urb buffers */
for (i = 0; i < urb->number_of_packets; i++) {
--
1.7.9.5
^ permalink raw reply related
* [PATCH 40/50] media: dvb-core: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Mauro Carvalho Chehab
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
These functions may be called inside URB->complete(), so use
spin_lock_irqsave().
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: linux-media@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/media/dvb-core/dvb_demux.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c
index 3485655..58de441 100644
--- a/drivers/media/dvb-core/dvb_demux.c
+++ b/drivers/media/dvb-core/dvb_demux.c
@@ -476,7 +476,9 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
size_t count)
{
- spin_lock(&demux->lock);
+ unsigned long flags;
+
+ spin_lock_irqsave(&demux->lock, flags);
while (count--) {
if (buf[0] == 0x47)
@@ -484,7 +486,7 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
buf += 188;
}
- spin_unlock(&demux->lock);
+ spin_unlock_irqrestore(&demux->lock, flags);
}
EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
@@ -519,8 +521,9 @@ static inline void _dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf,
{
int p = 0, i, j;
const u8 *q;
+ unsigned long flags;
- spin_lock(&demux->lock);
+ spin_lock_irqsave(&demux->lock, flags);
if (demux->tsbufp) { /* tsbuf[0] is now 0x47. */
i = demux->tsbufp;
@@ -564,7 +567,7 @@ static inline void _dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf,
}
bailout:
- spin_unlock(&demux->lock);
+ spin_unlock_irqrestore(&demux->lock, flags);
}
void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
@@ -581,11 +584,13 @@ EXPORT_SYMBOL(dvb_dmx_swfilter_204);
void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, size_t count)
{
- spin_lock(&demux->lock);
+ unsigned long flags;
+
+ spin_lock_irqsave(&demux->lock, flags);
demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts, DMX_OK);
- spin_unlock(&demux->lock);
+ spin_unlock_irqrestore(&demux->lock, flags);
}
EXPORT_SYMBOL(dvb_dmx_swfilter_raw);
--
1.7.9.5
^ permalink raw reply related
* [PATCH 41/50] media: usb: em28xx: make sure irq disabled before acquiring lock
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Mauro Carvalho Chehab
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so add local_irq_save()
before acquiring the lock without irqsave().
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: linux-media@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/media/usb/em28xx/em28xx-audio.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/media/usb/em28xx/em28xx-audio.c b/drivers/media/usb/em28xx/em28xx-audio.c
index 2fdb66e..dca53ec 100644
--- a/drivers/media/usb/em28xx/em28xx-audio.c
+++ b/drivers/media/usb/em28xx/em28xx-audio.c
@@ -113,6 +113,7 @@ static void em28xx_audio_isocirq(struct urb *urb)
stride = runtime->frame_bits >> 3;
for (i = 0; i < urb->number_of_packets; i++) {
+ unsigned long flags;
int length =
urb->iso_frame_desc[i].actual_length / stride;
cp = (unsigned char *)urb->transfer_buffer +
@@ -134,6 +135,7 @@ static void em28xx_audio_isocirq(struct urb *urb)
length * stride);
}
+ local_irq_save(flags);
snd_pcm_stream_lock(substream);
dev->adev.hwptr_done_capture += length;
@@ -151,6 +153,7 @@ static void em28xx_audio_isocirq(struct urb *urb)
}
snd_pcm_stream_unlock(substream);
+ local_irq_restore(flags);
}
if (period_elapsed)
snd_pcm_period_elapsed(substream);
--
1.7.9.5
^ permalink raw reply related
* [PATCH 42/50] media: usb: tlg2300: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Mauro Carvalho Chehab
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so disable local
interrupt before holding a global lock which is held without
irqsave.
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: linux-media@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/media/usb/tlg2300/pd-alsa.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/media/usb/tlg2300/pd-alsa.c b/drivers/media/usb/tlg2300/pd-alsa.c
index 3f3e141..cbccc96 100644
--- a/drivers/media/usb/tlg2300/pd-alsa.c
+++ b/drivers/media/usb/tlg2300/pd-alsa.c
@@ -141,6 +141,7 @@ static inline void handle_audio_data(struct urb *urb, int *period_elapsed)
int len = urb->actual_length / stride;
unsigned char *cp = urb->transfer_buffer;
unsigned int oldptr = pa->rcv_position;
+ unsigned long flags;
if (urb->actual_length == AUDIO_BUF_SIZE - 4)
len -= (AUDIO_TRAILER_SIZE / stride);
@@ -156,6 +157,7 @@ static inline void handle_audio_data(struct urb *urb, int *period_elapsed)
memcpy(runtime->dma_area + oldptr * stride, cp, len * stride);
/* update the statas */
+ local_irq_save(flags);
snd_pcm_stream_lock(pa->capture_pcm_substream);
pa->rcv_position += len;
if (pa->rcv_position >= runtime->buffer_size)
@@ -167,6 +169,7 @@ static inline void handle_audio_data(struct urb *urb, int *period_elapsed)
*period_elapsed = 1;
}
snd_pcm_stream_unlock(pa->capture_pcm_substream);
+ local_irq_restore(flags);
}
static void complete_handler_audio(struct urb *urb)
--
1.7.9.5
^ permalink raw reply related
* [PATCH 43/50] sound: usb: midi: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Jaroslav Kysela, Takashi Iwai, Clemens Ladisch
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.de>
Cc: Clemens Ladisch <clemens@ladisch.de>
Cc: alsa-devel@alsa-project.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
sound/usb/midi.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
index b901f46..86af276 100644
--- a/sound/usb/midi.c
+++ b/sound/usb/midi.c
@@ -279,15 +279,16 @@ static void snd_usbmidi_out_urb_complete(struct urb* urb)
struct out_urb_context *context = urb->context;
struct snd_usb_midi_out_endpoint* ep = context->ep;
unsigned int urb_index;
+ unsigned long flags;
- spin_lock(&ep->buffer_lock);
+ spin_lock_irqsave(&ep->buffer_lock, flags);
urb_index = context - ep->urbs;
ep->active_urbs &= ~(1 << urb_index);
if (unlikely(ep->drain_urbs)) {
ep->drain_urbs &= ~(1 << urb_index);
wake_up(&ep->drain_wait);
}
- spin_unlock(&ep->buffer_lock);
+ spin_unlock_irqrestore(&ep->buffer_lock, flags);
if (urb->status < 0) {
int err = snd_usbmidi_urb_error(urb->status);
if (err < 0) {
--
1.7.9.5
^ permalink raw reply related
* [PATCH 44/50] sound: usb: caiaq: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Daniel Mack, Jaroslav Kysela, Takashi Iwai
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: Daniel Mack <zonque@gmail.com>
Cc: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
sound/usb/caiaq/audio.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c
index 7103b09..e5675ab 100644
--- a/sound/usb/caiaq/audio.c
+++ b/sound/usb/caiaq/audio.c
@@ -672,10 +672,11 @@ static void read_completed(struct urb *urb)
offset += len;
if (len > 0) {
- spin_lock(&cdev->spinlock);
+ unsigned long flags;
+ spin_lock_irqsave(&cdev->spinlock, flags);
fill_out_urb(cdev, out, &out->iso_frame_desc[outframe]);
read_in_urb(cdev, urb, &urb->iso_frame_desc[frame]);
- spin_unlock(&cdev->spinlock);
+ spin_unlock_irqrestore(&cdev->spinlock, flags);
check_for_elapsed_periods(cdev, cdev->sub_playback);
check_for_elapsed_periods(cdev, cdev->sub_capture);
send_it = 1;
--
1.7.9.5
^ permalink raw reply related
* [PATCH 45/50] sound: usb: usx2y: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Jaroslav Kysela, Takashi Iwai
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
sound/usb/usx2y/usbusx2yaudio.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c
index 4967fe9..e2ee893 100644
--- a/sound/usb/usx2y/usbusx2yaudio.c
+++ b/sound/usb/usx2y/usbusx2yaudio.c
@@ -273,7 +273,11 @@ static void usX2Y_clients_stop(struct usX2Ydev *usX2Y)
struct snd_usX2Y_substream *subs = usX2Y->subs[s];
if (subs) {
if (atomic_read(&subs->state) >= state_PRERUNNING) {
+ unsigned long flags;
+
+ local_irq_save(flags);
snd_pcm_stop(subs->pcm_substream, SNDRV_PCM_STATE_XRUN);
+ local_irq_restore(flags);
}
for (u = 0; u < NRURBS; u++) {
struct urb *urb = subs->urb[u];
--
1.7.9.5
^ permalink raw reply related
* [PATCH 46/50] Sound: usb: ua101: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA, Oliver Neukum, Alan Stern,
linux-input-u79uwXL29TY76Z2rM5mHXA,
linux-bluetooth-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA,
linux-wireless-u79uwXL29TY76Z2rM5mHXA,
linux-media-u79uwXL29TY76Z2rM5mHXA,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw, Ming Lei, Clemens Ladisch,
Jaroslav Kysela, Takashi Iwai
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
Complete() will be run with interrupt enabled, so disable local
interrupt before holding a global lock which is held without irqsave.
Cc: Clemens Ladisch <clemens-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>
Cc: Jaroslav Kysela <perex-/Fr2/VpizcU@public.gmane.org>
Cc: Takashi Iwai <tiwai-l3A5Bk7waGM@public.gmane.org>
Cc: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org
Signed-off-by: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
---
sound/usb/misc/ua101.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c
index 8b5d2c5..52a60c6 100644
--- a/sound/usb/misc/ua101.c
+++ b/sound/usb/misc/ua101.c
@@ -613,14 +613,24 @@ static int start_usb_playback(struct ua101 *ua)
static void abort_alsa_capture(struct ua101 *ua)
{
- if (test_bit(ALSA_CAPTURE_RUNNING, &ua->states))
+ if (test_bit(ALSA_CAPTURE_RUNNING, &ua->states)) {
+ unsigned long flags;
+
+ local_irq_save(flags);
snd_pcm_stop(ua->capture.substream, SNDRV_PCM_STATE_XRUN);
+ local_irq_restore(flags);
+ }
}
static void abort_alsa_playback(struct ua101 *ua)
{
- if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states))
+ if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states)) {
+ unsigned long flags;
+
+ local_irq_save(flags);
snd_pcm_stop(ua->playback.substream, SNDRV_PCM_STATE_XRUN);
+ local_irq_restore(flags);
+ }
}
static int set_stream_hw(struct ua101 *ua, struct snd_pcm_substream *substream,
--
1.7.9.5
^ permalink raw reply related
* [PATCH 47/50] staging: btmtk_usb: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA, Oliver Neukum, Alan Stern,
linux-input-u79uwXL29TY76Z2rM5mHXA,
linux-bluetooth-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA,
linux-wireless-u79uwXL29TY76Z2rM5mHXA,
linux-media-u79uwXL29TY76Z2rM5mHXA,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw, Ming Lei,
devel-gWbeCf7V1WCQmaza687I9mD2FQJk+8+b
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: devel-gWbeCf7V1WCQmaza687I9mD2FQJk+8+b@public.gmane.org
Signed-off-by: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
---
drivers/staging/btmtk_usb/btmtk_usb.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/btmtk_usb/btmtk_usb.c b/drivers/staging/btmtk_usb/btmtk_usb.c
index 0e783e8..ea10d4f 100644
--- a/drivers/staging/btmtk_usb/btmtk_usb.c
+++ b/drivers/staging/btmtk_usb/btmtk_usb.c
@@ -1218,6 +1218,7 @@ static void btmtk_usb_tx_complete(struct urb *urb)
struct sk_buff *skb = urb->context;
struct hci_dev *hdev = (struct hci_dev *)skb->dev;
struct btmtk_usb_data *data = hci_get_drvdata(hdev);
+ unsigned long flags;
BT_DBG("%s: %s urb %p status %d count %d\n", __func__, hdev->name,
urb, urb->status, urb->actual_length);
@@ -1231,9 +1232,9 @@ static void btmtk_usb_tx_complete(struct urb *urb)
hdev->stat.err_tx++;
done:
- spin_lock(&data->txlock);
+ spin_lock_irqsave(&data->txlock, flags);
data->tx_in_flight--;
- spin_unlock(&data->txlock);
+ spin_unlock_irqrestore(&data->txlock, flags);
kfree(urb->setup_packet);
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* [PATCH 48/50] staging: bcm: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, devel
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: devel@driverdev.osuosl.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/staging/bcm/InterfaceRx.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/bcm/InterfaceRx.c b/drivers/staging/bcm/InterfaceRx.c
index 26f5bc7..00af901 100644
--- a/drivers/staging/bcm/InterfaceRx.c
+++ b/drivers/staging/bcm/InterfaceRx.c
@@ -47,6 +47,7 @@ static void read_bulk_callback(struct urb *urb)
struct bcm_interface_adapter *psIntfAdapter = pRcb->psIntfAdapter;
struct bcm_mini_adapter *Adapter = psIntfAdapter->psAdapter;
struct bcm_leader *pLeader = urb->transfer_buffer;
+ unsigned long flags;
if (unlikely(netif_msg_rx_status(Adapter)))
pr_info(PFX "%s: rx urb status %d length %d\n",
@@ -129,9 +130,9 @@ static void read_bulk_callback(struct urb *urb)
(sizeof(struct bcm_leader)), pLeader->PLength);
skb->len = pLeader->PLength + sizeof(USHORT);
- spin_lock(&Adapter->control_queue_lock);
+ spin_lock_irqsave(&Adapter->control_queue_lock, flags);
ENQUEUEPACKET(Adapter->RxControlHead,Adapter->RxControlTail,skb);
- spin_unlock(&Adapter->control_queue_lock);
+ spin_unlock_irqretore(&Adapter->control_queue_lock, flags);
atomic_inc(&Adapter->cntrlpktCnt);
wake_up(&Adapter->process_rx_cntrlpkt);
--
1.7.9.5
^ permalink raw reply related
* [PATCH 49/50] staging: ced1401: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, devel
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: devel@driverdev.osuosl.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/staging/ced1401/usb1401.c | 35 +++++++++++++++++++----------------
1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/drivers/staging/ced1401/usb1401.c b/drivers/staging/ced1401/usb1401.c
index 97c55f9..70d2f43 100644
--- a/drivers/staging/ced1401/usb1401.c
+++ b/drivers/staging/ced1401/usb1401.c
@@ -265,6 +265,7 @@ static void ced_writechar_callback(struct urb *pUrb)
{
DEVICE_EXTENSION *pdx = pUrb->context;
int nGot = pUrb->actual_length; /* what we transferred */
+ unsigned long flags;
if (pUrb->status) { /* sync/async unlink faults aren't errors */
if (!
@@ -275,24 +276,24 @@ static void ced_writechar_callback(struct urb *pUrb)
__func__, pUrb->status);
}
- spin_lock(&pdx->err_lock);
+ spin_lock_irqsave(&pdx->err_lock, flags);
pdx->errors = pUrb->status;
- spin_unlock(&pdx->err_lock);
+ spin_unlock_irqrestore(&pdx->err_lock, flags);
nGot = 0; /* and tidy up again if so */
- spin_lock(&pdx->charOutLock); /* already at irq level */
+ spin_lock_irqsave(&pdx->charOutLock, flags); /* already at irq level */
pdx->dwOutBuffGet = 0; /* Reset the output buffer */
pdx->dwOutBuffPut = 0;
pdx->dwNumOutput = 0; /* Clear the char count */
pdx->bPipeError[0] = 1; /* Flag an error for later */
pdx->bSendCharsPending = false; /* Allow other threads again */
- spin_unlock(&pdx->charOutLock); /* already at irq level */
+ spin_unlock_irqrestore(&pdx->charOutLock, flags); /* already at irq level */
dev_dbg(&pdx->interface->dev,
"%s - char out done, 0 chars sent", __func__);
} else {
dev_dbg(&pdx->interface->dev,
"%s - char out done, %d chars sent", __func__, nGot);
- spin_lock(&pdx->charOutLock); /* already at irq level */
+ spin_lock_irqsave(&pdx->charOutLock, flags); /* already at irq level */
pdx->dwNumOutput -= nGot; /* Now adjust the char send buffer */
pdx->dwOutBuffGet += nGot; /* to match what we did */
if (pdx->dwOutBuffGet >= OUTBUF_SZ) /* Can't do this any earlier as data could be overwritten */
@@ -305,7 +306,7 @@ static void ced_writechar_callback(struct urb *pUrb)
unsigned int dwCount = pdx->dwNumOutput; /* maximum to send */
if ((pdx->dwOutBuffGet + dwCount) > OUTBUF_SZ) /* does it cross buffer end? */
dwCount = OUTBUF_SZ - pdx->dwOutBuffGet;
- spin_unlock(&pdx->charOutLock); /* we are done with stuff that changes */
+ spin_unlock_irqrestore(&pdx->charOutLock, flags); /* we are done with stuff that changes */
memcpy(pdx->pCoherCharOut, pDat, dwCount); /* copy output data to the buffer */
usb_fill_bulk_urb(pdx->pUrbCharOut, pdx->udev,
usb_sndbulkpipe(pdx->udev,
@@ -318,7 +319,7 @@ static void ced_writechar_callback(struct urb *pUrb)
iReturn = usb_submit_urb(pdx->pUrbCharOut, GFP_ATOMIC);
dev_dbg(&pdx->interface->dev, "%s n=%d>%s<", __func__,
dwCount, pDat);
- spin_lock(&pdx->charOutLock); /* grab lock for errors */
+ spin_lock_irqsave(&pdx->charOutLock, flags); /* grab lock for errors */
if (iReturn) {
pdx->bPipeError[nPipe] = 1; /* Flag an error to be handled later */
pdx->bSendCharsPending = false; /* Allow other threads again */
@@ -329,7 +330,7 @@ static void ced_writechar_callback(struct urb *pUrb)
}
} else
pdx->bSendCharsPending = false; /* Allow other threads again */
- spin_unlock(&pdx->charOutLock); /* already at irq level */
+ spin_unlock_irqrestore(&pdx->charOutLock, flags); /* already at irq level */
}
}
@@ -505,8 +506,9 @@ static void staged_callback(struct urb *pUrb)
unsigned int nGot = pUrb->actual_length; /* what we transferred */
bool bCancel = false;
bool bRestartCharInput; /* used at the end */
+ unsigned long flags;
- spin_lock(&pdx->stagedLock); /* stop ReadWriteMem() action while this routine is running */
+ spin_lock_irqsave(&pdx->stagedLock, flags); /* stop ReadWriteMem() action while this routine is running */
pdx->bStagedUrbPending = false; /* clear the flag for staged IRP pending */
if (pUrb->status) { /* sync/async unlink faults aren't errors */
@@ -679,7 +681,7 @@ static void staged_callback(struct urb *pUrb)
bRestartCharInput = !bCancel && (pdx->dwDMAFlag == MODE_CHAR)
&& !pdx->bXFerWaiting;
- spin_unlock(&pdx->stagedLock); /* Finally release the lock again */
+ spin_unlock_irqrestore(&pdx->stagedLock, flags); /* Finally release the lock again */
/* This is not correct as dwDMAFlag is protected by the staged lock, but it is treated */
/* in Allowi as if it were protected by the char lock. In any case, most systems will */
@@ -1093,6 +1095,7 @@ static void ced_readchar_callback(struct urb *pUrb)
{
DEVICE_EXTENSION *pdx = pUrb->context;
int nGot = pUrb->actual_length; /* what we transferred */
+ unsigned long flags;
if (pUrb->status) { /* Do we have a problem to handle? */
int nPipe = pdx->nPipes == 4 ? 1 : 0; /* The pipe number to use for error */
@@ -1108,19 +1111,19 @@ static void ced_readchar_callback(struct urb *pUrb)
"%s - 0 chars pUrb->status=%d (shutdown?)",
__func__, pUrb->status);
- spin_lock(&pdx->err_lock);
+ spin_lock_irqsave(&pdx->err_lock, flags);
pdx->errors = pUrb->status;
- spin_unlock(&pdx->err_lock);
+ spin_unlock_irqrestore(&pdx->err_lock, flags);
nGot = 0; /* and tidy up again if so */
- spin_lock(&pdx->charInLock); /* already at irq level */
+ spin_lock_irqsave(&pdx->charInLock, flags); /* already at irq level */
pdx->bPipeError[nPipe] = 1; /* Flag an error for later */
} else {
if ((nGot > 1) && ((pdx->pCoherCharIn[0] & 0x7f) == 0x1b)) { /* Esc sequence? */
Handle1401Esc(pdx, &pdx->pCoherCharIn[1], nGot - 1); /* handle it */
- spin_lock(&pdx->charInLock); /* already at irq level */
+ spin_lock_irqsave(&pdx->charInLock, flags); /* already at irq level */
} else {
- spin_lock(&pdx->charInLock); /* already at irq level */
+ spin_lock_irqsave(&pdx->charInLock, flags); /* already at irq level */
if (nGot > 0) {
unsigned int i;
if (nGot < INBUF_SZ) {
@@ -1147,7 +1150,7 @@ static void ced_readchar_callback(struct urb *pUrb)
}
pdx->bReadCharsPending = false; /* No longer have a pending read */
- spin_unlock(&pdx->charInLock); /* already at irq level */
+ spin_unlock_irqrestore(&pdx->charInLock, flags); /* already at irq level */
Allowi(pdx); /* see if we can do the next one */
}
--
1.7.9.5
^ permalink raw reply related
* [PATCH 00/50] USB: cleanup spin_lock in URB->complete()
From: Ming Lei @ 2013-07-11 9:05 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel
Hi,
As we are going to run URB->complete() in tasklet context[1][2], and
hard interrupt may be enabled when running URB completion handler[3],
so we might need to disable interrupt when acquiring one lock in
the completion handler for the below reasons:
- URB->complete() holds a subsystem wide lock which may be acquired
in another hard irq context, and the subsystem wide lock is acquired
by spin_lock()/read_lock()/write_lock() in complete()
- URB->complete() holds a private lock with spin_lock()/read_lock()/write_lock()
but driver may export APIs to make other drivers acquire the same private
lock in its interrupt handler.
For the sake of safety and making the change simple, this patch set
converts all spin_lock()/read_lock()/write_lock() in completion handler
path into their irqsave version mechanically.
But if you are sure the above two cases do not happen in your driver,
please let me know and I can drop the unnecessary change.
Also if you find some conversions are missed, also please let me know so
that I can add it in the next round.
[1], http://marc.info/?l=linux-usb&m=137286322526312&w=2
[2], http://marc.info/?l=linux-usb&m=137286326726326&w=2
[3], http://marc.info/?l=linux-usb&m=137286330626363&w=2
drivers/bluetooth/bfusb.c | 12 ++++----
drivers/bluetooth/btusb.c | 5 ++--
drivers/hid/usbhid/hid-core.c | 5 ++--
drivers/input/misc/cm109.c | 10 ++++---
drivers/isdn/hardware/mISDN/hfcsusb.c | 36 ++++++++++++-----------
drivers/media/dvb-core/dvb_demux.c | 17 +++++++----
drivers/media/usb/cx231xx/cx231xx-audio.c | 6 ++++
drivers/media/usb/cx231xx/cx231xx-core.c | 10 ++++---
drivers/media/usb/cx231xx/cx231xx-vbi.c | 5 ++--
drivers/media/usb/em28xx/em28xx-audio.c | 3 ++
drivers/media/usb/em28xx/em28xx-core.c | 5 ++--
drivers/media/usb/sn9c102/sn9c102_core.c | 7 +++--
drivers/media/usb/tlg2300/pd-alsa.c | 3 ++
drivers/media/usb/tlg2300/pd-video.c | 5 ++--
drivers/media/usb/tm6000/tm6000-video.c | 5 ++--
drivers/net/usb/cdc-phonet.c | 5 ++--
drivers/net/usb/hso.c | 38 ++++++++++++++-----------
drivers/net/usb/kaweth.c | 7 +++--
drivers/net/usb/rtl8150.c | 5 ++--
drivers/net/wireless/ath/ath9k/hif_usb.c | 29 ++++++++++---------
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 9 +++---
drivers/net/wireless/ath/ath9k/wmi.c | 11 +++----
drivers/net/wireless/ath/carl9170/rx.c | 5 ++--
drivers/net/wireless/libertas/if_usb.c | 5 ++--
drivers/net/wireless/libertas_tf/if_usb.c | 6 ++--
drivers/net/wireless/zd1211rw/zd_usb.c | 21 ++++++++------
drivers/staging/bcm/InterfaceRx.c | 5 ++--
drivers/staging/btmtk_usb/btmtk_usb.c | 5 ++--
drivers/staging/ced1401/usb1401.c | 35 ++++++++++++-----------
drivers/staging/vt6656/usbpipe.c | 9 +++---
drivers/usb/class/cdc-wdm.c | 16 +++++++----
drivers/usb/class/usblp.c | 10 ++++---
drivers/usb/core/devio.c | 5 ++--
drivers/usb/misc/adutux.c | 10 ++++---
drivers/usb/misc/iowarrior.c | 5 ++--
drivers/usb/misc/ldusb.c | 7 +++--
drivers/usb/misc/legousbtower.c | 5 ++--
drivers/usb/misc/usbtest.c | 10 ++++---
drivers/usb/misc/uss720.c | 6 +++-
drivers/usb/serial/cyberjack.c | 15 ++++++----
drivers/usb/serial/digi_acceleport.c | 23 ++++++++-------
drivers/usb/serial/io_edgeport.c | 14 +++++----
drivers/usb/serial/io_ti.c | 5 ++--
drivers/usb/serial/mos7720.c | 5 ++--
drivers/usb/serial/mos7840.c | 5 ++--
drivers/usb/serial/quatech2.c | 5 ++--
drivers/usb/serial/sierra.c | 9 +++---
drivers/usb/serial/symbolserial.c | 5 ++--
drivers/usb/serial/ti_usb_3410_5052.c | 9 +++---
drivers/usb/serial/usb_wwan.c | 5 ++--
sound/usb/caiaq/audio.c | 5 ++--
sound/usb/midi.c | 5 ++--
sound/usb/misc/ua101.c | 14 +++++++--
sound/usb/usx2y/usbusx2yaudio.c | 4 +++
54 files changed, 322 insertions(+), 209 deletions(-)
Thanks,
--
Ming Lei
^ permalink raw reply
* [PATCH 23/50] BT: bfusb: read_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:05 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, Marcel Holtmann, Gustavo Padovan, Johan Hedberg
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
read_lock_irqsave().
Cc: Marcel Holtmann <marcel@holtmann.org>
Cc: Gustavo Padovan <gustavo@padovan.org>
Cc: Johan Hedberg <johan.hedberg@gmail.com>
Cc: linux-bluetooth@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/bluetooth/bfusb.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/bluetooth/bfusb.c b/drivers/bluetooth/bfusb.c
index 995aee9..2e93501 100644
--- a/drivers/bluetooth/bfusb.c
+++ b/drivers/bluetooth/bfusb.c
@@ -186,6 +186,7 @@ static void bfusb_tx_complete(struct urb *urb)
{
struct sk_buff *skb = (struct sk_buff *) urb->context;
struct bfusb_data *data = (struct bfusb_data *) skb->dev;
+ unsigned long flags;
BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len);
@@ -199,14 +200,14 @@ static void bfusb_tx_complete(struct urb *urb)
else
data->hdev->stat.err_tx++;
- read_lock(&data->lock);
+ read_lock_irqsave(&data->lock, flags);
skb_unlink(skb, &data->pending_q);
skb_queue_tail(&data->completed_q, skb);
bfusb_tx_wakeup(data);
- read_unlock(&data->lock);
+ read_unlock_irqrestore(&data->lock, flags);
}
@@ -347,10 +348,11 @@ static void bfusb_rx_complete(struct urb *urb)
unsigned char *buf = urb->transfer_buffer;
int count = urb->actual_length;
int err, hdr, len;
+ unsigned long flags;
BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len);
- read_lock(&data->lock);
+ read_lock_irqsave(&data->lock, flags);
if (!test_bit(HCI_RUNNING, &data->hdev->flags))
goto unlock;
@@ -392,7 +394,7 @@ static void bfusb_rx_complete(struct urb *urb)
bfusb_rx_submit(data, urb);
- read_unlock(&data->lock);
+ read_unlock_irqrestore(&data->lock, flags);
return;
@@ -406,7 +408,7 @@ resubmit:
}
unlock:
- read_unlock(&data->lock);
+ read_unlock_irqrestore(&data->lock, flags);
}
static int bfusb_open(struct hci_dev *hdev)
--
1.7.9.5
^ permalink raw reply related
* [PATCH 33/50] wireless: libertas: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:05 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, John W. Linville, libertas-dev
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: "John W. Linville" <linville@tuxdriver.com>
Cc: libertas-dev@lists.infradead.org
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/net/wireless/libertas/if_usb.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 2798077..f6a8396 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -626,6 +626,7 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
struct lbs_private *priv)
{
u8 i;
+ unsigned long flags;
if (recvlength > LBS_CMD_BUFFER_SIZE) {
lbs_deb_usbd(&cardp->udev->dev,
@@ -636,7 +637,7 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
BUG_ON(!in_interrupt());
- spin_lock(&priv->driver_lock);
+ spin_lock_irqsave(&priv->driver_lock, flags);
i = (priv->resp_idx == 0) ? 1 : 0;
BUG_ON(priv->resp_len[i]);
@@ -646,7 +647,7 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
kfree_skb(skb);
lbs_notify_command_response(priv, i);
- spin_unlock(&priv->driver_lock);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
lbs_deb_usbd(&cardp->udev->dev,
"Wake up main thread to handle cmd response\n");
--
1.7.9.5
^ permalink raw reply related
* [PATCH 50/50] staging: vt6656: spin_lock in complete() cleanup
From: Ming Lei @ 2013-07-11 9:06 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Oliver Neukum, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Ming Lei, devel
In-Reply-To: <1373533573-12272-1-git-send-email-ming.lei@canonical.com>
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
Cc: devel@driverdev.osuosl.org
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
drivers/staging/vt6656/usbpipe.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/vt6656/usbpipe.c b/drivers/staging/vt6656/usbpipe.c
index 098be60..0282f2e 100644
--- a/drivers/staging/vt6656/usbpipe.c
+++ b/drivers/staging/vt6656/usbpipe.c
@@ -485,6 +485,7 @@ static void s_nsBulkInUsbIoCompleteRead(struct urb *urb)
int bIndicateReceive = false;
int bReAllocSkb = false;
int status;
+ unsigned long flags;
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsBulkInUsbIoCompleteRead\n");
status = urb->status;
@@ -515,18 +516,18 @@ static void s_nsBulkInUsbIoCompleteRead(struct urb *urb)
STAvUpdateUSBCounter(&pDevice->scStatistic.USB_BulkInStat, status);
if (bIndicateReceive) {
- spin_lock(&pDevice->lock);
+ spin_lock_irqsave(&pDevice->lock, flags);
if (RXbBulkInProcessData(pDevice, pRCB, bytesRead) == true)
bReAllocSkb = true;
- spin_unlock(&pDevice->lock);
+ spin_unlock_irqrestore(&pDevice->lock, flags);
}
pRCB->Ref--;
if (pRCB->Ref == 0)
{
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeNormal %d \n",pDevice->NumRecvFreeList);
- spin_lock(&pDevice->lock);
+ spin_lock_irqsave(&pDevice->lock, flags);
RXvFreeRCB(pRCB, bReAllocSkb);
- spin_unlock(&pDevice->lock);
+ spin_unlock_irqrestore(&pDevice->lock, flags);
}
return;
--
1.7.9.5
^ permalink raw reply related
* Re: Logitech M705: Thumb button (was Re: [PATCH v4] HID: Add full support for Logitech Unifying receivers)
From: Benjamin Tissoires @ 2013-07-11 10:29 UTC (permalink / raw)
To: Jiri Kosina
Cc: Nestor Lopez Casado, Markus Trippelsdorf, Dmitry Torokhov,
Richard Titmuss, Olivier Gay, open list:HID CORE LAYER,
linux-kernel@vger.kernel.org, František Fuka
In-Reply-To: <alpine.LNX.2.00.1307092236140.26857@pobox.suse.cz>
On Tue, Jul 9, 2013 at 10:41 PM, Jiri Kosina <jkosina@suse.cz> wrote:
> On Tue, 9 Jul 2013, Benjamin Tissoires wrote:
>
>> For those who wants to try, I have set up a project [1] to implement
>> part of the spec Nestor released. I implemented various features: list
>> devices paired to a receiver, pair/unpair a device, and toggle the
>> button 6 on M705 mouse with the faulty firmware. When switching mode for
>> the M705, as Nestor said, we lose the AC panning ability until the
>> correct remapping is done in the kernel.
>>
>> Cheers,
>> Benjamin
>>
>> [1] https://github.com/bentiss/uLogitech
>
> Thanks for your work on this, Benjamin.
>
> I have a followup question -- why not do this in the kernel completely
> though? I have actually been asked by Linus directly (so we'd rather do
> that :) ) to include pairing trigger as a sysfs toggle instead of having
> to use userspace utilitites, and it actually makes sense to me.
yep, the sysfs toggle for the pairing makes sense. In the same way, we
should retrieve the actual name of the device instead of building a
complex string "Logitech Unifying Device. Wireless PID:XXXX"...
And for the M705, it really should be implemented in the kernel (I
guess it will not be a lot of effort).
>
> Are you aware of any particular reason to not have all that's provided by
> uLogitech in the kernel?
I'm afraid the very first reason is that we (Nestor or myself) don't
have much allowed time to implement it properly in the kernel... :(
Nestor is working on other projects, and for me, I did not had any
customer requests for it in RHEL nor Fedora.
Cheers,
Benjamin
^ permalink raw reply
* Re: [PATCH 10/53] Input: atmel_mxt_ts - Add memory access interface via sysfs
From: Mark Brown @ 2013-07-11 10:30 UTC (permalink / raw)
To: Nick Dyer
Cc: Dmitry Torokhov, Daniel Kurtz, Henrik Rydberg, Joonyoung Shim,
Alan.Bowens, linux-input, linux-kernel, pmeerw, bleung, olofj
In-Reply-To: <51DE61B5.1000600@itdev.co.uk>
[-- Attachment #1: Type: text/plain, Size: 1508 bytes --]
On Thu, Jul 11, 2013 at 08:41:41AM +0100, Nick Dyer wrote:
> Mark Brown wrote:
> > On Fri, Jun 21, 2013 at 09:16:16AM -0700, Nick Dyer wrote:
> >> For some operations it does. For example updating the whole chip config
> >> (which is a common thing to want to do), it would turn a couple of write
> >> operations into ~20 on recent chips.
> > Is that really happening on peformance critical paths other than initial
> > power up (which could be handled more neatly anyway).
> Well, you're right that we could probably add more API for performance
> critical stuff. But that wasn't your original question.
You probably don't need another API here - for example, if the driver
understands that the device is powered off and knows enugh about what
the device is doing to understand that it doesn't need to be running
then it could for example cache what is being written then flush in a
more optimal fashion.
> > If absoluely nobody has used the separate wakeup pin then the hardware
> > designers are wasting a pin there... my point isn't that nobody would
> > use the reference design it's that some boards will have the separate
> > signal.
> That's entirely hypothetical, and you're wasting our time until you can
> actually point to such hardware, happy to write patches to support that
> mode of operation as well if you do.
See above - it's not just about the possibility that someone might have
done a better job with the hardware design, better power management is
just a good idea in general.
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply
* Re: [PATCH 05/50] USB: misc: uss720: spin_lock in complete() cleanup
From: Sergei Shtylyov @ 2013-07-11 12:15 UTC (permalink / raw)
To: Ming Lei
Cc: Greg Kroah-Hartman, linux-usb-u79uwXL29TY76Z2rM5mHXA,
Oliver Neukum, Alan Stern, linux-input-u79uwXL29TY76Z2rM5mHXA,
linux-bluetooth-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA,
linux-wireless-u79uwXL29TY76Z2rM5mHXA,
linux-media-u79uwXL29TY76Z2rM5mHXA,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
In-Reply-To: <1373533573-12272-6-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
Hello.
On 11-07-2013 13:05, Ming Lei wrote:
> Complete() will be run with interrupt enabled, so change to
> spin_lock_irqsave().
> Signed-off-by: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
> ---
> drivers/usb/misc/uss720.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
> diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c
> index e129cf6..f7d15e8 100644
> --- a/drivers/usb/misc/uss720.c
> +++ b/drivers/usb/misc/uss720.c
> @@ -121,6 +121,7 @@ static void async_complete(struct urb *urb)
> dev_err(&urb->dev->dev, "async_complete: urb error %d\n",
> status);
> } else if (rq->dr.bRequest == 3) {
> + unsigned long flags;
Empty line wouldn't hurt here, after declaration.
> memcpy(priv->reg, rq->reg, sizeof(priv->reg));
WBR, Sergei
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 08/50] USB: legousbtower: spin_lock in complete() cleanup
From: Sergei Shtylyov @ 2013-07-11 12:18 UTC (permalink / raw)
To: Ming Lei
Cc: Greg Kroah-Hartman, linux-usb-u79uwXL29TY76Z2rM5mHXA,
Oliver Neukum, Alan Stern, linux-input-u79uwXL29TY76Z2rM5mHXA,
linux-bluetooth-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA,
linux-wireless-u79uwXL29TY76Z2rM5mHXA,
linux-media-u79uwXL29TY76Z2rM5mHXA,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw, Juergen Stuber
In-Reply-To: <1373533573-12272-9-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
Hello.
On 11-07-2013 13:05, Ming Lei wrote:
> Complete() will be run with interrupt enabled, so change to
> spin_lock_irqsave().
> Cc: Juergen Stuber <starblue-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
> Signed-off-by: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
> ---
> drivers/usb/misc/legousbtower.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
> diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c
> index 8089479..4044989 100644
> --- a/drivers/usb/misc/legousbtower.c
> +++ b/drivers/usb/misc/legousbtower.c
> @@ -771,6 +771,7 @@ static void tower_interrupt_in_callback (struct urb *urb)
> struct lego_usb_tower *dev = urb->context;
> int status = urb->status;
> int retval;
> + unsigned long flags;
>
> dbg(4, "%s: enter, status %d", __func__, status);
>
> @@ -788,7 +789,7 @@ static void tower_interrupt_in_callback (struct urb *urb)
> }
>
> if (urb->actual_length > 0) {
> - spin_lock (&dev->read_buffer_lock);
> + spin_lock_irqsave (&dev->read_buffer_lock, flags);
> if (dev->read_buffer_length + urb->actual_length < read_buffer_size) {
> memcpy (dev->read_buffer + dev->read_buffer_length,
> dev->interrupt_in_buffer,
> @@ -799,7 +800,7 @@ static void tower_interrupt_in_callback (struct urb *urb)
> } else {
> printk(KERN_WARNING "%s: read_buffer overflow, %d bytes dropped", __func__, urb->actual_length);
> }
> - spin_unlock (&dev->read_buffer_lock);
> + spin_unlock_irqrestore (&dev->read_buffer_lock, flags);
> }
I don't think this patch passes checkpatch.pl.
WBR, Sergei
^ permalink raw reply
* Re: [PATCH 08/50] USB: legousbtower: spin_lock in complete() cleanup
From: Oliver Neukum @ 2013-07-11 12:36 UTC (permalink / raw)
To: Sergei Shtylyov
Cc: Ming Lei, Greg Kroah-Hartman, linux-usb, Alan Stern, linux-input,
linux-bluetooth, netdev, linux-wireless, linux-media, alsa-devel,
Juergen Stuber
In-Reply-To: <51DEA289.5050509@cogentembedded.com>
On Thursday 11 July 2013 16:18:17 Sergei Shtylyov wrote:
> I don't think this patch passes checkpatch.pl.
This series is a mechanical replacement in dozens of drivers.
We cannot demand nice formatting. If you want to do something
productive, check the locking in the driver.
Regards
Oliver
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox