block: remove rcu_read_lock() from part_stat_lock()
The RCU lock is required only in disk_map_sector_rcu() to lookup the partition. After that request holds reference to related hd_struct. Replace get_cpu() with preempt_disable() - returned cpu index is unused. [hch: rebased] Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
b5af37ab3a
commit
8ab1d40a64
@ -321,11 +321,12 @@ struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector)
|
|||||||
struct hd_struct *part;
|
struct hd_struct *part;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
ptbl = rcu_dereference(disk->part_tbl);
|
ptbl = rcu_dereference(disk->part_tbl);
|
||||||
|
|
||||||
part = rcu_dereference(ptbl->last_lookup);
|
part = rcu_dereference(ptbl->last_lookup);
|
||||||
if (part && sector_in_part(part, sector) && hd_struct_try_get(part))
|
if (part && sector_in_part(part, sector) && hd_struct_try_get(part))
|
||||||
return part;
|
goto out_unlock;
|
||||||
|
|
||||||
for (i = 1; i < ptbl->len; i++) {
|
for (i = 1; i < ptbl->len; i++) {
|
||||||
part = rcu_dereference(ptbl->part[i]);
|
part = rcu_dereference(ptbl->part[i]);
|
||||||
@ -339,10 +340,14 @@ struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector)
|
|||||||
if (!hd_struct_try_get(part))
|
if (!hd_struct_try_get(part))
|
||||||
break;
|
break;
|
||||||
rcu_assign_pointer(ptbl->last_lookup, part);
|
rcu_assign_pointer(ptbl->last_lookup, part);
|
||||||
return part;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &disk->part0;
|
|
||||||
|
part = &disk->part0;
|
||||||
|
out_unlock:
|
||||||
|
rcu_read_unlock();
|
||||||
|
return part;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,8 +21,8 @@ struct disk_stats {
|
|||||||
*
|
*
|
||||||
* part_stat_read() can be called at any time.
|
* part_stat_read() can be called at any time.
|
||||||
*/
|
*/
|
||||||
#define part_stat_lock() ({ rcu_read_lock(); get_cpu(); })
|
#define part_stat_lock() preempt_disable()
|
||||||
#define part_stat_unlock() do { put_cpu(); rcu_read_unlock(); } while (0)
|
#define part_stat_unlock() preempt_enable()
|
||||||
|
|
||||||
#define part_stat_get_cpu(part, field, cpu) \
|
#define part_stat_get_cpu(part, field, cpu) \
|
||||||
(per_cpu_ptr((part)->dkstats, (cpu))->field)
|
(per_cpu_ptr((part)->dkstats, (cpu))->field)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user