freebsd-ports/misc/dahdi-kmod/files/patch-flush_workqueue
Max Khon a48ecfeaa4 - Fix wcte12xp unloading (implement flush_workqueue)
- Fix nethdlc -> bchan/dchan reconfiguration (unlock chan mtx
before destroying iface)
- Bump PORTREVISION
2012-05-30 08:40:11 +00:00

91 lines
2.4 KiB
Text

Index: freebsd/include/dahdi/compat/bsd.h
===================================================================
--- freebsd/include/dahdi/compat/bsd.h (revision 10598)
+++ freebsd/include/dahdi/compat/bsd.h (working copy)
@@ -330,6 +330,7 @@
struct workqueue_struct *create_singlethread_workqueue(const char *name);
void destroy_workqueue(struct workqueue_struct *wq);
+void flush_workqueue(struct workqueue_struct *wq);
void queue_work(struct workqueue_struct *wq, struct work_struct *work);
/*
Index: freebsd/freebsd/dahdi/bsd-compat.c
===================================================================
--- freebsd/freebsd/dahdi/bsd-compat.c (revision 10598)
+++ freebsd/freebsd/dahdi/bsd-compat.c (working copy)
@@ -33,6 +33,8 @@
#include <sys/bus.h>
#include <sys/callout.h>
#include <sys/firmware.h>
+#include <sys/param.h>
+#include <sys/proc.h>
#include <sys/syscallsubr.h>
#include <sys/systm.h>
#include <sys/taskqueue.h>
@@ -324,7 +326,31 @@
free(wq, M_DAHDI);
}
+static void
+_flush_workqueue_fn(void *context, int pending)
+{
+ /* nothing to do */
+}
+
+static void
+_flush_taskqueue(struct taskqueue **tq)
+{
+ struct task flushtask;
+
+ PHOLD(curproc);
+ TASK_INIT(&flushtask, 0, _flush_workqueue_fn, NULL);
+ taskqueue_enqueue_fast(*tq, &flushtask);
+ taskqueue_drain(*tq, &flushtask);
+ PRELE(curproc);
+}
+
void
+flush_workqueue(struct workqueue_struct *wq)
+{
+ _flush_taskqueue(&wq->tq);
+}
+
+void
queue_work(struct workqueue_struct *wq, struct work_struct *work)
{
work->tq = wq->tq;
Index: freebsd/drivers/dahdi/wcte12xp/base.c
===================================================================
--- freebsd/drivers/dahdi/wcte12xp/base.c (revision 10598)
+++ freebsd/drivers/dahdi/wcte12xp/base.c (working copy)
@@ -2441,13 +2441,11 @@
clear_bit(INITIALIZED, &wc->bit_flags);
del_timer_sync(&wc->timer);
-#if !defined(__FreeBSD__)
flush_workqueue(wc->wq);
#ifdef VPM_SUPPORT
if (vpm)
flush_workqueue(vpm->wq);
#endif
-#endif
voicebus_release(&wc->vb);
Index: freebsd/drivers/dahdi/wctdm24xxp/xhfc.c
===================================================================
--- freebsd/drivers/dahdi/wctdm24xxp/xhfc.c (revision 10598)
+++ freebsd/drivers/dahdi/wctdm24xxp/xhfc.c (working copy)
@@ -2129,11 +2129,7 @@
down(&wc->syncsem);
b4s[i]->shutdown = 1;
up(&wc->syncsem);
-#if defined(__FreeBSD__)
- flush_work(&b4s[i]->xhfc_wq);
-#else
flush_workqueue(b4s[i]->xhfc_ws);
-#endif
}
}
}