Thanks john, I'll try applying that later tonight should
apply cleanly even though I'm using v1.14 of the driver
I dont think there are any changes in these areas.
N.B. Already contacted Scott Long to get the v1.14
imported as it contains a number of critical fixes.
Steve
John Baldwin wrote:
On Wednesday 03 January 2007 18:58, Steven Hartland wrote:
I'm currently trying to debug an issue with Tyan s2892
based machine but when I enable WITNESS / INVARIANTS
the Highpoint 182x driver panics the kernel with:
panic: blocakble sleep lock ( sleep mutex )
128 @ vm/uma_core.c: 1845
I believe this is due to the fact that you cant hold
a spin mutex while using: bus_dma_tag_create, malloc
bus_dmamem_alloc etc which the driver currently does,
but I have no experience with drivers hence dont know
what it should be doing instead.
If someone's willing to give me some pointers I'd be
willing to give creating a patch and testing it a go.
Here's a snipet of what I think is causing the issue:
/* This uses a mtx_lock_spin */
intrmask_t oldspl = lock_driver();
pAdapter->next = 0;
if(gIal_Adapter == 0) {
gIal_Adapter = pAdapter;
pCurAdapter = gIal_Adapter;
} else {
pCurAdapter->next = pAdapter;
pCurAdapter = pAdapter;
}
pAdapter->outstandingCommands = 0;
pMvSataAdapter = &(pAdapter->mvSataAdapter);
_vbus_p->OsExt = (void *)pAdapter;
pMvSataAdapter->IALData = pAdapter;
/* Errors due to lock_driver holding mtx_lock_spin?? */
if (bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_32BIT,
BUS_SPACE_MAXADDR, NULL, NULL, BUS_SPACE_MAXSIZE_32BIT,
MV_MAX_SEGMENTS, BUS_SPACE_MAXSIZE_32BIT, 0, NULL, NULL,
&pAdapter->parent_dmat) != 0) {
MV_ERROR("RR182x: Failed to create busdma resources\n");
unlock_driver(oldspl);
return (ENOMEM);
}
I would start off making it use a regular mutex (it doesn't need a
spin mutex anyway). It also doesn't need any locking during the
init_adapter() routine so I've removed that as well. Try this:
Index: entry.c
===================================================================
RCS file: /usr/cvs/src/sys/dev/hptmv/entry.c,v
retrieving revision 1.12
diff -u -r1.12 entry.c
--- entry.c 16 May 2006 14:36:25 -0000 1.12
+++ entry.c 4 Jan 2007 17:44:12 -0000
@@ -166,12 +166,12 @@
{
intrmask_t spl = 0;
- mtx_lock_spin(&driver_lock);
+ mtx_lock(&driver_lock);
return spl;
}
void unlock_driver(intrmask_t spl)
{
- mtx_unlock_spin(&driver_lock);
+ mtx_unlock(&driver_lock);
}
#else
static int driver_locked = 0;
@@ -1168,7 +1168,7 @@
#if __FreeBSD_version >= 500000
static void hpt_init(void *dummy)
{
- mtx_init(&driver_lock, "hptlock", NULL, MTX_SPIN);
+ mtx_init(&driver_lock, "hptlock", NULL, MTX_DEF);
}
SYSINIT(hptinit, SI_SUB_CONFIGURE, SI_ORDER_FIRST, hpt_init, NULL);
#endif
@@ -1183,8 +1183,6 @@
PVDevice pVDev;
- intrmask_t oldspl = lock_driver();
-
pAdapter->next = 0;
if(gIal_Adapter == 0){
@@ -1225,7 +1223,6 @@
if (hptmv_allocate_edma_queues(pAdapter))
{
MV_ERROR("RR182x: Failed to allocate memory for EDMA queues\n");
- unlock_driver(oldspl);
return ENOMEM;
}
@@ -1238,7 +1235,6 @@
{
MV_ERROR("RR182x: Failed to remap memory space\n");
hptmv_free_edma_queues(pAdapter);
- unlock_driver(oldspl);
return ENXIO;
}
else
@@ -1268,7 +1264,6 @@
unregister:
bus_release_resource(pAdapter->hpt_dev, SYS_RES_MEMORY, rid,
pAdapter->mem_res);
hptmv_free_edma_queues(pAdapter);
- unlock_driver(oldspl);
return ENXIO;
}
pAdapter->ver_601 = pMvSataAdapter->pcbVersion;
@@ -1411,7 +1406,6 @@
#endif
mvSataUnmaskAdapterInterrupt(pMvSataAdapter);
- unlock_driver(oldspl);
return 0;
}
================================================
This e.mail is private and confidential between Multiplay (UK) Ltd. and the person or entity to whom it is addressed. In the event of misdirection, the recipient is prohibited from using, copying, printing or otherwise disseminating it or any information contained in it.
In the event of misdirection, illegible or incomplete transmission please
telephone +44 845 868 1337
or return the E.mail to [EMAIL PROTECTED]
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"