cfq-iosched: Fixed boot warning with BLK_CGROUP=y and CFQ_GROUP_IOSCHED=n
Hi Jens, Few days back Ingo noticed a CFQ boot time warning. This patch fixes it. The issue here is that with CFQ_GROUP_IOSCHED=n, CFQ should not really be making blkio stat related calls. > Hm, it's still not entirely fixed, as of 2.6.35-rc2-00131-g7908a9e. With > some > configs i get bad spinlock warnings during bootup: > > [ 28.968013] initcall net_olddevs_init+0x0/0x82 returned 0 after 93750 > usecs > [ 28.972003] calling b44_init+0x0/0x55 @ 1 > [ 28.976009] bus: 'pci': add driver b44 > [ 28.976374] sda: > [ 28.978157] BUG: spinlock bad magic on CPU#1, async/0/117 > [ 28.980000] lock: 7e1c5bbc, .magic: 00000000, .owner: <none>/-1, +.owner_cpu: 0 > [ 28.980000] Pid: 117, comm: async/0 Not tainted +2.6.35-rc2-tip-01092-g010e7ef-dirty #8183 > [ 28.980000] Call Trace: > [ 28.980000] [<41ba6d55>] ? printk+0x20/0x24 > [ 28.980000] [<4134b7b7>] spin_bug+0x7c/0x87 > [ 28.980000] [<4134b853>] do_raw_spin_lock+0x1e/0x123 > [ 28.980000] [<41ba92ca>] ? _raw_spin_lock_irqsave+0x12/0x20 > [ 28.980000] [<41ba92d2>] _raw_spin_lock_irqsave+0x1a/0x20 > [ 28.980000] [<4133476f>] blkiocg_update_io_add_stats+0x25/0xfb > [ 28.980000] [<41335dae>] ? cfq_prio_tree_add+0xb1/0xc1 > [ 28.980000] [<41337bc7>] cfq_insert_request+0x8c/0x425 Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
parent
c10b61f091
commit
e98ef89b30
|
@ -14,7 +14,7 @@
|
||||||
#include <linux/rbtree.h>
|
#include <linux/rbtree.h>
|
||||||
#include <linux/ioprio.h>
|
#include <linux/ioprio.h>
|
||||||
#include <linux/blktrace_api.h>
|
#include <linux/blktrace_api.h>
|
||||||
#include "blk-cgroup.h"
|
#include "cfq.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* tunables
|
* tunables
|
||||||
|
@ -879,7 +879,7 @@ cfq_group_service_tree_del(struct cfq_data *cfqd, struct cfq_group *cfqg)
|
||||||
if (!RB_EMPTY_NODE(&cfqg->rb_node))
|
if (!RB_EMPTY_NODE(&cfqg->rb_node))
|
||||||
cfq_rb_erase(&cfqg->rb_node, st);
|
cfq_rb_erase(&cfqg->rb_node, st);
|
||||||
cfqg->saved_workload_slice = 0;
|
cfqg->saved_workload_slice = 0;
|
||||||
blkiocg_update_dequeue_stats(&cfqg->blkg, 1);
|
cfq_blkiocg_update_dequeue_stats(&cfqg->blkg, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int cfq_cfqq_slice_usage(struct cfq_queue *cfqq)
|
static inline unsigned int cfq_cfqq_slice_usage(struct cfq_queue *cfqq)
|
||||||
|
@ -939,8 +939,8 @@ static void cfq_group_served(struct cfq_data *cfqd, struct cfq_group *cfqg,
|
||||||
|
|
||||||
cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime,
|
cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime,
|
||||||
st->min_vdisktime);
|
st->min_vdisktime);
|
||||||
blkiocg_update_timeslice_used(&cfqg->blkg, used_sl);
|
cfq_blkiocg_update_timeslice_used(&cfqg->blkg, used_sl);
|
||||||
blkiocg_set_start_empty_time(&cfqg->blkg);
|
cfq_blkiocg_set_start_empty_time(&cfqg->blkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_CFQ_GROUP_IOSCHED
|
#ifdef CONFIG_CFQ_GROUP_IOSCHED
|
||||||
|
@ -995,7 +995,7 @@ cfq_find_alloc_cfqg(struct cfq_data *cfqd, struct cgroup *cgroup, int create)
|
||||||
|
|
||||||
/* Add group onto cgroup list */
|
/* Add group onto cgroup list */
|
||||||
sscanf(dev_name(bdi->dev), "%u:%u", &major, &minor);
|
sscanf(dev_name(bdi->dev), "%u:%u", &major, &minor);
|
||||||
blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd,
|
cfq_blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd,
|
||||||
MKDEV(major, minor));
|
MKDEV(major, minor));
|
||||||
cfqg->weight = blkcg_get_weight(blkcg, cfqg->blkg.dev);
|
cfqg->weight = blkcg_get_weight(blkcg, cfqg->blkg.dev);
|
||||||
|
|
||||||
|
@ -1079,7 +1079,7 @@ static void cfq_release_cfq_groups(struct cfq_data *cfqd)
|
||||||
* it from cgroup list, then it will take care of destroying
|
* it from cgroup list, then it will take care of destroying
|
||||||
* cfqg also.
|
* cfqg also.
|
||||||
*/
|
*/
|
||||||
if (!blkiocg_del_blkio_group(&cfqg->blkg))
|
if (!cfq_blkiocg_del_blkio_group(&cfqg->blkg))
|
||||||
cfq_destroy_cfqg(cfqd, cfqg);
|
cfq_destroy_cfqg(cfqd, cfqg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1421,10 +1421,10 @@ static void cfq_reposition_rq_rb(struct cfq_queue *cfqq, struct request *rq)
|
||||||
{
|
{
|
||||||
elv_rb_del(&cfqq->sort_list, rq);
|
elv_rb_del(&cfqq->sort_list, rq);
|
||||||
cfqq->queued[rq_is_sync(rq)]--;
|
cfqq->queued[rq_is_sync(rq)]--;
|
||||||
blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(rq),
|
cfq_blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg,
|
||||||
rq_is_sync(rq));
|
rq_data_dir(rq), rq_is_sync(rq));
|
||||||
cfq_add_rq_rb(rq);
|
cfq_add_rq_rb(rq);
|
||||||
blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg,
|
cfq_blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg,
|
||||||
&cfqq->cfqd->serving_group->blkg, rq_data_dir(rq),
|
&cfqq->cfqd->serving_group->blkg, rq_data_dir(rq),
|
||||||
rq_is_sync(rq));
|
rq_is_sync(rq));
|
||||||
}
|
}
|
||||||
|
@ -1482,8 +1482,8 @@ static void cfq_remove_request(struct request *rq)
|
||||||
cfq_del_rq_rb(rq);
|
cfq_del_rq_rb(rq);
|
||||||
|
|
||||||
cfqq->cfqd->rq_queued--;
|
cfqq->cfqd->rq_queued--;
|
||||||
blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(rq),
|
cfq_blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg,
|
||||||
rq_is_sync(rq));
|
rq_data_dir(rq), rq_is_sync(rq));
|
||||||
if (rq_is_meta(rq)) {
|
if (rq_is_meta(rq)) {
|
||||||
WARN_ON(!cfqq->meta_pending);
|
WARN_ON(!cfqq->meta_pending);
|
||||||
cfqq->meta_pending--;
|
cfqq->meta_pending--;
|
||||||
|
@ -1518,8 +1518,8 @@ static void cfq_merged_request(struct request_queue *q, struct request *req,
|
||||||
static void cfq_bio_merged(struct request_queue *q, struct request *req,
|
static void cfq_bio_merged(struct request_queue *q, struct request *req,
|
||||||
struct bio *bio)
|
struct bio *bio)
|
||||||
{
|
{
|
||||||
blkiocg_update_io_merged_stats(&(RQ_CFQG(req))->blkg, bio_data_dir(bio),
|
cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(req))->blkg,
|
||||||
cfq_bio_sync(bio));
|
bio_data_dir(bio), cfq_bio_sync(bio));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1539,8 +1539,8 @@ cfq_merged_requests(struct request_queue *q, struct request *rq,
|
||||||
if (cfqq->next_rq == next)
|
if (cfqq->next_rq == next)
|
||||||
cfqq->next_rq = rq;
|
cfqq->next_rq = rq;
|
||||||
cfq_remove_request(next);
|
cfq_remove_request(next);
|
||||||
blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(next),
|
cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg,
|
||||||
rq_is_sync(next));
|
rq_data_dir(next), rq_is_sync(next));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cfq_allow_merge(struct request_queue *q, struct request *rq,
|
static int cfq_allow_merge(struct request_queue *q, struct request *rq,
|
||||||
|
@ -1571,7 +1571,7 @@ static int cfq_allow_merge(struct request_queue *q, struct request *rq,
|
||||||
static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq)
|
static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq)
|
||||||
{
|
{
|
||||||
del_timer(&cfqd->idle_slice_timer);
|
del_timer(&cfqd->idle_slice_timer);
|
||||||
blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg);
|
cfq_blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cfq_set_active_queue(struct cfq_data *cfqd,
|
static void __cfq_set_active_queue(struct cfq_data *cfqd,
|
||||||
|
@ -1580,7 +1580,7 @@ static void __cfq_set_active_queue(struct cfq_data *cfqd,
|
||||||
if (cfqq) {
|
if (cfqq) {
|
||||||
cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d",
|
cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d",
|
||||||
cfqd->serving_prio, cfqd->serving_type);
|
cfqd->serving_prio, cfqd->serving_type);
|
||||||
blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg);
|
cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg);
|
||||||
cfqq->slice_start = 0;
|
cfqq->slice_start = 0;
|
||||||
cfqq->dispatch_start = jiffies;
|
cfqq->dispatch_start = jiffies;
|
||||||
cfqq->allocated_slice = 0;
|
cfqq->allocated_slice = 0;
|
||||||
|
@ -1911,7 +1911,7 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
|
||||||
sl = cfqd->cfq_slice_idle;
|
sl = cfqd->cfq_slice_idle;
|
||||||
|
|
||||||
mod_timer(&cfqd->idle_slice_timer, jiffies + sl);
|
mod_timer(&cfqd->idle_slice_timer, jiffies + sl);
|
||||||
blkiocg_update_set_idle_time_stats(&cfqq->cfqg->blkg);
|
cfq_blkiocg_update_set_idle_time_stats(&cfqq->cfqg->blkg);
|
||||||
cfq_log_cfqq(cfqd, cfqq, "arm_idle: %lu", sl);
|
cfq_log_cfqq(cfqd, cfqq, "arm_idle: %lu", sl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1931,7 +1931,7 @@ static void cfq_dispatch_insert(struct request_queue *q, struct request *rq)
|
||||||
elv_dispatch_sort(q, rq);
|
elv_dispatch_sort(q, rq);
|
||||||
|
|
||||||
cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]++;
|
cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]++;
|
||||||
blkiocg_update_dispatch_stats(&cfqq->cfqg->blkg, blk_rq_bytes(rq),
|
cfq_blkiocg_update_dispatch_stats(&cfqq->cfqg->blkg, blk_rq_bytes(rq),
|
||||||
rq_data_dir(rq), rq_is_sync(rq));
|
rq_data_dir(rq), rq_is_sync(rq));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3257,7 +3257,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
||||||
cfq_clear_cfqq_wait_request(cfqq);
|
cfq_clear_cfqq_wait_request(cfqq);
|
||||||
__blk_run_queue(cfqd->queue);
|
__blk_run_queue(cfqd->queue);
|
||||||
} else {
|
} else {
|
||||||
blkiocg_update_idle_time_stats(
|
cfq_blkiocg_update_idle_time_stats(
|
||||||
&cfqq->cfqg->blkg);
|
&cfqq->cfqg->blkg);
|
||||||
cfq_mark_cfqq_must_dispatch(cfqq);
|
cfq_mark_cfqq_must_dispatch(cfqq);
|
||||||
}
|
}
|
||||||
|
@ -3285,7 +3285,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq)
|
||||||
rq_set_fifo_time(rq, jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]);
|
rq_set_fifo_time(rq, jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]);
|
||||||
list_add_tail(&rq->queuelist, &cfqq->fifo);
|
list_add_tail(&rq->queuelist, &cfqq->fifo);
|
||||||
cfq_add_rq_rb(rq);
|
cfq_add_rq_rb(rq);
|
||||||
blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg,
|
cfq_blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg,
|
||||||
&cfqd->serving_group->blkg, rq_data_dir(rq),
|
&cfqd->serving_group->blkg, rq_data_dir(rq),
|
||||||
rq_is_sync(rq));
|
rq_is_sync(rq));
|
||||||
cfq_rq_enqueued(cfqd, cfqq, rq);
|
cfq_rq_enqueued(cfqd, cfqq, rq);
|
||||||
|
@ -3373,9 +3373,9 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
|
||||||
WARN_ON(!cfqq->dispatched);
|
WARN_ON(!cfqq->dispatched);
|
||||||
cfqd->rq_in_driver--;
|
cfqd->rq_in_driver--;
|
||||||
cfqq->dispatched--;
|
cfqq->dispatched--;
|
||||||
blkiocg_update_completion_stats(&cfqq->cfqg->blkg, rq_start_time_ns(rq),
|
cfq_blkiocg_update_completion_stats(&cfqq->cfqg->blkg,
|
||||||
rq_io_start_time_ns(rq), rq_data_dir(rq),
|
rq_start_time_ns(rq), rq_io_start_time_ns(rq),
|
||||||
rq_is_sync(rq));
|
rq_data_dir(rq), rq_is_sync(rq));
|
||||||
|
|
||||||
cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--;
|
cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--;
|
||||||
|
|
||||||
|
@ -3739,7 +3739,7 @@ static void cfq_exit_queue(struct elevator_queue *e)
|
||||||
|
|
||||||
cfq_put_async_queues(cfqd);
|
cfq_put_async_queues(cfqd);
|
||||||
cfq_release_cfq_groups(cfqd);
|
cfq_release_cfq_groups(cfqd);
|
||||||
blkiocg_del_blkio_group(&cfqd->root_group.blkg);
|
cfq_blkiocg_del_blkio_group(&cfqd->root_group.blkg);
|
||||||
|
|
||||||
spin_unlock_irq(q->queue_lock);
|
spin_unlock_irq(q->queue_lock);
|
||||||
|
|
||||||
|
@ -3807,8 +3807,8 @@ static void *cfq_init_queue(struct request_queue *q)
|
||||||
*/
|
*/
|
||||||
atomic_set(&cfqg->ref, 1);
|
atomic_set(&cfqg->ref, 1);
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
blkiocg_add_blkio_group(&blkio_root_cgroup, &cfqg->blkg, (void *)cfqd,
|
cfq_blkiocg_add_blkio_group(&blkio_root_cgroup, &cfqg->blkg,
|
||||||
0);
|
(void *)cfqd, 0);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
#ifndef _CFQ_H
|
||||||
|
#define _CFQ_H
|
||||||
|
#include "blk-cgroup.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_CFQ_GROUP_IOSCHED
|
||||||
|
static inline void cfq_blkiocg_update_io_add_stats(struct blkio_group *blkg,
|
||||||
|
struct blkio_group *curr_blkg, bool direction, bool sync)
|
||||||
|
{
|
||||||
|
blkiocg_update_io_add_stats(blkg, curr_blkg, direction, sync);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_dequeue_stats(struct blkio_group *blkg,
|
||||||
|
unsigned long dequeue)
|
||||||
|
{
|
||||||
|
blkiocg_update_dequeue_stats(blkg, dequeue);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_timeslice_used(struct blkio_group *blkg,
|
||||||
|
unsigned long time)
|
||||||
|
{
|
||||||
|
blkiocg_update_timeslice_used(blkg, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_set_start_empty_time(struct blkio_group *blkg)
|
||||||
|
{
|
||||||
|
blkiocg_set_start_empty_time(blkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_io_remove_stats(struct blkio_group *blkg,
|
||||||
|
bool direction, bool sync)
|
||||||
|
{
|
||||||
|
blkiocg_update_io_remove_stats(blkg, direction, sync);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_io_merged_stats(struct blkio_group *blkg,
|
||||||
|
bool direction, bool sync)
|
||||||
|
{
|
||||||
|
blkiocg_update_io_merged_stats(blkg, direction, sync);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_idle_time_stats(struct blkio_group *blkg)
|
||||||
|
{
|
||||||
|
blkiocg_update_idle_time_stats(blkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
cfq_blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg)
|
||||||
|
{
|
||||||
|
blkiocg_update_avg_queue_size_stats(blkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
cfq_blkiocg_update_set_idle_time_stats(struct blkio_group *blkg)
|
||||||
|
{
|
||||||
|
blkiocg_update_set_idle_time_stats(blkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_dispatch_stats(struct blkio_group *blkg,
|
||||||
|
uint64_t bytes, bool direction, bool sync)
|
||||||
|
{
|
||||||
|
blkiocg_update_dispatch_stats(blkg, bytes, direction, sync);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_completion_stats(struct blkio_group *blkg, uint64_t start_time, uint64_t io_start_time, bool direction, bool sync)
|
||||||
|
{
|
||||||
|
cfq_blkiocg_update_completion_stats(blkg, start_time, io_start_time,
|
||||||
|
direction, sync);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_add_blkio_group(struct blkio_cgroup *blkcg,
|
||||||
|
struct blkio_group *blkg, void *key, dev_t dev) {
|
||||||
|
blkiocg_add_blkio_group(blkcg, blkg, key, dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int cfq_blkiocg_del_blkio_group(struct blkio_group *blkg)
|
||||||
|
{
|
||||||
|
return blkiocg_del_blkio_group(blkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* CFQ_GROUP_IOSCHED */
|
||||||
|
static inline void cfq_blkiocg_update_io_add_stats(struct blkio_group *blkg,
|
||||||
|
struct blkio_group *curr_blkg, bool direction, bool sync) {}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_dequeue_stats(struct blkio_group *blkg,
|
||||||
|
unsigned long dequeue) {}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_timeslice_used(struct blkio_group *blkg,
|
||||||
|
unsigned long time) {}
|
||||||
|
static inline void cfq_blkiocg_set_start_empty_time(struct blkio_group *blkg) {}
|
||||||
|
static inline void cfq_blkiocg_update_io_remove_stats(struct blkio_group *blkg,
|
||||||
|
bool direction, bool sync) {}
|
||||||
|
static inline void cfq_blkiocg_update_io_merged_stats(struct blkio_group *blkg,
|
||||||
|
bool direction, bool sync) {}
|
||||||
|
static inline void cfq_blkiocg_update_idle_time_stats(struct blkio_group *blkg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
static inline void
|
||||||
|
cfq_blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg) {}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
cfq_blkiocg_update_set_idle_time_stats(struct blkio_group *blkg) {}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_update_dispatch_stats(struct blkio_group *blkg,
|
||||||
|
uint64_t bytes, bool direction, bool sync) {}
|
||||||
|
static inline void cfq_blkiocg_update_completion_stats(struct blkio_group *blkg, uint64_t start_time, uint64_t io_start_time, bool direction, bool sync) {}
|
||||||
|
|
||||||
|
static inline void cfq_blkiocg_add_blkio_group(struct blkio_cgroup *blkcg,
|
||||||
|
struct blkio_group *blkg, void *key, dev_t dev) {}
|
||||||
|
static inline int cfq_blkiocg_del_blkio_group(struct blkio_group *blkg)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CFQ_GROUP_IOSCHED */
|
||||||
|
#endif
|
Loading…
Reference in New Issue