return lu_device_is_cl(o->lo_dev);
}
+/* bitflags used in rr / qos allocation */
+enum lq_flag {
+ LQ_DIRTY = 0, /* recalc qos data */
+ LQ_SAME_SPACE, /* the OSTs all have approx.
+ * the same space avail */
+ LQ_RESET, /* zero current penalties */
+};
+
/* round-robin QoS data for LOD/LMV */
struct lu_qos_rr {
spinlock_t lqr_alloc; /* protect allocation index */
__u32 lqr_offset_idx;/* aliasing for start_idx */
int lqr_start_count;/* reseed counter */
struct lu_tgt_pool lqr_pool; /* round-robin optimized list */
- unsigned long lqr_dirty:1; /* recalc round-robin list */
+ unsigned long lqr_flags;
};
/* QoS data per MDS/OSS */
unsigned int lq_prio_free; /* priority for free space */
unsigned int lq_threshold_rr;/* priority for rr */
struct lu_qos_rr lq_rr; /* round robin qos data */
+ unsigned long lq_flags;
+#if 0
unsigned long lq_dirty:1, /* recalc qos data */
lq_same_space:1,/* the servers all have approx.
* the same space avail */
lq_reset:1; /* zero current penalties */
+#endif
};
struct lu_tgt_descs {
tgt->ltd_statfs = *osfs;
tgt->ltd_statfs_age = ktime_get_seconds();
spin_unlock(&lmv->lmv_lock);
- lmv->lmv_qos.lq_dirty = 1;
+ set_bit(LQ_DIRTY, &lmv->lmv_qos.lq_flags);
}
return rc;
return -EINVAL;
lmv->lmv_qos.lq_prio_free = (val << 8) / 100;
- lmv->lmv_qos.lq_dirty = 1;
- lmv->lmv_qos.lq_reset = 1;
+ set_bit(LQ_DIRTY, &lmv->lmv_qos.lq_flags);
+ set_bit(LQ_RESET, &lmv->lmv_qos.lq_flags);
return count;
}
return -EINVAL;
lmv->lmv_qos.lq_threshold_rr = (val << 8) / 100;
- lmv->lmv_qos.lq_dirty = 1;
+ set_bit(LQ_DIRTY, &lmv->lmv_qos.lq_flags);
return count;
}
if (rc)
GOTO(out, rc);
- pool->pool_rr.lqr_dirty = 1;
+ set_bit(LQ_DIRTY, &pool->pool_rr.lqr_flags);
CDEBUG(D_CONFIG, "Added %s to "LOV_POOLNAMEF" as member %d\n",
ostname, poolname, pool_tgt_count(pool));
GOTO(out, rc);
tgt_pool_remove(&pool->pool_obds, ost->ltd_index);
- pool->pool_rr.lqr_dirty = 1;
+ set_bit(LQ_DIRTY, &pool->pool_rr.lqr_flags);
CDEBUG(D_CONFIG, "%s removed from "LOV_POOLNAMEF"\n", ostname,
poolname);
LASSERT(desc->ld_active_tgt_count > 0);
desc->ld_active_tgt_count--;
- ltd->ltd_qos.lq_dirty = 1;
- ltd->ltd_qos.lq_rr.lqr_dirty = 1;
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_flags);
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_rr.lqr_flags);
CDEBUG(D_CONFIG, "%s: turns inactive\n",
tgt->ltd_exp->exp_obd->obd_name);
}
tgt->ltd_active = 1;
tgt->ltd_connecting = 0;
desc->ld_active_tgt_count++;
- ltd->ltd_qos.lq_dirty = 1;
- ltd->ltd_qos.lq_rr.lqr_dirty = 1;
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_flags);
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_rr.lqr_flags);
CDEBUG(D_CONFIG, "%s: turns active\n",
tgt->ltd_exp->exp_obd->obd_name);
}
if (tgt->ltd_statfs.os_bavail != avail)
/* recalculate weigths */
- ltd->ltd_qos.lq_dirty = 1;
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_flags);
}
obd->obd_osfs_age = ktime_get_seconds();
int rc;
ENTRY;
- if (!lqr->lqr_dirty) {
+ if (!test_bit(LQ_DIRTY, &lqr->lqr_flags)) {
LASSERT(lqr->lqr_pool.op_size);
RETURN(0);
}
* Check again. While we were sleeping on @lq_rw_sem something could
* change.
*/
- if (!lqr->lqr_dirty) {
+ if (!test_bit(LQ_DIRTY, &lqr->lqr_flags)) {
LASSERT(lqr->lqr_pool.op_size);
up_write(<d->ltd_qos.lq_rw_sem);
RETURN(0);
}
}
- lqr->lqr_dirty = 0;
+ clear_bit(LQ_DIRTY, &lqr->lqr_flags);
up_write(<d->ltd_qos.lq_rw_sem);
if (placed != real_count) {
LCONSOLE(D_WARNING, "rr #%d tgt idx=%d\n", i,
lqr->lqr_pool.op_array[i]);
}
- lqr->lqr_dirty = 1;
+ set_bit(LQ_DIRTY, &lqr->lqr_flags);
RETURN(-EAGAIN);
}
}
/* makes sense to rebalance next time */
- lod->lod_ost_descs.ltd_qos.lq_dirty = 1;
- lod->lod_ost_descs.ltd_qos.lq_same_space = 0;
-
+ set_bit(LQ_DIRTY, &lod->lod_ost_descs.ltd_qos.lq_flags);
+ clear_bit(LQ_SAME_SPACE, &lod->lod_ost_descs.ltd_qos.lq_flags);
rc = -EAGAIN;
}
}
/* makes sense to rebalance next time */
- ltd->ltd_qos.lq_dirty = 1;
- ltd->ltd_qos.lq_same_space = 0;
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_flags);
+ clear_bit(LQ_SAME_SPACE, <d->ltd_qos.lq_flags);
rc = -EAGAIN;
} else {
if (val > 100)
return -EINVAL;
ltd->ltd_qos.lq_prio_free = (val << 8) / 100;
- ltd->ltd_qos.lq_dirty = 1;
- ltd->ltd_qos.lq_reset = 1;
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_flags);
+ set_bit(LQ_RESET, <d->ltd_qos.lq_flags);
return count;
}
if (val > 100)
return -EINVAL;
ltd->ltd_qos.lq_threshold_rr = (val << 8) / 100;
- ltd->ltd_qos.lq_dirty = 1;
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_flags);
return count;
}
void lu_qos_rr_init(struct lu_qos_rr *lqr)
{
spin_lock_init(&lqr->lqr_alloc);
- lqr->lqr_dirty = 1;
+ set_bit(LQ_DIRTY, &lqr->lqr_flags);
}
EXPORT_SYMBOL(lu_qos_rr_init);
*/
list_add_tail(&svr->lsq_svr_list, &tempsvr->lsq_svr_list);
- qos->lq_dirty = 1;
- qos->lq_rr.lqr_dirty = 1;
-
+ set_bit(LQ_DIRTY, &qos->lq_flags);
+ set_bit(LQ_DIRTY, &qos->lq_rr.lqr_flags);
out:
up_write(&qos->lq_rw_sem);
RETURN(rc);
OBD_FREE_PTR(svr);
}
- qos->lq_dirty = 1;
- qos->lq_rr.lqr_dirty = 1;
+ set_bit(LQ_DIRTY, &qos->lq_flags);
+ set_bit(LQ_DIRTY, &qos->lq_rr.lqr_flags);
out:
up_write(&qos->lq_rw_sem);
RETURN(rc);
/* Set up allocation policy (QoS and RR) */
INIT_LIST_HEAD(<d->ltd_qos.lq_svr_list);
init_rwsem(<d->ltd_qos.lq_rw_sem);
- ltd->ltd_qos.lq_dirty = 1;
- ltd->ltd_qos.lq_reset = 1;
+ set_bit(LQ_DIRTY, <d->ltd_qos.lq_flags);
+ set_bit(LQ_RESET, <d->ltd_qos.lq_flags);
/* Default priority is toward free space balance */
ltd->ltd_qos.lq_prio_free = 232;
/* Default threshold for rr (roughly 17%) */
*/
bool ltd_qos_is_usable(struct lu_tgt_descs *ltd)
{
- if (!ltd->ltd_qos.lq_dirty && ltd->ltd_qos.lq_same_space)
+ if (!test_bit(LQ_DIRTY, <d->ltd_qos.lq_flags) &&
+ test_bit(LQ_SAME_SPACE, <d->ltd_qos.lq_flags))
return false;
if (ltd->ltd_lov_desc.ld_active_tgt_count < 2)
ENTRY;
- if (!qos->lq_dirty)
+ if (!test_bit(LQ_DIRTY, &qos->lq_flags))
GOTO(out, rc = 0);
num_active = desc->ld_active_tgt_count - 1;
tgt->ltd_qos.ltq_penalty_per_obj >>= 1;
age = (now - tgt->ltd_qos.ltq_used) >> 3;
- if (qos->lq_reset || age > 32 * desc->ld_qos_maxage)
+ if (test_bit(LQ_RESET, &qos->lq_flags) ||
+ age > 32 * desc->ld_qos_maxage)
tgt->ltd_qos.ltq_penalty = 0;
else if (age > desc->ld_qos_maxage)
/* Decay tgt penalty. */
svr->lsq_penalty_per_obj >>= 1;
age = (now - svr->lsq_used) >> 3;
- if (qos->lq_reset || age > 32 * desc->ld_qos_maxage)
+ if (test_bit(LQ_RESET, &qos->lq_flags) ||
+ age > 32 * desc->ld_qos_maxage)
svr->lsq_penalty = 0;
else if (age > desc->ld_qos_maxage)
/* Decay server penalty. */
svr->lsq_penalty >>= age / desc->ld_qos_maxage;
}
- qos->lq_dirty = 0;
- qos->lq_reset = 0;
+ clear_bit(LQ_DIRTY, &qos->lq_flags);
+ clear_bit(LQ_RESET, &qos->lq_flags);
/*
* If each tgt has almost same free space, do rr allocation for better
* creation performance
*/
- qos->lq_same_space = 0;
+ clear_bit(LQ_SAME_SPACE, &qos->lq_flags);
if ((ba_max * (256 - qos->lq_threshold_rr)) >> 8 < ba_min &&
(ia_max * (256 - qos->lq_threshold_rr)) >> 8 < ia_min) {
- qos->lq_same_space = 1;
+ set_bit(LQ_SAME_SPACE, &qos->lq_flags);
/* Reset weights for the next time we enter qos mode */
- qos->lq_reset = 1;
+ set_bit(LQ_RESET, &qos->lq_flags);
}
rc = 0;
out:
- if (!rc && qos->lq_same_space)
+ if (!rc && test_bit(LQ_SAME_SPACE, &qos->lq_flags))
RETURN(-EAGAIN);
RETURN(rc);