Message ID | b2cfd7bfb0ff90063196cb38b4689fb8d2ac9986.1603884539.git.anand.jain@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/4] btrfs: add read_policy latency | expand |
On 28/10/20 10:37 pm, Josef Bacik wrote: > On 10/28/20 9:26 AM, Anand Jain wrote: >> This is a preparatory patch and introduces a new device flag >> 'read_preferred', RW-able using sysfs interface. >> >> Signed-off-by: Anand Jain <anand.jain@oracle.com> >> --- >> fs/btrfs/sysfs.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++ >> fs/btrfs/volumes.h | 1 + >> 2 files changed, 56 insertions(+) >> >> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c >> index 88cbf7b2edf0..52b4c9bef673 100644 >> --- a/fs/btrfs/sysfs.c >> +++ b/fs/btrfs/sysfs.c >> @@ -1413,11 +1413,66 @@ static ssize_t >> btrfs_devinfo_writeable_show(struct kobject *kobj, >> } >> BTRFS_ATTR(devid, writeable, btrfs_devinfo_writeable_show); >> +static ssize_t btrfs_devinfo_read_pref_show(struct kobject *kobj, >> + struct kobj_attribute *a, char *buf) >> +{ >> + int val; >> + struct btrfs_device *device = container_of(kobj, struct >> btrfs_device, >> + devid_kobj); >> + >> + val = !!test_bit(BTRFS_DEV_STATE_READ_PREFERRED, >> &device->dev_state); >> + >> + return snprintf(buf, PAGE_SIZE, "%d\n", val); >> +} >> + >> +static ssize_t btrfs_devinfo_read_pref_store(struct kobject *kobj, >> + struct kobj_attribute *a, >> + const char *buf, size_t len) >> +{ >> + int ret; >> + unsigned long val; >> + struct btrfs_device *device; >> + >> + ret = kstrtoul(skip_spaces(buf), 0, &val); >> + if (ret) >> + return ret; >> + >> + if (val != 0 && val != 1) >> + return -EINVAL; >> + >> + /* >> + * lock is not required, the btrfs_device struct can't be freed >> while >> + * its kobject btrfs_device::devid_kobj is still open. >> + */ >> + device = container_of(kobj, struct btrfs_device, devid_kobj); >> + >> + if (val && >> + ! test_bit(BTRFS_DEV_STATE_READ_PREFERRED, >> &device->dev_state)) { >> + > > No extra space between the ! test_bit, and you don't need these extra > newlines. > Will fix. > I sort of wonder what happens if we have multiple SSD's with multiple > slow disks, we may want to load balance between the SSD's and set the > two SSD's to preferred. But typing it out made me think its not really > related to this change, so don't worry too much about it, just thoughts > for the future. Thanks, > That's true. I had the same challenges when I wrote this. Then later it lead to have device groups, which is for next developments. Thanks, Anand > Josef
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 88cbf7b2edf0..52b4c9bef673 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -1413,11 +1413,66 @@ static ssize_t btrfs_devinfo_writeable_show(struct kobject *kobj, } BTRFS_ATTR(devid, writeable, btrfs_devinfo_writeable_show); +static ssize_t btrfs_devinfo_read_pref_show(struct kobject *kobj, + struct kobj_attribute *a, char *buf) +{ + int val; + struct btrfs_device *device = container_of(kobj, struct btrfs_device, + devid_kobj); + + val = !!test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); + + return snprintf(buf, PAGE_SIZE, "%d\n", val); +} + +static ssize_t btrfs_devinfo_read_pref_store(struct kobject *kobj, + struct kobj_attribute *a, + const char *buf, size_t len) +{ + int ret; + unsigned long val; + struct btrfs_device *device; + + ret = kstrtoul(skip_spaces(buf), 0, &val); + if (ret) + return ret; + + if (val != 0 && val != 1) + return -EINVAL; + + /* + * lock is not required, the btrfs_device struct can't be freed while + * its kobject btrfs_device::devid_kobj is still open. + */ + device = container_of(kobj, struct btrfs_device, devid_kobj); + + if (val && + ! test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state)) { + + set_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); + btrfs_info(device->fs_devices->fs_info, + "set read preferred on devid %llu (%d)", + device->devid, task_pid_nr(current)); + } else if (!val && + test_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state)) { + + clear_bit(BTRFS_DEV_STATE_READ_PREFERRED, &device->dev_state); + btrfs_info(device->fs_devices->fs_info, + "reset read preferred on devid %llu (%d)", + device->devid, task_pid_nr(current)); + } + + return len; +} +BTRFS_ATTR_RW(devid, read_preferred, btrfs_devinfo_read_pref_show, + btrfs_devinfo_read_pref_store); + static struct attribute *devid_attrs[] = { BTRFS_ATTR_PTR(devid, in_fs_metadata), BTRFS_ATTR_PTR(devid, missing), BTRFS_ATTR_PTR(devid, replace_target), BTRFS_ATTR_PTR(devid, writeable), + BTRFS_ATTR_PTR(devid, read_preferred), NULL }; ATTRIBUTE_GROUPS(devid); diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 24db586a9837..f1cbbb18f5ef 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -51,6 +51,7 @@ struct btrfs_io_geometry { #define BTRFS_DEV_STATE_REPLACE_TGT (3) #define BTRFS_DEV_STATE_FLUSH_SENT (4) #define BTRFS_DEV_STATE_NO_READA (5) +#define BTRFS_DEV_STATE_READ_PREFERRED (6) struct btrfs_device { struct list_head dev_list; /* device_list_mutex */
This is a preparatory patch and introduces a new device flag 'read_preferred', RW-able using sysfs interface. Signed-off-by: Anand Jain <anand.jain@oracle.com> --- fs/btrfs/sysfs.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++ fs/btrfs/volumes.h | 1 + 2 files changed, 56 insertions(+)