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>tirimbino
parent
c10b61f091
commit
e98ef89b30
@ -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