]> rtime.felk.cvut.cz Git - frescor/frsh.git/blobdiff - resources/disk_bfq/mngr/diskbfq_mngr.c
BFQ: show units with determined throughput
[frescor/frsh.git] / resources / disk_bfq / mngr / diskbfq_mngr.c
index 1fe8afa1f1c077d900b7d1b6bcb0bbaacec263c3..62a95808e58985dc3ad70fb4394dd879054bb601 100644 (file)
@@ -50,6 +50,7 @@
 #include <fres_sa_scenario.h>
 #include <stdbool.h>
 #include <ul_log.h>
+#include <ul_logreg.h>
 #include <stdio.h>
 #include <math.h>
 
@@ -57,7 +58,7 @@
 #include "diskbfq_th.h"
 
 UL_LOG_CUST(ulogd_frm_diskbfq);
-ul_log_domain_t ulogd_fra_fwp = {UL_LOGL_DEB, "frm_diskbfq"};
+ul_log_domain_t ulogd_frm_diskbfq = {UL_LOGL_DEB, "frm_diskbfq"};
 
 struct disk_data {
        double throughput;
@@ -111,7 +112,7 @@ static int diskbfq_admtest(struct fres_sa_scenario *scenario,
        long int sum_weight = 0;
        struct disk_data *data = priv;
 
-       fres_sa_scenario_for_each_contract(scenario, c) {
+       fres_sa_scenario_for_each_no_cancel_contract(scenario, c) {
                fres_block_basic *basic;
                fres_block_resource *resource;
                fres_block_disk_sched *disk_sched;
@@ -123,8 +124,8 @@ static int diskbfq_admtest(struct fres_sa_scenario *scenario,
 
                period = fosa_rel_time_to_nsec(basic->period);
                budget = fosa_rel_time_to_nsec(basic->budget);
-               printf("processing: id=%s, period=%ld ms, budget=%ld ms\n",
-                      id, period, budget);
+               ul_logmsg("processing: id=%s, period=%ld us, budget=%ld us\n",
+                      id, period/1000, budget/1000);
 
                if (c->contract == c->new) {
                        int ret;
@@ -141,27 +142,25 @@ static int diskbfq_admtest(struct fres_sa_scenario *scenario,
                        ret = fres_contract_add_disk_sched(c->contract,
                                                           disk_sched);
                        if (ret) {
-                               fprintf(stderr,
-                                       "Cannot add disk_sched block\n");
+                               ul_logerr("Cannot add disk_sched block\n");
                                free(disk_sched);
                                return -1;
                        }
                } else {
                        disk_sched = fres_contract_get_disk_sched(c->contract);
                        if (!disk_sched) {
-                               fprintf(stderr,
-                                       "disk_sched is not present\n");
+                               ul_logerr("disk_sched is not present\n");
                                return -1;
                        }
                }
                sum_weight += disk_sched->weight;
        }
 
-       printf("sum_weight=%ld, max_weight=%d\n",
-              sum_weight,
-              DISKBFQ_WEIGHT_MAX);
+       ul_logmsg("sum_weight=%ld, max_weight=%d\n",
+                 sum_weight,
+                 DISKBFQ_WEIGHT_MAX);
        *schedulable = sum_weight < DISKBFQ_WEIGHT_MAX;
-       printf("=>%s\n", (*schedulable) ? "schedulable" : "not schedulable");
+       ul_logmsg("=> %s\n", (*schedulable) ? "schedulable" : "not schedulable");
 
        return 0;
 }
@@ -171,19 +170,23 @@ struct disk_data disk;
 static struct fres_res_manager frm = {
        .res_type = FRSH_RT_DISK,
        .res_id = 0,
+       .name = "Disk BFQ",
        .admission_test = diskbfq_admtest,
        .priv = &disk
 };
 
 int main(int argc, char *argv[])
 {
+       forb_init_attr_t attr = { .orb_id = "org.frescor.frm.diskbfq" };
        forb_orb orb;
        FILE* fd;
        int readers = 4;
-       char disk_dev[40], *disk_name = disk_dev;
+       char disk_dev[40] = {0}, *disk_name = disk_dev;
        char path[128], scheduler[128];
        int i, opt, ret;
 
+       ul_logreg_domain(&ulogd_frm_diskbfq);
+
        if (argc < 3) {
 err_usage:
                fprintf(stderr, "Usage:\n %s "
@@ -216,7 +219,10 @@ err_usage:
                }
        }
 
-       orb = forb_init(&argc, &argv, "frm_diskbfq");
+       if (!*disk_name)
+               error(1, 0, "Disk device not specified");
+
+       orb = forb_init(&argc, &argv, &attr);
        if (!orb) error(1, errno, "forb_init");
 
        /*
@@ -226,14 +232,14 @@ err_usage:
        snprintf(path, 128,
                 SYSFS_BFQ_SCHED_PATH,
                 disk_name);
-       if (!(fd = fopen(path, "rw")))
-               error(1, errno, "frm_generic_run");
+       if (!(fd = fopen(path, "r+")))
+               error(1, errno, "fopen(%s)", path);
 
        ret = fscanf(fd, "%128[^\n]", scheduler);
        if (ret == 0 || ret == EOF)
-               error(1, errno, "frm_generic_run");
+               error(1, errno, "fscanf: %s", path);
        if (!strstr(scheduler, SYSFS_BFQ_NAME))
-               error(1, errno, "frm_generic_run");
+               error(1, errno, "bfq not available in kernel");
 
        /**
         * Now check if BFQ is the default I/O scheduler
@@ -245,32 +251,38 @@ err_usage:
                if (ret && ret != EOF)
                        ret = fflush(fd);
                if (ret == 0 || ret == EOF)
-                       error(1, errno, "frm_generic_run");
+                       error(1, errno, "cannot activate bfq scheduler");
        }
        fclose(fd);
 
        snprintf(path, sizeof(path),
                 SYSFS_BFQ_BUDGET_PATH,
                 disk_name);
-       if (!(fd = fopen(path, "r")))
-               error(1, errno, "frm_generic_run");
+       if (!(fd = fopen(path, "r+")))
+               error(1, errno, "fopen(%s)", path);
+
+       ret = fprintf(fd, "256");
+       if (ret == 0)
+               error(1, errno, "fprintf: %s", path);
 
+       rewind(fd);
        ret = fscanf(fd, "%d", &disk.budget);
        if (ret == 0 || ret == EOF)
-               error(1, errno, "frm_generic_run");
+               error(1, errno, "fscanf: %s", path);
        fclose(fd);
 
        /**
         * Estimate the disk throughput in order to achieve
         *  effective weight assignement during runtime.
         **/
+       printf("Throughput estimation...\n");
        disk.throughput = estimate_throughput(disk_dev, readers);
        if (disk.throughput < 0.0)
-               error(1, errno, "frm_generic_run");
+               error(1, errno, "throughput estimation error");
 
        fprintf(stdout, "disk name: %s\n"
                "scheduler: %s\n"
-               "disk aggregate throughput: %f\n"
+               "disk aggregate throughput: %f KiB/s\n"
                "scheduling budget: %d\n",
                disk_name, SYSFS_BFQ_NAME, disk.throughput, disk.budget);
 
@@ -279,7 +291,7 @@ err_usage:
         fres_block_register_disk_sched();
 
        ret = frm_register_and_run(orb, &frm);
-       if (ret) error(1, errno, "frm_generic_run");
+       if (ret) error(1, errno, "frm_register_and_run");
        
        return 0;
 }