Skip to content

Commit

Permalink
block: remove rcu_read_lock() from part_stat_lock()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
koct9i authored and axboe committed May 27, 2020
1 parent b5af37a commit 8ab1d40
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 5 deletions.
11 changes: 8 additions & 3 deletions block/genhd.c
Original file line number Diff line number Diff line change
Expand Up @@ -321,11 +321,12 @@ struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector)
struct hd_struct *part;
int i;

rcu_read_lock();
ptbl = rcu_dereference(disk->part_tbl);

part = rcu_dereference(ptbl->last_lookup);
if (part && sector_in_part(part, sector) && hd_struct_try_get(part))
return part;
goto out_unlock;

for (i = 1; i < ptbl->len; i++) {
part = rcu_dereference(ptbl->part[i]);
Expand All @@ -339,10 +340,14 @@ struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector)
if (!hd_struct_try_get(part))
break;
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;
}

/**
Expand Down
4 changes: 2 additions & 2 deletions include/linux/part_stat.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ struct disk_stats {
*
* part_stat_read() can be called at any time.
*/
#define part_stat_lock() ({ rcu_read_lock(); get_cpu(); })
#define part_stat_unlock() do { put_cpu(); rcu_read_unlock(); } while (0)
#define part_stat_lock() preempt_disable()
#define part_stat_unlock() preempt_enable()

#define part_stat_get_cpu(part, field, cpu) \
(per_cpu_ptr((part)->dkstats, (cpu))->field)
Expand Down

0 comments on commit 8ab1d40

Please sign in to comment.