Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jan 2010 12:51:29 -0800
From:      Randall Stewart <rrs@lakerest.net>
To:        Neelkanth Natu <neelnatu@yahoo.com>
Cc:        freebsd-mips@freebsd.org
Subject:   Re: AR71XX RTC
Message-ID:  <5D3E417C-FE51-49A7-B8CC-564932BF0D3E@lakerest.net>
In-Reply-To: <832529.2466.qm@web34404.mail.mud.yahoo.com>
References:  <832529.2466.qm@web34404.mail.mud.yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Neil:

Thanks for the patch.. it does look good since the old
code was tromping part of the old threads PCB which is
definitely not right ;-0 .. I do have a question for you..
forgive my ignorance..

What exactly are we trying to switch here. It seems
that cpu_switch(...) is now being called with
oldtd, newtd and mtx...

I see that the thread structure has a struct mutex *td_lock as
its first member. But what is this supposed to be pointing to?
And when we switch are we trying to take the

oldtd->td_lock and place it into the newtd->td_lock

Or?

What... I guess I just don't have any context for whats going on..

R



On Jan 25, 2010, at 12:41 PM, Neelkanth Natu wrote:

> Hi Warner,
>
> The patch looks good. Please commit it.
>
> The reason we started seeing this recently is because of this:
> http://svn.freebsd.org/viewvc/base/head/sys/kern/sched_4bsd.c?r1=202889&r2=202888&pathrev=202889
>
> In particular the call to thread_block_lock() will point 'td_lock' to
> 'blocked_lock' and if we don't switch it back in cpu_switch() then
> anybody trying to call thread_lock() on the thread will panic.
>
> best
> Neel
>
> --- On Mon, 1/25/10, M. Warner Losh <imp@bsdimp.com> wrote:
>
>> From: M. Warner Losh <imp@bsdimp.com>
>> Subject: Re: AR71XX RTC
>> To: neelnatu@yahoo.com
>> Cc: gonzo@bluezbox.com, smeagle@bsdler.de, freebsd-mips@FreeBSD.org
>> Date: Monday, January 25, 2010, 8:31 AM
>> In message: <434364.57659.qm@web34405.mail.mud.yahoo.com>
>>            Neelkanth Natu
>> <neelnatu@yahoo.com>
>> writes:
>> : Hi Flo,
>> :
>> : Can you try the following patch and see if it helps with
>> the
>> : hang-followed-by-trap problem?
>> :
>> : I am seeing a similar problem on the Sibyte and this
>> patch gets me
>> : past it.
>> :
>> : best
>> : Neel
>> :
>> : Index: swtch.S
>> :
>> ===================================================================
>> : --- swtch.S    (revision 202961)
>> : +++ swtch.S    (working copy)
>> : @@ -323,7 +323,7 @@
>> :       * to be saved with
>> the other registers do so here.
>> :       */
>> :
>> : -    sw    a3,
>> TD_LOCK(a0)
>>    # Switchout td_lock
>> : +    sw    a2,
>> TD_LOCK(a3)
>>    # Switchout td_lock
>> :
>> :  mips_sw1:
>> :  #if defined(SMP) && defined(SCHED_ULE)
>>
>> I really like this patch.  For the OCTEON I went from
>> having all kinds
>> of head-scratcher problems on boot that I was about to look
>> at
>> instruction traces in the simulator to try to track down to
>> an
>> immediate mountroot> prompt.  So after reading the
>> code, my first
>> reaction is "how the heck did the old code work as well as
>> it did?"
>> and my second reaction is "This is obviously the right fix
>> since a3 is
>> a saved copy of a0, and a0 points to the pcb at this point,
>> not the
>> old thread."
>>
>> I've touched up the comments a bit.  Maybe the
>> register assignments is
>> a bit of overkill, but this is a complicated function
>> that's very
>> tricky.  What do you think of this patch:
>>
>> Index: sys/mips/mips/swtch.S
>> ===================================================================
>> --- sys/mips/mips/swtch.S    (revision
>> 202867)
>> +++ sys/mips/mips/swtch.S    (working copy)
>> @@ -282,9 +282,10 @@
>> END(mips_cpu_throw)
>>
>> /*
>> - *XXX Fixme:    should be written to new
>> interface that requires lock
>> - *        storage.  We
>> fake it for now.
>> - * cpu_switch(struct thread *old, struct thread *new);
>> + * cpu_switch(struct thread *old, struct thread *new,
>> struct mutex *mtx);
>> + *    a0 - old
>> + *    a1 - new
>> + *    a2 - mtx
>>  * Find the highest priority process and resume it.
>>  */
>> NON_LEAF(cpu_switch, STAND_FRAME_SIZE, ra)
>> @@ -323,7 +324,7 @@
>>      * to be saved with the other
>> registers do so here.
>>      */
>>
>> -    sw    a3,
>> TD_LOCK(a0)
>>    # Switchout td_lock
>> +    sw    a2,
>> TD_LOCK(a3)
>>    # Switchout td_lock
>>
>> mips_sw1:
>> #if defined(SMP) && defined(SCHED_ULE)
>>
>>
>> Thanks for saving me hours of debugging. :)
>>
>> Warner
>>
>>
>> : --- On Sun, 1/24/10, Florian Kruegl <smeagle@bsdler.de>
>> wrote:
>> :
>> : > From: Florian Kruegl <smeagle@bsdler.de>
>> : > Subject: Re: AR71XX RTC
>> : > To: "Oleksandr Tymoshenko" <gonzo@bluezbox.com>
>> : > Cc: freebsd-mips@freebsd.org
>> : > Date: Sunday, January 24, 2010, 8:52 AM
>> : > Hi,
>> : >
>> : > On Sun, 2010-01-24 at 02:41 +0100, Florian Kruegl
>> wrote:
>> : > > On Sat, 2010-01-23 at 16:53 -0800, Oleksandr
>> : > Tymoshenko wrote:
>> : > > > On 2010-01-23, at 4:44 PM, Florian Kruegl
>> wrote:
>> : > > >
>> : > > > > Hi,
>> : > > > >
>> : > > > > On Sat, 2010-01-23 at 16:21 -0800,
>> Oleksandr
>> : > Tymoshenko wrote:
>> : > > > >> On 2010-01-23, at 4:00 PM,
>> Florian
>> : > Kruegl wrote:
>> : > > > >>
>> : > > > >>> Hi,
>> : > > > >>>
>> : > > > >>> anyone working on pfc2123
>> driver for
>> : > RouterStation Pro?
>> : > > > >>> Seems quite well documented,
>> one
>> : > issue might be CS hack, but the rest
>> : > > > >>> should be straight.
>> : > > > >>    Driver was commited
>> : > yesterday:
>> : > > > >> http://svn.freebsd.org/viewvc/base?view=revision&revision=202839
>> : > > > >>
>> : > > > >> And yes, CS hack is the problem.
>> I'm
>> : > trying to figure out how to fit it into FreeBSD
>> : > > > >> SPI framework.
>> : > > > >
>> : > > > > sounds good, will do an update as
>> soon as i
>> : > removed me work from code.
>> : > > > > My CS "solution" was more than crude,
>> but
>> : > the frames simply didn't
>> : > > > > fit... so I am looking forward for a
>> : > different one :)
>> : > > >
>> : > > >     Yeah, my CS solution was
>> : > dirty hack too. If for "didn't fit" you mean missing
>> last
>> : > > > byte of frame then this problem was solved
>> to.
>> : > Bug was in AR71XX SPI code: falling
>> : > > > edge was not provided for last byte in
>> transfer
>> : > in time and RTC chip acts of falling edge.
>> : > > > Fix was committed before driver.
>> : > > >
>> : > > >
>> : > > >
>> : > >
>> : > > code looks similar, can't tell much about
>> result as
>> : > kernel hangs for a
>> : > > while before getting this:
>> : > >
>> : >
>> <<<<<<<<<<<<<<<<<<<<<<<<<<<
>> : > schnipp
>> : >
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>> : > > Trap cause = 2 (TLB miss (load or instr. fetch)
>> -
>> : > kernel mode)
>> : > > [thread pid 4 tid 100009 ]
>> : > > Stopped at
>> : > _thread_lock_flags+0x150:
>> : >    lw      v0,60(a3)
>> : > > db> bt
>> : > > Tracing pid 4 tid 100009 td 0xc0c47270
>> : > > db_trace_thread+30 (?,?,?,?) ra 800a6c10 sz 24
>> : > > 800a6af4+11c (0,?,ffffffff,?) ra 800a6604 sz
>> 32
>> : > > 800a6270+394 (?,?,?,?) ra 800a6794 sz 168
>> : > > db_command_loop+78 (?,?,?,?) ra 800a8e68 sz 24
>> : > > 800a8d60+108 (?,?,?,?) ra 80215ff8 sz 424
>> : > > kdb_trap+f8 (?,?,?,?) ra 80474350 sz 32
>> : > > trap+134c (?,?,?,?) ra 8046b7fc sz 176
>> : > > MipsKernGenException+100
>> (b,173,804d5de8,deadc0d8) ra
>> : > 801c593c sz 200
>> : > > _thread_lock_flags+130 (?,?,?,?) ra 80221f18 sz
>> 56
>> : > > sleepq_broadcast+ac (?,?,?,?) ra 801e5f20 sz
>> 40
>> : > > wakeup+2c (?,?,?,?) ra 8016de18 sz 32
>> : > > g_io_deliver+198 (?,?,?,?) ra 8016bbd4 sz 80
>> : > > 8016b590+644 (?,?,?,?) ra 8016e184 sz 104
>> : > > g_io_schedule_down+2ec (?,?,?,?) ra 8016eb94 sz
>> 64
>> : > > 8016eb18+7c (?,?,?,?) ra 801a331c sz 24
>> : > > fork_exit+a0 (?,?,?,?) ra 80478f10 sz 48
>> : > > fork_trampoline+10 (?,?,?,?) ra 0 sz 0
>> : > > pid 4
>> : > >
>> : >
>> <<<<<<<<<<<<<<<<<<<<<<<<<<<
>> : > schnapp
>> : >
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>> : > >
>> : > > will use AR71XX as config file tomorrow, mine
>> has many
>> : > additional devs
>> : > > configured for booting from usb devices.
>> : > >
>> : > [...]
>> : >
>> : > seems to make no difference. removed all mini pci
>> : > devs  and most code
>> : > changes. kernel hangs during bootup for a while.
>> then gets
>> : > a trap.
>> : >
>> : > Source Info:
>> : >
>> : > -------------------------- schnipp
>> : > --------------------------
>> : > brain:head> svn info
>> : > Path: .
>> : > URL: svn://svn.freebsd.org/base/head
>> : > Repository Root: svn://svn.freebsd.org/base
>> : > Repository UUID:
>> ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
>> : > Revision: 202904
>> : > Node Kind: directory
>> : > Schedule: normal
>> : > Last Changed Author: marcel
>> : > Last Changed Rev: 202904
>> : > Last Changed Date: 2010-01-24 00:16:50 +0100 (Sun,
>> 24 Jan
>> : > 2010)
>> : > -------------------------- schnapp
>> : > --------------------------
>> : >
>> : > -------------------------- schnipp
>> : > --------------------------
>> : > brain:head> svn stat
>> : > ?       GRTAGS
>> : > ?       GSYMS
>> : > ?       GTAGS
>> : > ?       GPATH
>> : > M       sys/kern/vfs_mount.c
>> : > M       sys/mips/conf/AR71XX
>> : > ?       sys/dev/pfc2123
>> : > -------------------------- schnapp
>> : > --------------------------
>> : >
>> : > - vfs_mount should be far away.
>> : > - sys/dev/pfc2123 is no longer used.
>> : > - sys/mips/conf/AR71XX altered to include
>> pfc2123_rtc
>> : >
>> : >
>> : > -------------------------- schnipp
>> : > --------------------------
>> : > FreeBSD 9.0-CURRENT #1: Sun Jan 24 15:58:37 UTC
>> 2010
>> : >
>> : > root@pinky.lan.terror.local:/home/smeagle/obj/mips/mips/home/ 
>> smeagle/src/freebsd/head/sys/AR71XX
>> : > mips
>> : > real memory  = 134217728 (131072K bytes)
>> : > avail memory = 125689856 (119MB)
>> : > nexus0: <MIPS32 root nexus>
>> : > clock0: <Generic MIPS32 ticker> on nexus0
>> : > clock0: [FILTER]
>> : > apb0 at irq 4 on nexus0
>> : > apb0: [FILTER]
>> : > uart0: <16550 or compatible> on apb0
>> : > uart0: [FILTER]
>> : > uart0: console (115200,n,8,1)
>> : > pcib0 at irq 0 on nexus0
>> : > pcib0: [FILTER]
>> : > pci0: <PCI bus> on pcib0
>> : > pci0: <old, non-VGA display device> at device
>> 0.0 (no
>> : > driver attached)
>> : > pci0: <processor> at device 17.0 (no driver
>> : > attached)
>> : > arge0: <Atheros AR71xx built-in ethernet
>> interface>
>> : > at mem
>> : > 0x19000000-0x19000fff irq 2 on nexus0
>> : > miibus0: <MII bus> on arge0
>> : > ukphy0: <Generic IEEE 802.3u media interface>
>> PHY 4
>> : > on miibus0
>> : > ukphy0:  10baseT, 10baseT-FDX, 100baseTX,
>> : > 100baseTX-FDX, 1000baseT-FDX,
>> : > auto
>> : > arge0: Ethernet address: 00:00:00:00:46:61
>> : > arge0: [FILTER+ITHREAD]
>> : > arge1: <Atheros AR71xx built-in ethernet
>> interface>
>> : > at mem
>> : > 0x1a000000-0x1a000fff irq 3 on nexus0
>> : > arge1: Ethernet address: 00:00:00:00:46:62
>> : > arge1: [FILTER+ITHREAD]
>> : > spi0: <AR71XX SPI> at mem
>> 0x1f000000-0x1f00000f on
>> : > nexus0
>> : > spibus0: <spibus bus> on spi0
>> : > mx25l0: <M25Pxx Flash Family> at cs 0 on
>> spibus0
>> : > mx25l0: mx25ll128, sector 65536 bytes, 256 sectors
>> : > ar71xx_wdog0: <Atheros AR71XX watchdog timer>
>> on
>> : > nexus0
>> : > Timecounter "MIPS32" frequency 360000000 Hz quality
>> 800
>> : > Timecounters tick every 1.000 msec
>> : > bootpc_init: wired to interface 'arge0'
>> : > Sending DHCP Discover packet from interface arge0
>> : > (00:00:00:00:46:61)
>> : > arge0: link state changed to DOWN
>> : > Trap cause = 2 (TLB miss (load or instr. fetch) -
>> kernel
>> : > mode)
>> : > [thread pid 4 tid 100008 ]
>> : > Stopped at
>> : > _thread_lock_flags+0x150:
>> : >    lw      v0,60(a3)
>> : > db> bt
>> : > Tracing pid 4 tid 100008 td 0xc0c414e0
>> : > db_trace_thread+30 (?,?,?,?) ra 80055900 sz 24
>> : > 800557e4+11c (0,?,ffffffff,?) ra 800552f4 sz 32
>> : > 80054f60+394 (?,?,?,?) ra 80055484 sz 168
>> : > db_command_loop+78 (?,?,?,?) ra 80057b58 sz 24
>> : > 80057a50+108 (?,?,?,?) ra 8017b7d8 sz 424
>> : > kdb_trap+f8 (?,?,?,?) ra 8035ab40 sz 32
>> : > trap+134c (?,?,?,?) ra 80351fec sz 176
>> : > MipsKernGenException+100 (b,173,8039ce74,deadc0d8)
>> ra
>> : > 8012c92c sz 200
>> : > _thread_lock_flags+130 (?,?,?,?) ra 801876f8 sz 56
>> : > sleepq_broadcast+ac (?,?,?,?) ra 8014b700 sz 40
>> : > wakeup+2c (?,?,?,?) ra 800d6ba8 sz 32
>> : > g_io_deliver+198 (?,?,?,?) ra 800d4964 sz 80
>> : > 800d4320+644 (?,?,?,?) ra 800d6f14 sz 104
>> : > g_io_schedule_down+2ec (?,?,?,?) ra 800d7924 sz 64
>> : > 800d78a8+7c (?,?,?,?) ra 8010c0ac sz 24
>> : > fork_exit+a0 (?,?,?,?) ra 8035f700 sz 48
>> : > fork_trampoline+10 (?,?,?,?) ra 0 sz 0
>> : > pid 4
>> : > -------------------------- schnapp
>> : > --------------------------
>> : >
>> : >
>> : >
>> : >
>> : > Flo
>> : >
>> : > _______________________________________________
>> : > freebsd-mips@freebsd.org
>> : > mailing list
>> : > http://lists.freebsd.org/mailman/listinfo/freebsd-mips
>> : > To unsubscribe, send any mail to "freebsd-mips-unsubscribe@freebsd.org 
>> "
>> : >
>> :
>> :
>> :
>> : _______________________________________________
>> : freebsd-mips@freebsd.org
>> mailing list
>> : http://lists.freebsd.org/mailman/listinfo/freebsd-mips
>> : To unsubscribe, send any mail to "freebsd-mips-unsubscribe@freebsd.org 
>> "
>> :
>> :
>>
>
>
>
> _______________________________________________
> freebsd-mips@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-mips
> To unsubscribe, send any mail to "freebsd-mips- 
> unsubscribe@freebsd.org"
>

------------------------------
Randall Stewart
803-317-4952 (cell)
803-345-0391(direct)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5D3E417C-FE51-49A7-B8CC-564932BF0D3E>