From e36c8c53c62768554e8922dc69a30d99bb259f09 Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Wed, 17 Jul 2019 09:53:52 -0400 Subject: [PATCH 1/7] cas_cache: Generic classifier for string conditions. Signed-off-by: Michal Mielewczyk --- modules/cas_cache/classifier.c | 28 ++++++++++++++++++++++++++++ modules/cas_cache/classifier_defs.h | 8 ++++++++ 2 files changed, 36 insertions(+) diff --git a/modules/cas_cache/classifier.c b/modules/cas_cache/classifier.c index 00dd008..99e4220 100644 --- a/modules/cas_cache/classifier.c +++ b/modules/cas_cache/classifier.c @@ -185,6 +185,34 @@ error: return result; } +/* String condition constructor. @data is expected to contain string + * to be matched. */ +static int _cas_cls_string_ctr(struct cas_classifier *cls, + struct cas_cls_condition *c, char *data) +{ + struct cas_cls_string *ctx; + + if (!data || strlen(data) == 0) { + CAS_CLS_MSG(KERN_ERR, "Missing string specifier\n"); + return -EINVAL; + } + + if (strlen(data) > MAX_STRING_SPECIFIER_LEN) { + CAS_CLS_MSG(KERN_ERR, "String specifier to long: %s\n", data); + return -EINVAL; + } + + ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + strcpy(ctx->string, data); + + c->context = ctx; + + return 0; +} + /* Unsigned int numeric test function */ static cas_cls_eval_t _cas_cls_numeric_test_u( struct cas_cls_condition *c, uint64_t val) diff --git a/modules/cas_cache/classifier_defs.h b/modules/cas_cache/classifier_defs.h index 0ce3809..52c4a58 100644 --- a/modules/cas_cache/classifier_defs.h +++ b/modules/cas_cache/classifier_defs.h @@ -6,6 +6,8 @@ #ifndef __CLASSIFIER_DEFS_H__ #define __CLASSIFIER_DEFS_H__ +#define MAX_STRING_SPECIFIER_LEN 256 + /* Rule matches 1:1 with io class. It contains multiple conditions with * associated logical operator (and/or) */ struct cas_cls_rule { @@ -118,6 +120,12 @@ struct cas_cls_numeric { uint64_t v_u64; }; +/* String condition context */ +struct cas_cls_string { + /* String specifier*/ + char string[MAX_STRING_SPECIFIER_LEN]; +}; + /* Directory condition context */ struct cas_cls_directory { /* 1 if directory had been resolved */ From 02f11db3648d73fe0b53b49bfe6a428ada22bbfc Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Tue, 16 Jul 2019 05:51:49 -0400 Subject: [PATCH 2/7] cas_cache: IO classification based on file extension. Signed-off-by: Michal Mielewczyk --- modules/cas_cache/classifier.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/modules/cas_cache/classifier.c b/modules/cas_cache/classifier.c index 99e4220..30aa911 100644 --- a/modules/cas_cache/classifier.c +++ b/modules/cas_cache/classifier.c @@ -445,6 +445,38 @@ static void _cas_cls_directory_dtr(struct cas_classifier *cls, kfree(ctx); } +/* File extension test function */ +static cas_cls_eval_t _cas_cls_extension_test( + struct cas_classifier *cls, struct cas_cls_condition *c, + struct cas_cls_io *io, ocf_part_id_t part_id) +{ + struct cas_cls_string *ctx; + struct inode *inode; + struct dentry *dentry; + char *extension; + + ctx = c->context; + inode = io->inode; + + if (!inode) + return cas_cls_eval_no; + + /* I/O target inode dentry */ + dentry = _cas_cls_dir_get_inode_dentry(inode); + if (!dentry) + return cas_cls_eval_no; + + extension = strrchr(dentry->d_name.name, '.'); + if (!extension) + return cas_cls_eval_no; + + /* First character of @extension is '.', which we don't want to compare */ + if (strcmp(ctx->string, extension + 1) == 0) + return cas_cls_eval_yes; + + return cas_cls_eval_no; +} + /* Array of condition handlers */ static struct cas_cls_condition_handler _handlers[] = { { "done", _cas_cls_done_test, _cas_cls_generic_ctr }, @@ -456,6 +488,8 @@ static struct cas_cls_condition_handler _handlers[] = { _cas_cls_generic_dtr }, { "directory", _cas_cls_directory_test, _cas_cls_directory_ctr, _cas_cls_directory_dtr }, + { "extension", _cas_cls_extension_test, _cas_cls_string_ctr, + _cas_cls_generic_dtr }, #ifdef CAS_WLTH_SUPPORT { "wlth", _cas_cls_wlth_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr}, From 7c4114b7bd626644132d7c720562a24ece977d85 Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Wed, 17 Jul 2019 06:25:32 -0400 Subject: [PATCH 3/7] cas_cache: IO classification based on LBA. Signed-off-by: Michal Mielewczyk --- modules/cas_cache/classifier.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/cas_cache/classifier.c b/modules/cas_cache/classifier.c index 30aa911..c059ea7 100644 --- a/modules/cas_cache/classifier.c +++ b/modules/cas_cache/classifier.c @@ -477,6 +477,16 @@ static cas_cls_eval_t _cas_cls_extension_test( return cas_cls_eval_no; } +/* LBA test function */ +static cas_cls_eval_t _cas_cls_lba_test( + struct cas_classifier *cls, struct cas_cls_condition *c, + struct cas_cls_io *io, ocf_part_id_t part_id) +{ + uint64_t lba = CAS_BIO_BISECTOR(io->bio); + + return _cas_cls_numeric_test_u(c, lba); +} + /* Array of condition handlers */ static struct cas_cls_condition_handler _handlers[] = { { "done", _cas_cls_done_test, _cas_cls_generic_ctr }, @@ -490,6 +500,7 @@ static struct cas_cls_condition_handler _handlers[] = { _cas_cls_directory_dtr }, { "extension", _cas_cls_extension_test, _cas_cls_string_ctr, _cas_cls_generic_dtr }, + { "lba", _cas_cls_lba_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr }, #ifdef CAS_WLTH_SUPPORT { "wlth", _cas_cls_wlth_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr}, From c2eef6fe642c5066e89abe123fad0ffee81f9c47 Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Wed, 17 Jul 2019 09:11:27 -0400 Subject: [PATCH 4/7] cas_cache: IO classification based on PID. Signed-off-by: Michal Mielewczyk --- modules/cas_cache/classifier.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/cas_cache/classifier.c b/modules/cas_cache/classifier.c index c059ea7..ee66a32 100644 --- a/modules/cas_cache/classifier.c +++ b/modules/cas_cache/classifier.c @@ -487,6 +487,18 @@ static cas_cls_eval_t _cas_cls_lba_test( return _cas_cls_numeric_test_u(c, lba); } +/* PID test function */ +static cas_cls_eval_t _cas_cls_pid_test( + struct cas_classifier *cls, struct cas_cls_condition *c, + struct cas_cls_io *io, ocf_part_id_t part_id) +{ + /* 'current' is kernel macro that allows to access control block of + currently executing task */ + struct task_struct *ti = current; + + return _cas_cls_numeric_test_u(c, ti->pid); +} + /* Array of condition handlers */ static struct cas_cls_condition_handler _handlers[] = { { "done", _cas_cls_done_test, _cas_cls_generic_ctr }, @@ -501,6 +513,7 @@ static struct cas_cls_condition_handler _handlers[] = { { "extension", _cas_cls_extension_test, _cas_cls_string_ctr, _cas_cls_generic_dtr }, { "lba", _cas_cls_lba_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr }, + { "pid", _cas_cls_pid_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr }, #ifdef CAS_WLTH_SUPPORT { "wlth", _cas_cls_wlth_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr}, From 441508a6dec33891e0d02f3a137c53f10237eb6e Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Wed, 17 Jul 2019 10:40:06 -0400 Subject: [PATCH 5/7] cas_cache: IO classification based on process name. Signed-off-by: Michal Mielewczyk --- modules/cas_cache/classifier.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/modules/cas_cache/classifier.c b/modules/cas_cache/classifier.c index ee66a32..1ffd389 100644 --- a/modules/cas_cache/classifier.c +++ b/modules/cas_cache/classifier.c @@ -499,6 +499,27 @@ static cas_cls_eval_t _cas_cls_pid_test( return _cas_cls_numeric_test_u(c, ti->pid); } +/* Process name test function */ +static cas_cls_eval_t _cas_cls_process_name_test( + struct cas_classifier *cls, struct cas_cls_condition *c, + struct cas_cls_io *io, ocf_part_id_t part_id) +{ + struct cas_cls_string *ctx; + /* 'current' is kernel macro that allows to access control block of + currently executing task */ + struct task_struct *ti = current; + char comm[TASK_COMM_LEN]; + + ctx = c->context; + + get_task_comm(comm, ti); + + if (strcmp(ctx->string, comm) == 0) + return cas_cls_eval_yes; + + return cas_cls_eval_no; +} + /* Array of condition handlers */ static struct cas_cls_condition_handler _handlers[] = { { "done", _cas_cls_done_test, _cas_cls_generic_ctr }, @@ -514,6 +535,8 @@ static struct cas_cls_condition_handler _handlers[] = { _cas_cls_generic_dtr }, { "lba", _cas_cls_lba_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr }, { "pid", _cas_cls_pid_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr }, + { "process_name", _cas_cls_process_name_test, _cas_cls_string_ctr, + _cas_cls_generic_dtr }, #ifdef CAS_WLTH_SUPPORT { "wlth", _cas_cls_wlth_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr}, From a93cf22b60ca6150f50f71dc91b0f676e281cd89 Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Mon, 22 Jul 2019 06:18:07 -0400 Subject: [PATCH 6/7] cas_cache: IO classification based on offset in file. Signed-off-by: Michal Mielewczyk --- modules/cas_cache/classifier.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/modules/cas_cache/classifier.c b/modules/cas_cache/classifier.c index 1ffd389..b2d59b2 100644 --- a/modules/cas_cache/classifier.c +++ b/modules/cas_cache/classifier.c @@ -520,6 +520,31 @@ static cas_cls_eval_t _cas_cls_process_name_test( return cas_cls_eval_no; } +/* File offset test function */ +static cas_cls_eval_t _cas_cls_file_offset_test( + struct cas_classifier *cls, struct cas_cls_condition *c, + struct cas_cls_io *io, ocf_part_id_t part_id) +{ + struct inode *inode; + struct dentry *dentry; + uint64_t offset; + + inode = io->inode; + + if (!inode) + return cas_cls_eval_no; + + /* I/O target inode dentry */ + dentry = _cas_cls_dir_get_inode_dentry(inode); + if (!dentry) + return cas_cls_eval_no; + + offset = PAGE_SIZE * io->page->index + + io->bio->bi_io_vec->bv_offset; + + return _cas_cls_numeric_test_u(c, offset); +} + /* Array of condition handlers */ static struct cas_cls_condition_handler _handlers[] = { { "done", _cas_cls_done_test, _cas_cls_generic_ctr }, @@ -537,6 +562,8 @@ static struct cas_cls_condition_handler _handlers[] = { { "pid", _cas_cls_pid_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr }, { "process_name", _cas_cls_process_name_test, _cas_cls_string_ctr, _cas_cls_generic_dtr }, + { "file_offset", _cas_cls_file_offset_test, _cas_cls_numeric_ctr, + _cas_cls_generic_dtr }, #ifdef CAS_WLTH_SUPPORT { "wlth", _cas_cls_wlth_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr}, From 83a3cb693f9bd6562649f767510fd029cf14cdb5 Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Tue, 23 Jul 2019 03:23:53 -0400 Subject: [PATCH 7/7] cas_cache: IO classification based on request size. Signed-off-by: Michal Mielewczyk --- modules/cas_cache/classifier.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/cas_cache/classifier.c b/modules/cas_cache/classifier.c index b2d59b2..e2a64a0 100644 --- a/modules/cas_cache/classifier.c +++ b/modules/cas_cache/classifier.c @@ -545,6 +545,14 @@ static cas_cls_eval_t _cas_cls_file_offset_test( return _cas_cls_numeric_test_u(c, offset); } +/* Request size test function */ +static cas_cls_eval_t _cas_cls_request_size_test( + struct cas_classifier *cls, struct cas_cls_condition *c, + struct cas_cls_io *io, ocf_part_id_t part_id) +{ + return _cas_cls_numeric_test_u(c, CAS_BIO_BISIZE(io->bio)); +} + /* Array of condition handlers */ static struct cas_cls_condition_handler _handlers[] = { { "done", _cas_cls_done_test, _cas_cls_generic_ctr }, @@ -564,6 +572,8 @@ static struct cas_cls_condition_handler _handlers[] = { _cas_cls_generic_dtr }, { "file_offset", _cas_cls_file_offset_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr }, + { "request_size", _cas_cls_request_size_test, _cas_cls_numeric_ctr, + _cas_cls_generic_dtr }, #ifdef CAS_WLTH_SUPPORT { "wlth", _cas_cls_wlth_test, _cas_cls_numeric_ctr, _cas_cls_generic_dtr},