NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/52462: aac driver (and possibly others) needs MPification



The following reply was made to PR kern/52462; it has been noted by GNATS.

From: Havard Eidnes <he%NetBSD.org@localhost>
To: gnats-bugs%NetBSD.org@localhost, mlelstv%serpens.de@localhost
Cc: netbsd-bugs%netbsd.org@localhost
Subject: Re: kern/52462: aac driver (and possibly others) needs MPification
Date: Sat, 05 Aug 2017 13:50:58 +0200 (CEST)

 >  These are the drivers behind ld(4):
 
 Thanks for the inspection of the drivers.
 
 >  But if that's everything, then wrapping the aac driver entry
 >  with kernel lock should have been sufficient.
 
 Well, it provably wasn't sufficient to do
 
 RCS file: /cvsroot/src/sys/dev/ic/ld_aac.c,v
 retrieving revision 1.30
 diff -p -u -r1.30 ld_aac.c
 --- ld_aac.c    27 Sep 2016 03:33:32 -0000      1.30
 +++ ld_aac.c    3 Aug 2017 14:20:19 -0000
 @@ -314,9 +314,14 @@ ld_aac_dobio(struct ld_aac_softc *sc, vo
  static int
  ld_aac_start(struct ld_softc *ld, struct buf *bp)
  {
 +       int rc;
  =
 
 -       return (ld_aac_dobio((struct ld_aac_softc *)ld, bp->b_data,
 -           bp->b_bcount, bp->b_rawblkno, (bp->b_flags & B_READ) =3D=3D=
  0, bp));
 +       KERNEL_LOCK(1, curlwp);
 +       rc =3D ld_aac_dobio((struct ld_aac_softc *)ld, bp->b_data,
 +           bp->b_bcount, bp->b_rawblkno, (bp->b_flags & B_READ) =3D=3D=
  0, bp);
 +       KERNEL_UNLOCK_ONE(curlwp);
 +
 +       return rc;
  }
  =
 
  static void
 
 as you provided privately.  What then happens is that the kernel
 goes into inactivity when the user-land startup tries to start
 BIND, and when I break into DDB I repeatedly get this as the
 traceback:
 
 db{0}> trace
 breakpoint() at netbsd:breakpoint+0x5
 comintr() at netbsd:comintr+0x59a
 Xintr_ioapic_edge8() at netbsd:Xintr_ioapic_edge8+0xee
 --- interrupt ---
 x86_pause() at netbsd:x86_pause
 lddone() at netbsd:lddone+0x1e
 aac_new_intr() at netbsd:aac_new_intr+0xed
 intr_biglock_wrapper() at netbsd:intr_biglock_wrapper+0x1d
 Xintr_ioapic_level1() at netbsd:Xintr_ioapic_level1+0xf2
 --- interrupt ---
 x86_stihlt() at netbsd:x86_stihlt+0x6
 acpicpu_cstate_idle_enter() at netbsd:acpicpu_cstate_idle_enter+0xdb
 acpicpu_cstate_idle() at netbsd:acpicpu_cstate_idle+0xb6
 idle_loop() at netbsd:idle_loop+0x18c
 db{0}> c
 
 ...
 
 db{0}> tra =
 
 breakpoint() at netbsd:breakpoint+0x5
 comintr() at netbsd:comintr+0x59a
 Xintr_ioapic_edge8() at netbsd:Xintr_ioapic_edge8+0xee
 --- interrupt ---
 x86_pause() at netbsd:x86_pause+0x2
 lddone() at netbsd:lddone+0x1e
 aac_new_intr() at netbsd:aac_new_intr+0xed
 intr_biglock_wrapper() at netbsd:intr_biglock_wrapper+0x1d
 Xintr_ioapic_level1() at netbsd:Xintr_ioapic_level1+0xf2
 --- interrupt ---
 x86_stihlt() at netbsd:x86_stihlt+0x6
 acpicpu_cstate_idle_enter() at netbsd:acpicpu_cstate_idle_enter+0xdb
 acpicpu_cstate_idle() at netbsd:acpicpu_cstate_idle+0xb6
 idle_loop() at netbsd:idle_loop+0x18c
 db{0}> call cpu_reset
 
 and no further progress was apparently being made.
 
 Regards,
 
 - H=E5vard
 


Home | Main Index | Thread Index | Old Index