rq_wait
rq_wait_init(&iolat->rq_wait);
struct rq_wait rq_wait;
static void iolat_cleanup_cb(struct rq_wait *rqw, void *private_data)
static bool iolat_acquire_inflight(struct rq_wait *rqw, void *private_data)
struct rq_wait *rqw = &iolat->rq_wait;
wake_up_all(&iolat->rq_wait.wait);
wake_up_all(&iolat->rq_wait.wait);
struct rq_wait *rqw;
rqw = &iolat->rq_wait;
struct rq_wait *rqw;
bool rq_wait_inc_below(struct rq_wait *rq_wait, unsigned int limit)
return atomic_inc_below(&rq_wait->inflight, limit);
void rq_qos_wait(struct rq_wait *rqw, void *private_data,
static inline void rq_wait_init(struct rq_wait *rq_wait)
atomic_set(&rq_wait->inflight, 0);
init_waitqueue_head(&rq_wait->wait);
typedef bool (acquire_inflight_cb_t)(struct rq_wait *rqw, void *private_data);
typedef void (cleanup_cb_t)(struct rq_wait *rqw, void *private_data);
void rq_qos_wait(struct rq_wait *rqw, void *private_data,
bool rq_wait_inc_below(struct rq_wait *rq_wait, unsigned int limit);
static inline struct rq_wait *get_rq_wait(struct rq_wb *rwb,
return &rwb->rq_wait[WBT_RWQ_SWAP];
return &rwb->rq_wait[WBT_RWQ_DISCARD];
return &rwb->rq_wait[WBT_RWQ_BG];
struct rq_wait *rqw = &rwb->rq_wait[i];
static void wbt_rqw_done(struct rq_wb *rwb, struct rq_wait *rqw,
struct rq_wait *rqw;
ret += atomic_read(&rwb->rq_wait[i].inflight);
static bool wbt_inflight_cb(struct rq_wait *rqw, void *private_data)
static void wbt_cleanup_cb(struct rq_wait *rqw, void *private_data)
struct rq_wait *rqw = get_rq_wait(rwb, wb_acct);
atomic_read(&rwb->rq_wait[i].inflight));
struct rq_wait rq_wait[WBT_NUM_RWQ];
rq_wait_init(&rwb->rq_wait[i]);
struct ctx_rq_wait *rq_wait;
if (ctx->rq_wait && atomic_dec_and_test(&ctx->rq_wait->count))
complete(&ctx->rq_wait->comp);
ctx->rq_wait = wait;