* [PATCH] [ISDN] Fix random hard freeze with AVM c4 card
@ 2007-10-17 11:07 Karsten Keil
2007-10-17 21:25 ` Andrew Morton
0 siblings, 1 reply; 2+ messages in thread
From: Karsten Keil @ 2007-10-17 11:07 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Andrew Morton, linux-kernel, isdn4linux
The patch
- Includes the call to capilib_data_b3_req in the spinlock. This routine
in turn calls the offending mq_enqueue routine that triggered the
freeze if not locked. This should also fix other indicators of
incosistent capilib_msgidqueue list, that trigger messages like:
Oct 5 03:05:57 BERL0 kernel: kcapi: msgid 3019 ncci 0x30301 not on queue
that we saw several times a day (usually several in a row).
- Fixes all occurrences of c4_dispatch_tx to be called with active
spinlock, there were some instances where no lock was active. Mostly
these are in very infrequently called routines, so the additional
performance penalty is minimal.
Signed-off-by: Karsten Keil <kkeil@suse.de>
Signed-off-by: Rainer Brestan <rainer.brestan@frequentis.com>
Signed-off-by: Ralf Schlatterbeck <rsc@runtux.com>
---
drivers/isdn/hardware/avm/c4.c | 16 ++++++++++++----
1 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c
index d58f927..4c6ef91 100644
--- a/drivers/isdn/hardware/avm/c4.c
+++ b/drivers/isdn/hardware/avm/c4.c
@@ -727,6 +727,7 @@ static void c4_send_init(avmcard *card)
{
struct sk_buff *skb;
void *p;
+ unsigned long flags;
skb = alloc_skb(15, GFP_ATOMIC);
if (!skb) {
@@ -744,12 +745,15 @@ static void c4_send_init(avmcard *card)
skb_put(skb, (u8 *)p - (u8 *)skb->data);
skb_queue_tail(&card->dma->send_queue, skb);
+ spin_lock_irqsave(&card->lock, flags);
c4_dispatch_tx(card);
+ spin_unlock_irqrestore(&card->lock, flags);
}
static int queue_sendconfigword(avmcard *card, u32 val)
{
struct sk_buff *skb;
+ unsigned long flags;
void *p;
skb = alloc_skb(3+4, GFP_ATOMIC);
@@ -766,7 +770,9 @@ static int queue_sendconfigword(avmcard *card, u32 val)
skb_put(skb, (u8 *)p - (u8 *)skb->data);
skb_queue_tail(&card->dma->send_queue, skb);
+ spin_lock_irqsave(&card->lock, flags);
c4_dispatch_tx(card);
+ spin_unlock_irqrestore(&card->lock, flags);
return 0;
}
@@ -986,7 +992,9 @@ static void c4_release_appl(struct capi_ctr *ctrl, u16 appl)
struct sk_buff *skb;
void *p;
+ spin_lock_irqsave(&card->lock, flags);
capilib_release_appl(&cinfo->ncci_head, appl);
+ spin_unlock_irqrestore(&card->lock, flags);
if (ctrl->cnr == card->cardnr) {
skb = alloc_skb(7, GFP_ATOMIC);
@@ -1018,8 +1026,9 @@ static u16 c4_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
avmcard *card = cinfo->card;
u16 retval = CAPI_NOERROR;
unsigned long flags;
-
- if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {
+
+ spin_lock_irqsave(&card->lock, flags);
+ if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {
retval = capilib_data_b3_req(&cinfo->ncci_head,
CAPIMSG_APPID(skb->data),
CAPIMSG_NCCI(skb->data),
@@ -1027,10 +1036,9 @@ static u16 c4_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
}
if (retval == CAPI_NOERROR) {
skb_queue_tail(&card->dma->send_queue, skb);
- spin_lock_irqsave(&card->lock, flags);
c4_dispatch_tx(card);
- spin_unlock_irqrestore(&card->lock, flags);
}
+ spin_unlock_irqrestore(&card->lock, flags);
return retval;
}
--
Karsten Keil
SuSE Labs
ISDN and VOIP development
SUSE LINUX Products GmbH, Maxfeldstr.5 90409 Nuernberg, GF: Markus Rex, HRB 16746 (AG Nuernberg)
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] [ISDN] Fix random hard freeze with AVM c4 card
2007-10-17 11:07 [PATCH] [ISDN] Fix random hard freeze with AVM c4 card Karsten Keil
@ 2007-10-17 21:25 ` Andrew Morton
0 siblings, 0 replies; 2+ messages in thread
From: Andrew Morton @ 2007-10-17 21:25 UTC (permalink / raw)
To: Karsten Keil; +Cc: torvalds, linux-kernel, isdn4linux, stable
On Wed, 17 Oct 2007 13:07:44 +0200
Karsten Keil <kkeil@suse.de> wrote:
> The patch
> - Includes the call to capilib_data_b3_req in the spinlock. This routine
> in turn calls the offending mq_enqueue routine that triggered the
> freeze if not locked. This should also fix other indicators of
> incosistent capilib_msgidqueue list, that trigger messages like:
> Oct 5 03:05:57 BERL0 kernel: kcapi: msgid 3019 ncci 0x30301 not on queue
> that we saw several times a day (usually several in a row).
> - Fixes all occurrences of c4_dispatch_tx to be called with active
> spinlock, there were some instances where no lock was active. Mostly
> these are in very infrequently called routines, so the additional
> performance penalty is minimal.
I've tagged this patch and "[ISDN] fix random freezes with AVM B1 drivers"
as suitable for backporting into 2.6.23.x. Please let me know if that was
not appropriate.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-10-17 21:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-17 11:07 [PATCH] [ISDN] Fix random hard freeze with AVM c4 card Karsten Keil
2007-10-17 21:25 ` Andrew Morton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox