ATA_CAM-ed mvsata(4) on OpenRD-client

Norikatsu Shigemura nork at ninth-nine.com
Sun Feb 28 04:31:54 UTC 2010


Hi mav.

	I didn't know what's happen.  So I'll report code trace and
	cam related struct dump with ddb which I made.

	The first, cam ddb patch:
		show cam
		show cam_eb <struct cam_eb *>
		show cam_et <struct cam_et *>
		show cam_ed <struct cam_ed *>
		show cam_sim <struct cam_sim *>
		show cam_periph <struct cam_periph *>
	I saw gibbs'd document, and made it.  If not enough, please tell me!

	(*) http://people.freebsd.org/~gibbs/ARTICLE-0001.html

	I got following results:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  :
sata0: <Marvell Integrated SATA Controller> at mem 0xf1080000-0xf1085fff irq 21 on mbus0
sata0: [MPSAFE]
sata0: [ITHREAD]
ata0: <Marvell Integrated SATA Channel> on sata0
ata0: [MPSAFE]
ata0: [ITHREAD]
ata1: <Marvell Integrated SATA Channel> on sata0
ata1: [MPSAFE]
ata1: [ITHREAD]
pcib0: <Marvell 88F6281 PCI-Express host controller> at mem 0xf1040000-0xf1041fff on mbus0
pcib0: PCI IO/Memory space exhausted
device_attach: pcib0 attach returned 12
Timecounter "CPU Timer" frequency 200000000 Hz quality 1000
Timecounters tick every 10.000 msec
lo0: bpf attached
spin lock 0xc36c8d00 () held by 0xc361bb08 (tid -1061281488) too long
panic: spin lock held too long
KDB: enter: panic
[ thread pid 0 tid 100000 ]
Stopped at      0xc09e1d04 = kdb_enter+0x48:    ldrb    r15, [r15, r15, ror r15]!
db> show cam
Transport layer configuration information:
 cam_eb = 0xc36c88c0: path_id = 0, sim_name = ata
     cam_et = 0xc36c8880: target_id = 4294967295
         cam_ed = 0xc376e000: lun_id = 4294967295
 cam_eb = 0xc3770840: path_id = 1, sim_name = ata
     cam_et = 0xc3770800: target_id = 4294967295
         cam_ed = 0xc376e800: lun_id = 4294967295
 cam_eb = 0xc35df5c0: path_id = 4294967295, sim_name = xpt
     cam_et = 0xc35df540: target_id = 4294967295
         cam_ed = 0xc356d800: lun_id = 4294967295
             cam_periph = 0xc3574b80: unit_number = 0, periph_name = xpt
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -




[cam_eb = 0xc36c88c0] OK line
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
db> show cam_eb 0xc36c88c0
CAM Existing Bus information:
 et_entries         = -> 0xc36c8880 (struct cam_et *)
 links              = -> 0xc3770840 (struct cam_eb *)
 path_id            = 0
 sim                = 0xc3604780 (struct cam_sim *)
 last_reset         = 0.0[s]
 flags              = 0x0
 refcount           = 4
 generation         = 1
 parent_dev         = 0 (device_t)
 xport              = 0xc0bbfe80 (struct xpt_xport *)
db> show cam_sim 0xc3604780
SIM(SCSI Interface Module) information:
 sim_action         = 0xc0929c38
 sim_poll           = 0xc09294e8
 sim_name           = ata
 softc              = 0xc35e5800 (void *)
 mtx                = 0xc35e5974 (struct mtx *)
 sim_doneq          = -> 0 (struct ccb_hdr *)
 links              = -> 0 (struct cam_sim *)
 path_id            = 0
 unit_number        = 0
 bus_id             = 0
 max_tagged_dev_openings = 0
 max_dev_openings   = 1
 flags              = 0x2
 callout            = 0xc36047bc (struct callout)
 devq               = 0xc3604800 (struct cam_devq)
 refcount           = 2
 ccb_freeq          = -> 0 (struct ccb_hdr *)
 max_ccbs           = 9
 ccb_count          = 0
db> show cam_et 0xc36c8880
CAM Existing Target information:
 ed_entries         = -> 0xc376e000 (struct cam_ed *)
 links              = -> 0 (struct cam_et *)
 bus                = 0xc36c88c0 (struct cam_eb *)
 target_id          = 4294967295
 refcount           = 3
 generation         = 1
 last_reset         = 0.0[s]
db> show cam_ed 0xc376e000
CAM Existing Device information:
 links              = -> 0 (struct cam_ed *)
 alloc_ccb_entry
 send_ccb_entry
 target             = 0xc36c8880 (struct cam_et *)
 sim                = 0xc3604780 (struct cam_sim *)
 lun_id             = 4294967295
 drvq
 ccbq
 asyncs
 periphs            = -> 0 (struct cam_periph *)
 generation         = 0
 owner              = 0 (struct cam_periph *)
 quirk              = 0 (void *)
 maxtags            = 1
 mintags            = 1
 protocol
 protocol_version   = 0
 transport
 transport_version  = 0
 inq_data
 ident_data
 inq_flags          = 0x0
 queue_flags        = 0x0
 serial_num_len     = 0
 serial_num         = 0 (u_int8_t *)
 flags              = 0x1
 tag_delay_count    = 0
 tag_saved_openings = 0
 refcount           = 2
 callout            = 0xc376e3d0 (struct callout)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -




[cam_eb = 0xc35df5c0] Freeze Line
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
db> show cam_eb 0xc35df5c0
CAM Existing Bus information:
 et_entries         = -> 0xc35df540 (struct cam_et *)
 links              = -> 0 (struct cam_eb *)
 path_id            = 4294967295
 sim                = 0xc3574c00 (struct cam_sim *)
 last_reset         = 0.0[s]
 flags              = 0x0
 refcount           = 3
 generation         = 3
 parent_dev         = 0 (device_t)
 xport              = 0xc0bbfc6c (struct xpt_xport *)
db> show cam_sim 0xc3574c00
SIM(SCSI Interface Module) information:
 sim_action         = 0xc0906df8
 sim_poll           = 0xc0904018
 sim_name           = xpt
 softc              = 0xc3574b80 (void *)
 mtx                = 0xc0be5204 (struct mtx *)
 sim_doneq          = -> 0 (struct ccb_hdr *)
 links              = -> 0 (struct cam_sim *)
 path_id            = 4294967295
 unit_number        = 0
 bus_id             = 0
 max_tagged_dev_openings = 0
 max_dev_openings   = 0
 flags              = 0x2
 callout            = 0xc3574c3c (struct callout)
 devq               = 0xc3574c80 (struct cam_devq)
 refcount           = 2
 ccb_freeq          = -> 0 (struct ccb_hdr *)
 max_ccbs           = 8
 ccb_count          = 0
db> show cam_et 0xc35df540
CAM Existing Target information:
 ed_entries         = -> 0xc356d800 (struct cam_ed *)
 links              = -> 0 (struct cam_et *)
 bus                = 0xc35df5c0 (struct cam_eb *)
 target_id          = 4294967295
 refcount           = 2
 generation         = 1
 last_reset         = 0.0[s]
db> show cam_ed 0xc356d800
CAM Existing Device information:
 links              = -> 0 (struct cam_ed *)
 alloc_ccb_entry
 send_ccb_entry
 target             = 0xc35df540 (struct cam_et *)
 sim                = 0xc3574c00 (struct cam_sim *)
 lun_id             = 4294967295
 drvq
 ccbq
 asyncs
 periphs            = -> 0xc3574b80 (struct cam_periph *)
 generation         = 1
 owner              = 0 (struct cam_periph *)
 quirk              = 0 (void *)
 maxtags            = 1
 mintags            = 1
 protocol
 protocol_version   = 0
 transport
 transport_version  = 0
 inq_data
 ident_data
 inq_flags          = 0x0
 queue_flags        = 0x0
 serial_num_len     = 0
 serial_num         = 0 (u_int8_t *)
 flags              = 0x1
 tag_delay_count    = 0
 tag_saved_openings = 0
 refcount           = 2
 callout            = 0xc356dbd0 (struct callout)
db> show cam_periph 0xc3574b80
CAM Peripheral information:
 pinfo
 periph_start       = 0 (periph_start_t *)
 periph_oninval     = 0 (periph_oninval *)
 periph_dtor        = 0 (periph_dtor_t *)
 periph_name        = xpt
 path               = 0xc35613b0 (struct cam_path *)
 softc              = 0 (void *)
 sim                = 0xc3574c00 (struct cam_sim *)
 unit_number        = 0
 type               = 0x0
 flags              = 0x0
 immediate_priority = 4294967295
 refcount           = 0
 ccb_list           = -> 0 (struct ccb_hdr *)
 periph_links       = -> 0 (struct cam_periph *)
 unit_links         = -> 0 (struct cam_periph *)
 deferred_callback  = 0 (ac_callback_t *)
 deferred_ac
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -




patch:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
--- sys/cam/cam_periph.c.orig	2010-01-28 17:41:30.000000000 +0900
+++ sys/cam/cam_periph.c	2010-02-28 11:09:19.984247259 +0900
@@ -58,6 +58,12 @@
 #include <cam/scsi/scsi_message.h>
 #include <cam/scsi/scsi_pass.h>
 
+#include "opt_ddb.h"
+
+#ifdef DDB
+#include <ddb/ddb.h>
+#endif
+
 static	u_int		camperiphnextunit(struct periph_driver *p_drv,
 					  u_int newunit, int wired,
 					  path_id_t pathid, target_id_t target,
@@ -1859,3 +1865,42 @@
 
 	return (error);
 }
+
+#ifdef DDB
+static void
+cam_show_cam_periph(struct cam_periph *periph)
+{
+        if (periph == NULL)
+                return;
+
+	db_printf("CAM Peripheral information:\n");
+
+	db_printf(" pinfo\n");
+	db_printf(" periph_start       = %p (periph_start_t *)\n",       periph->periph_start);
+	db_printf(" periph_oninval     = %p (periph_oninval *)\n",       periph->periph_oninval);
+	db_printf(" periph_dtor        = %p (periph_dtor_t *)\n",        periph->periph_dtor);
+	db_printf(" periph_name        = %s\n",                          periph->periph_name);
+	db_printf(" path               = %p (struct cam_path *)\n",      periph->path);
+	db_printf(" softc              = %p (void *)\n",                 periph->softc);
+	db_printf(" sim                = %p (struct cam_sim *)\n",       periph->sim);
+	db_printf(" unit_number        = %u\n",                          periph->unit_number);
+	db_printf(" type               = 0x%x\n",                        periph->type);
+	db_printf(" flags              = 0x%x\n",                        periph->flags);
+	db_printf(" immediate_priority = %u\n",                          periph->immediate_priority);
+	db_printf(" refcount           = %u\n",                          periph->refcount);
+	db_printf(" ccb_list           = -> %p (struct ccb_hdr *)\n",    SLIST_FIRST(&periph->ccb_list));
+	db_printf(" periph_links       = -> %p (struct cam_periph *)\n", SLIST_NEXT(periph, periph_links));
+	db_printf(" unit_links         = -> %p (struct cam_periph *)\n", TAILQ_NEXT(periph, unit_links)); db_printf(" deferred_callback  = %p (ac_callback_t *)\n",  periph->deferred_callback);
+	db_printf(" deferred_ac\n");
+}
+
+DB_SHOW_COMMAND(cam_periph, db_show_cam_periph)
+{
+	if (!have_addr) {
+		db_printf("usage: show cam_periph <struct cam_periph *>\n");
+		return;
+	}
+
+	cam_show_cam_periph((struct cam_periph*)addr);
+}
+#endif
--- sys/cam/cam_sim.c.orig	2010-01-28 22:45:23.512540000 +0900
+++ sys/cam/cam_sim.c	2010-02-28 11:10:17.866613899 +0900
@@ -41,6 +41,12 @@
 #include <cam/cam_sim.h>
 #include <cam/cam_queue.h>
 
+#include "opt_ddb.h"
+
+#ifdef DDB
+#include <ddb/ddb.h>
+#endif
+
 #define CAM_PATH_ANY (u_int32_t)-1
 
 MALLOC_DEFINE(M_CAMSIM, "CAM SIM", "CAM SIM buffers");
@@ -145,3 +151,43 @@
 {
 	sim->path_id = path_id;
 }
+
+#ifdef DDB
+static void
+cam_show_cam_sim(struct cam_sim *sim)
+{
+	if (sim == NULL)
+		return;
+
+	db_printf("SIM(SCSI Interface Module) information:\n");
+	db_printf(" sim_action         = %p\n",                          sim->sim_action);
+	db_printf(" sim_poll           = %p\n",                          sim->sim_poll);
+	db_printf(" sim_name           = %s\n",                          sim->sim_name);
+	db_printf(" softc              = %p (void *)\n",                 sim->softc);
+	db_printf(" mtx                = %p (struct mtx *)\n",           sim->mtx);
+	db_printf(" sim_doneq          = -> %p (struct ccb_hdr *)\n",    TAILQ_FIRST(&sim->sim_doneq));
+	db_printf(" links              = -> %p (struct cam_sim *)\n",    TAILQ_NEXT(sim, links));
+	db_printf(" path_id            = %u\n",                          sim->path_id);
+	db_printf(" unit_number        = %u\n",                          sim->unit_number);
+	db_printf(" bus_id             = %u\n",                          sim->bus_id);
+	db_printf(" max_tagged_dev_openings = %d\n",                     sim->max_tagged_dev_openings);
+	db_printf(" max_dev_openings   = %d\n",                          sim->max_dev_openings);
+	db_printf(" flags              = 0x%x\n",                        sim->flags);
+	db_printf(" callout            = %p (struct callout)\n",        &sim->callout);
+	db_printf(" devq               = %p (struct cam_devq)\n",        sim->devq);
+	db_printf(" refcount           = %d\n",                          sim->refcount);
+	db_printf(" ccb_freeq          = -> %p (struct ccb_hdr *)\n",    SLIST_FIRST(&sim->ccb_freeq));
+	db_printf(" max_ccbs           = %u\n",                          sim->max_ccbs);
+	db_printf(" ccb_count          = %u\n",                          sim->ccb_count);
+}
+
+DB_SHOW_COMMAND(cam_sim, db_show_cam_sim)
+{
+	if (!have_addr) {
+		db_printf("usage: show cam_sim <struct cam_sim *>\n");
+		return;
+	}
+
+	cam_show_cam_sim((struct cam_sim*)addr);
+}
+#endif
--- sys/cam/cam_xpt.c.orig	2010-02-26 19:33:48.000000000 +0900
+++ sys/cam/cam_xpt.c	2010-02-28 11:24:55.338945930 +0900
@@ -69,6 +69,11 @@
 #include <cam/scsi/scsi_pass.h>
 #include <machine/stdarg.h>	/* for xpt_print below */
 #include "opt_cam.h"
+#include "opt_ddb.h"
+
+#ifdef DDB
+#include <ddb/ddb.h>
+#endif
 
 /*
  * This is the maximum number of high powered commands (e.g. start unit)
@@ -4920,3 +4925,135 @@
 	}
 }
 
+#ifdef DDB
+static void
+cam_show_cam_eb(struct cam_eb *bus)
+{
+	if (bus == NULL)
+		return;
+
+	db_printf("CAM Existing Bus information:\n");
+	db_printf(" et_entries         = -> %p (struct cam_et *)\n",     TAILQ_FIRST(&bus->et_entries));
+	db_printf(" links              = -> %p (struct cam_eb *)\n",     TAILQ_NEXT(bus, links));
+	db_printf(" path_id            = %u\n",                          bus->path_id);
+	db_printf(" sim                = %p (struct cam_sim *)\n",       bus->sim);
+	db_printf(" last_reset         = %lu.%ld[s]\n",            (long)bus->last_reset.tv_sec, bus->last_reset.tv_usec/1000);
+	db_printf(" flags              = 0x%x\n",                        bus->flags);
+	db_printf(" refcount           = %u\n",                          bus->refcount);
+	db_printf(" generation         = %u\n",                          bus->generation);
+	db_printf(" parent_dev         = %p (device_t)\n",               bus->parent_dev);
+	db_printf(" xport              = %p (struct xpt_xport *)\n",     bus->xport);
+}
+
+static void
+cam_show_cam_et(struct cam_et *tar)
+{
+	if (tar == NULL)
+		return;
+
+	db_printf("CAM Existing Target information:\n");
+	db_printf(" ed_entries         = -> %p (struct cam_ed *)\n",     TAILQ_FIRST(&tar->ed_entries));
+	db_printf(" links              = -> %p (struct cam_et *)\n",     TAILQ_NEXT(tar, links));
+	db_printf(" bus                = %p (struct cam_eb *)\n",        tar->bus);
+	db_printf(" target_id          = %u\n",                          tar->target_id);
+	db_printf(" refcount           = %u\n",                          tar->refcount);
+	db_printf(" generation         = %u\n",                          tar->generation);
+	db_printf(" last_reset         = %lu.%ld[s]\n",            (long)tar->last_reset.tv_sec, tar->last_reset.tv_usec/1000);
+}
+
+static void
+cam_show_cam_ed(struct cam_ed *dev)
+{
+	if (dev == NULL)
+		return;
+
+	db_printf("CAM Existing Device information:\n");
+	db_printf(" links              = -> %p (struct cam_ed *)\n",     TAILQ_NEXT(dev, links));
+	db_printf(" alloc_ccb_entry\n");
+	db_printf(" send_ccb_entry\n");
+	db_printf(" target             = %p (struct cam_et *)\n",        dev->target);
+	db_printf(" sim                = %p (struct cam_sim *)\n",       dev->sim);
+	db_printf(" lun_id             = %u\n",                          dev->lun_id);
+	db_printf(" drvq\n");
+	db_printf(" ccbq\n");
+	db_printf(" asyncs\n");
+	db_printf(" periphs            = -> %p (struct cam_periph *)\n", SLIST_FIRST(&dev->periphs));
+	db_printf(" generation         = %u\n",                          dev->generation);
+	db_printf(" owner              = %p (struct cam_periph *)\n",    dev->owner);
+	db_printf(" quirk              = %p (void *)\n",                 dev->quirk);
+	db_printf(" maxtags            = %u\n",                          dev->maxtags);
+	db_printf(" mintags            = %u\n",                          dev->mintags);
+	db_printf(" protocol\n");
+	db_printf(" protocol_version   = %u\n",                          dev->protocol_version);
+	db_printf(" transport\n");
+	db_printf(" transport_version  = %u\n",                          dev->transport_version);
+	db_printf(" inq_data\n");
+	db_printf(" ident_data\n");
+	db_printf(" inq_flags          = 0x%x\n",                        dev->inq_flags);
+	db_printf(" queue_flags        = 0x%x\n",                        dev->queue_flags);
+	db_printf(" serial_num_len     = %u\n",                          dev->serial_num_len);
+	db_printf(" serial_num         = %p (u_int8_t *)\n",             dev->serial_num);
+	db_printf(" flags              = 0x%x\n",                        dev->flags);
+	db_printf(" tag_delay_count    = %u\n",                          dev->tag_delay_count);
+	db_printf(" tag_saved_openings = %u\n",                          dev->tag_saved_openings);
+	db_printf(" refcount           = %u\n",                          dev->refcount);
+	db_printf(" callout            = %p (struct callout)\n",        &dev->callout);
+}
+
+DB_SHOW_COMMAND(cam_eb, db_show_cam_eb)
+{
+	if (!have_addr) {
+		db_printf("usage: show cam_eb <struct cam_eb *>\n");
+		return;
+	}
+
+	cam_show_cam_eb((struct cam_eb*)addr);
+}
+
+DB_SHOW_COMMAND(cam_et, db_show_cam_et)
+{
+	if (!have_addr) {
+		db_printf("usage: show cam_et <struct cam_et *>\n");
+		return;
+	}
+
+	cam_show_cam_et((struct cam_et*)addr);
+}
+
+DB_SHOW_COMMAND(cam_ed, db_show_cam_ed)
+{
+	if (!have_addr) {
+		db_printf("usage: show cam_ed <struct cam_ed *>\n");
+		return;
+	}
+
+	cam_show_cam_ed((struct cam_ed*)addr);
+}
+
+DB_SHOW_COMMAND(cam, db_show_cam)
+{
+	struct cam_eb *bus, *next_bus;
+	struct cam_et *tar;
+	struct cam_ed *dev;
+	struct cam_periph *periph;
+
+	db_printf("Transport layer configuration information:\n");
+	for (bus = TAILQ_FIRST(&xsoftc.xpt_busses);
+	     bus != NULL; bus = next_bus) {
+		next_bus = TAILQ_NEXT(bus, links);
+		db_printf(" cam_eb = %p: path_id = %u, sim_name = %s\n", bus, bus->path_id, bus->sim->sim_name);
+		TAILQ_FOREACH(tar, &bus->et_entries, links) {
+			db_printf("     cam_et = %p: target_id = %u\n", tar, tar->target_id);
+			TAILQ_FOREACH(dev, &tar->ed_entries, links) {
+				db_printf("         cam_ed = %p: lun_id = %u\n", dev, dev->lun_id);
+				SLIST_FOREACH(periph, &dev->periphs, periph_links) {
+					db_printf("             cam_periph = %p: unit_number = %u, periph_name = %s\n", periph, periph->unit_number, periph->periph_name);
+				}
+			}
+		}
+		if (db_pager_quit)
+			break;
+	}
+}
+
+#endif
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


More information about the freebsd-current mailing list