#define FQ_FQP_UNLOCK(x) lockmgr(&(x)->lock, LK_RELEASE); \
fq_dereference_priv((x));
+#define FQ_DPRIV_LOCKINIT(x) lockinit(&(x)->lock, "fqpdiskq", 0, LK_CANRECURSE)
+#define FQ_DPRIV_LOCK(x) fq_reference_dpriv((x)); \
+ lockmgr(&(x)->lock, LK_EXCLUSIVE)
+#define FQ_DPRIV_UNLOCK(x) lockmgr(&(x)->lock, LK_RELEASE); \
+ fq_dereference_dpriv((x))
+
+#define FQ_GLOBAL_FQMP_LOCKINIT(x) lockinit(&fq_fqmp_lock, "fqmpglob", 0, LK_CANRECURSE)
+#define FQ_GLOBAL_FQMP_LOCK(x) lockmgr(&fq_fqmp_lock, LK_EXCLUSIVE)
+#define FQ_GLOBAL_FQMP_UNLOCK(x) lockmgr(&fq_fqmp_lock, LK_RELEASE)
+
+
+
#define FQ_FQMP_LOCKINIT(x) spin_init(&(x)->lock)
#if 0
#define FQ_FQP_LOCKINIT(x) spin_init(&(x)->lock)
#endif
+#if 0
#define FQ_DPRIV_LOCKINIT(x) spin_init(&(x)->lock)
+#endif
+#if 0
#define FQ_GLOBAL_FQMP_LOCKINIT(x) spin_init(&fq_fqmp_lock)
-
+#endif
#define FQ_FQMP_LOCK(x) fq_reference_mpriv((x)); \
spin_lock_wr(&(x)->lock)
#define FQ_FQP_LOCK(x) fq_reference_priv((x)); \
spin_lock_wr(&(x)->lock)
#endif
-
+#if 0
#define FQ_DPRIV_LOCK(x) fq_reference_dpriv((x)); \
spin_lock_wr(&(x)->lock)
-
+#endif
+#if 0
#define FQ_GLOBAL_FQMP_LOCK(x) spin_lock_wr(&fq_fqmp_lock)
-
+#endif
#define FQ_FQMP_UNLOCK(x) spin_unlock_wr(&(x)->lock); \
fq_dereference_mpriv((x))
#define FQ_FQP_UNLOCK(x) spin_unlock_wr(&(x)->lock); \
fq_dereference_priv((x))
#endif
-
+#if 0
#define FQ_DPRIV_UNLOCK(x) spin_unlock_wr(&(x)->lock); \
fq_dereference_dpriv((x))
-
+#endif
+#if 0
#define FQ_GLOBAL_FQMP_UNLOCK(x) spin_unlock_wr(&fq_fqmp_lock)
+#endif
#define FQ_REBALANCE_TIMEOUT 1 /* in seconds */
#define FQ_TOTAL_DISK_TIME 1000000*FQ_REBALANCE_TIMEOUT /* in useconds */
struct thread *td;
struct thread *td_balance;
struct disk *dp;
- struct spinlock lock;
+ struct lock lock;
int refcount;
int avg_rq_time; /* XXX: unused */
TAILQ_HEAD(, dsched_fq_mpriv) dsched_fqmp_list =
TAILQ_HEAD_INITIALIZER(dsched_fqmp_list);
-struct spinlock fq_fqmp_lock;
+struct lock fq_fqmp_lock;
struct callout fq_callout;
extern struct dsched_ops dsched_fq_ops;
kprintf("dpriv (%p) destruction started, trace:\n", dpriv);
print_backtrace(4);
#endif
- spin_lock_wr(&dpriv->lock);
+ lockmgr(&dpriv->lock, LK_EXCLUSIVE);
TAILQ_FOREACH_MUTABLE(fqp, &dpriv->fq_priv_list, dlink, fqp2) {
TAILQ_REMOVE(&dpriv->fq_priv_list, fqp, dlink);
fqp->flags &= ~FQP_LINKED_DPRIV;
fq_dereference_priv(fqp);
}
- spin_unlock_wr(&dpriv->lock);
+ lockmgr(&dpriv->lock, LK_RELEASE);
objcache_put(fq_dpriv_cache, dpriv);
atomic_subtract_int(&fq_stats.dpriv_allocations, 1);
KKASSERT(fqp->qlength == 0);
if (fqp->flags & FQP_LINKED_DPRIV) {
- spin_lock_wr(&dpriv->lock);
+ lockmgr(&dpriv->lock, LK_EXCLUSIVE);
TAILQ_REMOVE(&dpriv->fq_priv_list, fqp, dlink);
fqp->flags &= ~FQP_LINKED_DPRIV;
- spin_unlock_wr(&dpriv->lock);
+ lockmgr(&dpriv->lock, LK_RELEASE);
}
if (fqp->flags & FQP_LINKED_FQMP) {
for(;;) {
idle = 0;
/* sleep ~60 ms */
- if ((ssleep(dpriv, &dpriv->lock, 0, "fq_dispatcher", hz/15) == 0)) {
+ if ((lksleep(dpriv, &dpriv->lock, 0, "fq_dispatcher", hz/15) == 0)) {
/*
* We've been woken up; this either means that we are
* supposed to die away nicely or that the disk is idle.
FQ_DPRIV_LOCK(dpriv);
for (;;) {
/* sleep ~1s */
- if ((ssleep(curthread, &dpriv->lock, 0, "fq_balancer", hz/2) == 0)) {
+ if ((lksleep(curthread, &dpriv->lock, 0, "fq_balancer", hz/2) == 0)) {
if (__predict_false(dpriv->die)) {
FQ_DPRIV_UNLOCK(dpriv);
lwkt_exit();
dsched_exit_thread_t fq_exit_thread;
extern struct dsched_fq_stats fq_stats;
-extern struct spinlock fq_fqmp_lock;
+extern struct lock fq_fqmp_lock;
extern TAILQ_HEAD(, dsched_fq_mpriv) dsched_fqmp_list;
extern struct callout fq_callout;
FQ_GLOBAL_FQMP_UNLOCK();
lwkt_create((void (*)(void *))fq_dispatcher, dpriv, &td_core, NULL,
- 0, 0, "fq_dispatch_%s", dp->d_cdev->si_name);
+ TDF_MPSAFE, -1, "fq_dispatch_%s", dp->d_cdev->si_name);
lwkt_create((void (*)(void *))fq_balance_thread, dpriv, &td_balance,
- NULL, 0, 0, "fq_balance_%s", dp->d_cdev->si_name);
+ NULL, TDF_MPSAFE, -1, "fq_balance_%s", dp->d_cdev->si_name);
dpriv->td_balance = td_balance;
return 0;