|
@@ -68,7 +68,8 @@ static void blkg_free(struct blkcg_gq *blkg)
|
|
|
return;
|
|
|
|
|
|
for (i = 0; i < BLKCG_MAX_POLS; i++)
|
|
|
- kfree(blkg->pd[i]);
|
|
|
+ if (blkg->pd[i])
|
|
|
+ blkcg_policy[i]->pd_free_fn(blkg->pd[i]);
|
|
|
|
|
|
if (blkg->blkcg != &blkcg_root)
|
|
|
blk_exit_rl(&blkg->rl);
|
|
@@ -114,7 +115,7 @@ static struct blkcg_gq *blkg_alloc(struct blkcg *blkcg, struct request_queue *q,
|
|
|
continue;
|
|
|
|
|
|
/* alloc per-policy data and attach it to blkg */
|
|
|
- pd = kzalloc_node(pol->pd_size, gfp_mask, q->node);
|
|
|
+ pd = pol->pd_alloc_fn(gfp_mask, q->node);
|
|
|
if (!pd)
|
|
|
goto err_free;
|
|
|
|
|
@@ -1057,7 +1058,7 @@ int blkcg_activate_policy(struct request_queue *q,
|
|
|
blk_queue_bypass_start(q);
|
|
|
pd_prealloc:
|
|
|
if (!pd_prealloc) {
|
|
|
- pd_prealloc = kzalloc_node(pol->pd_size, GFP_KERNEL, q->node);
|
|
|
+ pd_prealloc = pol->pd_alloc_fn(GFP_KERNEL, q->node);
|
|
|
if (!pd_prealloc) {
|
|
|
ret = -ENOMEM;
|
|
|
goto out_bypass_end;
|
|
@@ -1072,7 +1073,7 @@ pd_prealloc:
|
|
|
if (blkg->pd[pol->plid])
|
|
|
continue;
|
|
|
|
|
|
- pd = kzalloc_node(pol->pd_size, GFP_NOWAIT, q->node);
|
|
|
+ pd = pol->pd_alloc_fn(GFP_NOWAIT, q->node);
|
|
|
if (!pd)
|
|
|
swap(pd, pd_prealloc);
|
|
|
if (!pd) {
|
|
@@ -1093,7 +1094,8 @@ pd_prealloc:
|
|
|
spin_unlock_irq(q->queue_lock);
|
|
|
out_bypass_end:
|
|
|
blk_queue_bypass_end(q);
|
|
|
- kfree(pd_prealloc);
|
|
|
+ if (pd_prealloc)
|
|
|
+ pol->pd_free_fn(pd_prealloc);
|
|
|
return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(blkcg_activate_policy);
|
|
@@ -1128,8 +1130,10 @@ void blkcg_deactivate_policy(struct request_queue *q,
|
|
|
if (pol->pd_exit_fn)
|
|
|
pol->pd_exit_fn(blkg);
|
|
|
|
|
|
- kfree(blkg->pd[pol->plid]);
|
|
|
- blkg->pd[pol->plid] = NULL;
|
|
|
+ if (blkg->pd[pol->plid]) {
|
|
|
+ pol->pd_free_fn(blkg->pd[pol->plid]);
|
|
|
+ blkg->pd[pol->plid] = NULL;
|
|
|
+ }
|
|
|
|
|
|
spin_unlock(&blkg->blkcg->lock);
|
|
|
}
|
|
@@ -1151,9 +1155,6 @@ int blkcg_policy_register(struct blkcg_policy *pol)
|
|
|
struct blkcg *blkcg;
|
|
|
int i, ret;
|
|
|
|
|
|
- if (WARN_ON(pol->pd_size < sizeof(struct blkg_policy_data)))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
mutex_lock(&blkcg_pol_register_mutex);
|
|
|
mutex_lock(&blkcg_pol_mutex);
|
|
|
|