Re: AHCI/ADA regression?

From: Gary Jennejohn <gljennjohn_at_gmail.com>
Date: Tue, 24 May 2016 20:00:51 +0200
On Tue, 24 May 2016 10:41:25 -0400
"Kenneth D. Merry" <ken_at_FreeBSD.ORG> wrote:

> > The question in my mind is - why are "empty" multiplier ports being
> > probed with the new code but not with the old code?  
> 
> If the HBA says that it supports port multipliers, the kernel should always
> look for them.  It probes the port multiplier first, before moving on to
> look for regular targets.
> 
> So, from that standpoint, it should not be any different.  It sounds like
> we're either getting further in the port multiplier probe process, or there
> is something different about the way things are behaving.
> 
> If you can determine which commands are timing out, that may give us an
> idea about where it is in the probe process.
> 
> Here is one way we may be able to track things down...  Build a kernel with
> these options:
> 
> options	CAMDEBUG
> options CAM_DEBUG_FLAGS=CAM_DEBUG_PROBE
> 
> If you build a kernel before and after the change with those options, it
> will hopefully allow us to compare the probe sequence and get a clue about
> where to look for the problem.
> 

OK, both the old and new kernel versions do an extremely fast intial
probe with these results (note: obtained with grep over dmesg.boot):

(aprobe0:ahcich0:0:15:0): Probe started
(aprobe0:ahcich0:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe1:ahcich1:0:15:0): Probe started
(aprobe1:ahcich1:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe2:ahcich2:0:15:0): Probe started
(aprobe2:ahcich2:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe3:ahcich3:0:15:0): Probe started
(aprobe3:ahcich3:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe4:ahcich4:0:15:0): Probe started
(aprobe4:ahcich4:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe5:ahcich5:0:15:0): Probe started
(aprobe5:ahcich5:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe4:ahcich4:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe4:ahcich4:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe4:ahcich4:0:15:0): Probe completed
(aprobe4:ahcich4:0:0:0): Probe started
(aprobe4:ahcich4:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe4:ahcich4:0:0:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe4:ahcich4:0:0:0): Probe completed
(aprobe0:ahcich0:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe2:ahcich2:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe0:ahcich0:0:15:0): SIGNATURE: 0000
(aprobe0:ahcich0:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe0:ahcich0:0:15:0): Probe completed
(aprobe2:ahcich2:0:15:0): SIGNATURE: 0000
(aprobe2:ahcich2:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe2:ahcich2:0:15:0): Probe completed
(aprobe0:ahcich0:0:0:0): Probe started
(aprobe0:ahcich0:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe2:ahcich2:0:0:0): Probe started
(aprobe2:ahcich2:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe3:ahcich3:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe5:ahcich5:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe0:ahcich0:0:0:0): SIGNATURE: 0000
(aprobe0:ahcich0:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe2:ahcich2:0:0:0): SIGNATURE: 0000
(aprobe2:ahcich2:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe1:ahcich1:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe3:ahcich3:0:15:0): SIGNATURE: 0000
(aprobe3:ahcich3:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe3:ahcich3:0:15:0): Probe completed
(aprobe5:ahcich5:0:15:0): SIGNATURE: 0000
(aprobe5:ahcich5:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe5:ahcich5:0:15:0): Probe completed
(aprobe1:ahcich1:0:15:0): SIGNATURE: eb14
(aprobe1:ahcich1:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe1:ahcich1:0:15:0): Probe completed
(aprobe1:ahcich3:0:0:0): Probe started
(aprobe1:ahcich3:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe3:ahcich5:0:0:0): Probe started
(aprobe3:ahcich5:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe4:ahcich1:0:0:0): Probe started
(aprobe4:ahcich1:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe1:ahcich3:0:0:0): SIGNATURE: 0000
(aprobe1:ahcich3:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe3:ahcich5:0:0:0): SIGNATURE: 0000
(aprobe3:ahcich5:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe4:ahcich1:0:0:0): SIGNATURE: eb14
(aprobe4:ahcich1:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe0:ahcich0:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe1:ahcich3:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe3:ahcich5:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe0:ahcich0:0:0:0): Probe PROBE_SETMODE to PROBE_SET_MULTI
(aprobe1:ahcich3:0:0:0): Probe PROBE_SETMODE to PROBE_SETDMAAA
(aprobe3:ahcich5:0:0:0): Probe PROBE_SETMODE to PROBE_SETDMAAA
(aprobe0:ahcich0:0:0:0): Probe PROBE_SET_MULTI to PROBE_DONE
(aprobe0:ahcich0:0:0:0): Probe completed
(aprobe1:ahcich3:0:0:0): Probe PROBE_SETDMAAA to PROBE_SET_MULTI
(aprobe4:ahcich1:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe3:ahcich5:0:0:0): Probe PROBE_SETDMAAA to PROBE_SET_MULTI
(aprobe1:ahcich3:0:0:0): Probe PROBE_SET_MULTI to PROBE_DONE
(aprobe1:ahcich3:0:0:0): Probe completed
(aprobe3:ahcich5:0:0:0): Probe PROBE_SET_MULTI to PROBE_DONE
(aprobe3:ahcich5:0:0:0): Probe completed
(aprobe2:ahcich2:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe4:ahcich1:0:0:0): Probe PROBE_SETMODE to PROBE_INQUIRY
(aprobe2:ahcich2:0:0:0): Probe PROBE_SETMODE to PROBE_SETDMAAA
(aprobe2:ahcich2:0:0:0): Probe PROBE_SETDMAAA to PROBE_SET_MULTI
(aprobe2:ahcich2:0:0:0): Probe PROBE_SET_MULTI to PROBE_DONE
(aprobe2:ahcich2:0:0:0): Probe completed
(aprobe4:ahcich1:0:0:0): Probe PROBE_INQUIRY to PROBE_FULL_INQUIRY
(aprobe4:ahcich1:0:0:0): Probe PROBE_FULL_INQUIRY to PROBE_DONE
(aprobe4:ahcich1:0:0:0): Probe completed

it looks like the code is basically checking to see how many ports are
on a multiplier since it looks at port 0 and port 15.

[I don't have a dmesg.boot for the "broken" kernel, but I saw the
probe messages going shooting past and it was obviuos that they
were the same]

The old code stops there.

The new code starts probing for what appear to be random ports on a
multiplier, like 0, 7, 20, 17, etc.  These always result in timeouts.

These probes always start with "Probe PROBE_INVALID to PROBE_IDENTIFY"
Why the new code doesn't accept the PROBE_INVALID and skip over it
I don't understand.

After I noticed that the same ports had been probed several times on
achich2 with no apparent end in sight I rebooted.  This behavior is
extremely poor.

-- 
Gary Jennejohn
Received on Tue May 24 2016 - 16:00:55 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:05 UTC