Balance RAID1/RAID10 mirror selection via plain round-robin scheduling. This should roughly double throughput for large reads.
Signed-off-by: Louis Jencka <louis@waffle.tech>
return &fs_uuids;
}
+/* Used for round-robin balancing RAID1/RAID10 reads. */
+atomic_t rr_counter = ATOMIC_INIT(0);
+
/*
* Allocate new btrfs_fs_devices structure identified by a fsid.
*
WRITE_ONCE(fs_info->fs_devices->read_policy, BTRFS_READ_POLICY_PID);
fallthrough;
case BTRFS_READ_POLICY_PID:
- preferred_mirror = first + (current->pid % num_stripes);
+ preferred_mirror = first +
+ (unsigned)atomic_inc_return(&rr_counter) % num_stripes;
break;
#ifdef CONFIG_BTRFS_EXPERIMENTAL
case BTRFS_READ_POLICY_RR: