Sorry, ignore this. I've sent this wrong. :(
2021년 1월 16일 (토) 오전 9:58, Daeho Jeong <daeh...@gmail.com>님이 작성: > > From: Daeho Jeong <daehoje...@google.com> > > Added "ckpt_thread_ioprio" sysfs node to give a way to change checkpoint > merge daemon's io priority. Its default value is "be,3", which means > "BE" I/O class and I/O priority "3". We can select the class between "rt" > and "be", and set the I/O priority within valid range of it. > "," delimiter is necessary in between I/O class and priority number. > > Signed-off-by: Daeho Jeong <daehoje...@google.com> > --- > v2: > - adapt to inlining ckpt_req_control of f2fs_sb_info > --- > Documentation/ABI/testing/sysfs-fs-f2fs | 8 ++++ > fs/f2fs/checkpoint.c | 2 +- > fs/f2fs/f2fs.h | 1 + > fs/f2fs/sysfs.c | 51 +++++++++++++++++++++++++ > 4 files changed, 61 insertions(+), 1 deletion(-) > > diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs > b/Documentation/ABI/testing/sysfs-fs-f2fs > index 3dfee94e0618..0c48b2e7dfd4 100644 > --- a/Documentation/ABI/testing/sysfs-fs-f2fs > +++ b/Documentation/ABI/testing/sysfs-fs-f2fs > @@ -377,3 +377,11 @@ Description: This gives a control to limit the bio > size in f2fs. > Default is zero, which will follow underlying block layer > limit, > whereas, if it has a certain bytes value, f2fs won't submit a > bio larger than that size. > +What: /sys/fs/f2fs/<disk>/ckpt_thread_ioprio > +Date: January 2021 > +Contact: "Daeho Jeong" <daehoje...@google.com> > +Description: Give a way to change checkpoint merge daemon's io priority. > + Its default value is "be,3", which means "BE" I/O class and > + I/O priority "3". We can select the class between "rt" and > "be", > + and set the I/O priority within valid range of it. "," > delimiter > + is necessary in between I/O class and priority number. > diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c > index ef6ad3d1957d..30e3fe161bb4 100644 > --- a/fs/f2fs/checkpoint.c > +++ b/fs/f2fs/checkpoint.c > @@ -1854,7 +1854,7 @@ int f2fs_start_ckpt_thread(struct f2fs_sb_info *sbi) > return PTR_ERR(cprc->f2fs_issue_ckpt); > } > > - set_task_ioprio(cprc->f2fs_issue_ckpt, DEFAULT_CHECKPOINT_IOPRIO); > + set_task_ioprio(cprc->f2fs_issue_ckpt, cprc->ckpt_thread_ioprio); > > return 0; > } > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index f2ae075aa723..517eb0eda638 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -276,6 +276,7 @@ struct ckpt_req { > > struct ckpt_req_control { > struct task_struct *f2fs_issue_ckpt; /* checkpoint task */ > + int ckpt_thread_ioprio; /* checkpoint merge thread > ioprio */ > wait_queue_head_t ckpt_wait_queue; /* waiting queue for wake-up > */ > atomic_t issued_ckpt; /* # of actually issued ckpts */ > atomic_t total_ckpt; /* # of total ckpts */ > diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c > index 30bae57428d1..ddd70395148d 100644 > --- a/fs/f2fs/sysfs.c > +++ b/fs/f2fs/sysfs.c > @@ -11,6 +11,7 @@ > #include <linux/f2fs_fs.h> > #include <linux/seq_file.h> > #include <linux/unicode.h> > +#include <linux/ioprio.h> > > #include "f2fs.h" > #include "segment.h" > @@ -34,6 +35,7 @@ enum { > FAULT_INFO_TYPE, /* struct f2fs_fault_info */ > #endif > RESERVED_BLOCKS, /* struct f2fs_sb_info */ > + CPRC_INFO, /* struct ckpt_req_control */ > }; > > struct f2fs_attr { > @@ -70,6 +72,8 @@ static unsigned char *__struct_ptr(struct f2fs_sb_info > *sbi, int struct_type) > else if (struct_type == STAT_INFO) > return (unsigned char *)F2FS_STAT(sbi); > #endif > + else if (struct_type == CPRC_INFO) > + return (unsigned char *)&sbi->cprc_info; > return NULL; > } > > @@ -255,6 +259,23 @@ static ssize_t f2fs_sbi_show(struct f2fs_attr *a, > return len; > } > > + if (!strcmp(a->attr.name, "ckpt_thread_ioprio")) { > + struct ckpt_req_control *cprc = &sbi->cprc_info; > + int len = 0; > + int class = IOPRIO_PRIO_CLASS(cprc->ckpt_thread_ioprio); > + int data = IOPRIO_PRIO_DATA(cprc->ckpt_thread_ioprio); > + > + if (class == IOPRIO_CLASS_RT) > + len += scnprintf(buf + len, PAGE_SIZE - len, "rt,"); > + else if (class == IOPRIO_CLASS_BE) > + len += scnprintf(buf + len, PAGE_SIZE - len, "be,"); > + else > + return -EINVAL; > + > + len += scnprintf(buf + len, PAGE_SIZE - len, "%d\n", data); > + return len; > + } > + > ui = (unsigned int *)(ptr + a->offset); > > return sprintf(buf, "%u\n", *ui); > @@ -308,6 +329,34 @@ static ssize_t __sbi_store(struct f2fs_attr *a, > return ret ? ret : count; > } > > + if (!strcmp(a->attr.name, "ckpt_thread_ioprio")) { > + const char *name = strim((char *)buf); > + struct ckpt_req_control *cprc = &sbi->cprc_info; > + int class; > + long data; > + int ret; > + > + if (!strncmp(name, "rt,", 3)) > + class = IOPRIO_CLASS_RT; > + else if (!strncmp(name, "be,", 3)) > + class = IOPRIO_CLASS_BE; > + else > + return -EINVAL; > + > + name += 3; > + ret = kstrtol(name, 10, &data); > + if (ret) > + return ret; > + if (data >= IOPRIO_BE_NR || data < 0) > + return -EINVAL; > + > + cprc->ckpt_thread_ioprio = IOPRIO_PRIO_VALUE(class, data); > + ret = set_task_ioprio(cprc->f2fs_issue_ckpt, > + cprc->ckpt_thread_ioprio); > + > + return count; > + } > + > ui = (unsigned int *)(ptr + a->offset); > > ret = kstrtoul(skip_spaces(buf), 0, &t); > @@ -567,6 +616,7 @@ F2FS_RW_ATTR(FAULT_INFO_TYPE, f2fs_fault_info, > inject_type, inject_type); > #endif > F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, data_io_flag, data_io_flag); > F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, node_io_flag, node_io_flag); > +F2FS_RW_ATTR(CPRC_INFO, ckpt_req_control, ckpt_thread_ioprio, > ckpt_thread_ioprio); > F2FS_GENERAL_RO_ATTR(dirty_segments); > F2FS_GENERAL_RO_ATTR(free_segments); > F2FS_GENERAL_RO_ATTR(lifetime_write_kbytes); > @@ -652,6 +702,7 @@ static struct attribute *f2fs_attrs[] = { > #endif > ATTR_LIST(data_io_flag), > ATTR_LIST(node_io_flag), > + ATTR_LIST(ckpt_thread_ioprio), > ATTR_LIST(dirty_segments), > ATTR_LIST(free_segments), > ATTR_LIST(unusable), > -- > 2.30.0.296.g2bfb1c46d8-goog >