projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Don't call getpid() in dprint() unless we are going to use it
[fio.git]
/
diskutil.c
diff --git
a/diskutil.c
b/diskutil.c
index 82b393ac92f4f2f4c2e4bc0b6c962ef1a8874589..e90096bee6f5c099c639f0b29ebcd96eb0bfcac8 100644
(file)
--- a/
diskutil.c
+++ b/
diskutil.c
@@
-8,11
+8,27
@@
#include <math.h>
#include "fio.h"
#include <math.h>
#include "fio.h"
+#include "smalloc.h"
+#include "diskutil.h"
static int last_majdev, last_mindev;
static int last_majdev, last_mindev;
+static struct disk_util *last_du;
static struct flist_head disk_list = FLIST_HEAD_INIT(disk_list);
static struct flist_head disk_list = FLIST_HEAD_INIT(disk_list);
+static struct disk_util *__init_per_file_disk_util(struct thread_data *td,
+ int majdev, int mindev, char *path);
+
+static void disk_util_free(struct disk_util *du)
+{
+ if (du == last_du)
+ last_du = NULL;
+
+ fio_mutex_remove(du->lock);
+ sfree(du->name);
+ sfree(du);
+}
+
static int get_io_ticks(struct disk_util *du, struct disk_util_stat *dus)
{
unsigned in_flight;
static int get_io_ticks(struct disk_util *du, struct disk_util_stat *dus)
{
unsigned in_flight;
@@
-53,6
+69,8
@@
static void update_io_tick_disk(struct disk_util *du)
if (get_io_ticks(du, &__dus))
return;
if (get_io_ticks(du, &__dus))
return;
+ if (!du->users)
+ return;
dus = &du->dus;
ldus = &du->last_dus;
dus = &du->dus;
ldus = &du->last_dus;
@@
-167,12
+185,8
@@
static int read_block_dev_entry(char *path, int *maj, int *min)
return 0;
}
return 0;
}
-
-static void __init_per_file_disk_util(struct thread_data *td, int majdev,
- int mindev, char * path);
-
static void find_add_disk_slaves(struct thread_data *td, char *path,
static void find_add_disk_slaves(struct thread_data *td, char *path,
- struct disk_util *masterdu)
+
struct disk_util *masterdu)
{
DIR *dirhandle = NULL;
struct dirent *dirent = NULL;
{
DIR *dirhandle = NULL;
struct dirent *dirent = NULL;
@@
-181,13
+195,14
@@
static void find_add_disk_slaves(struct thread_data *td, char *path,
int majdev, mindev;
ssize_t linklen;
int majdev, mindev;
ssize_t linklen;
- sprintf(slavesdir, "%s/%s",path, "slaves");
+ sprintf(slavesdir, "%s/%s",
path, "slaves");
dirhandle = opendir(slavesdir);
if (!dirhandle)
return;
while ((dirent = readdir(dirhandle)) != NULL) {
dirhandle = opendir(slavesdir);
if (!dirhandle)
return;
while ((dirent = readdir(dirhandle)) != NULL) {
- if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, ".."))
+ if (!strcmp(dirent->d_name, ".") ||
+ !strcmp(dirent->d_name, ".."))
continue;
sprintf(temppath, "%s/%s", slavesdir, dirent->d_name);
continue;
sprintf(temppath, "%s/%s", slavesdir, dirent->d_name);
@@
-195,11
+210,12
@@
static void find_add_disk_slaves(struct thread_data *td, char *path,
* are links to the real directories for the slave
* devices?
*/
* are links to the real directories for the slave
* devices?
*/
- if ((linklen = readlink(temppath, slavepath, PATH_MAX-1)) < 0) {
+ linklen = readlink(temppath, slavepath, PATH_MAX - 0);
+ if (linklen < 0) {
perror("readlink() for slave device.");
return;
}
perror("readlink() for slave device.");
return;
}
- slavepath[linklen]
=
'\0';
+ slavepath[linklen]
=
'\0';
sprintf(temppath, "%s/%s/dev", slavesdir, slavepath);
if (read_block_dev_entry(temppath, &majdev, &mindev)) {
sprintf(temppath, "%s/%s/dev", slavesdir, slavepath);
if (read_block_dev_entry(temppath, &majdev, &mindev)) {
@@
-207,6
+223,13
@@
static void find_add_disk_slaves(struct thread_data *td, char *path,
return;
}
return;
}
+ /*
+ * See if this maj,min already exists
+ */
+ slavedu = disk_util_exists(majdev, mindev);
+ if (slavedu)
+ continue;
+
sprintf(temppath, "%s/%s", slavesdir, slavepath);
__init_per_file_disk_util(td, majdev, mindev, temppath);
slavedu = disk_util_exists(majdev, mindev);
sprintf(temppath, "%s/%s", slavesdir, slavepath);
__init_per_file_disk_util(td, majdev, mindev, temppath);
slavedu = disk_util_exists(majdev, mindev);
@@
-218,29
+241,28
@@
static void find_add_disk_slaves(struct thread_data *td, char *path,
}
closedir(dirhandle);
}
closedir(dirhandle);
- return;
}
}
-
-
-static void disk_util_add(struct thread_data * td, int majdev, int mindev,
- char *path)
+static struct disk_util *disk_util_add(struct thread_data * td, int majdev,
+ int mindev, char *path)
{
struct disk_util *du, *__du;
struct flist_head *entry;
dprint(FD_DISKUTIL, "add maj/min %d/%d: %s\n", majdev, mindev, path);
{
struct disk_util *du, *__du;
struct flist_head *entry;
dprint(FD_DISKUTIL, "add maj/min %d/%d: %s\n", majdev, mindev, path);
- du = malloc(sizeof(*du));
+ du =
s
malloc(sizeof(*du));
memset(du, 0, sizeof(*du));
INIT_FLIST_HEAD(&du->list);
sprintf(du->path, "%s/stat", path);
memset(du, 0, sizeof(*du));
INIT_FLIST_HEAD(&du->list);
sprintf(du->path, "%s/stat", path);
- du->name = strdup(basename(path));
+ du->name = s
malloc_s
trdup(basename(path));
du->sysfs_root = path;
du->major = majdev;
du->minor = mindev;
INIT_FLIST_HEAD(&du->slavelist);
INIT_FLIST_HEAD(&du->slaves);
du->sysfs_root = path;
du->major = majdev;
du->minor = mindev;
INIT_FLIST_HEAD(&du->slavelist);
INIT_FLIST_HEAD(&du->slaves);
+ du->lock = fio_mutex_init(1);
+ du->users = 0;
flist_for_each(entry, &disk_list) {
__du = flist_entry(entry, struct disk_util, list);
flist_for_each(entry, &disk_list) {
__du = flist_entry(entry, struct disk_util, list);
@@
-248,9
+270,8
@@
static void disk_util_add(struct thread_data * td, int majdev, int mindev,
dprint(FD_DISKUTIL, "found %s in list\n", __du->name);
if (!strcmp(du->name, __du->name)) {
dprint(FD_DISKUTIL, "found %s in list\n", __du->name);
if (!strcmp(du->name, __du->name)) {
- free(du->name);
- free(du);
- return;
+ disk_util_free(du);
+ return __du;
}
}
}
}
@@
-261,9
+282,9
@@
static void disk_util_add(struct thread_data * td, int majdev, int mindev,
flist_add_tail(&du->list, &disk_list);
find_add_disk_slaves(td, path, du);
flist_add_tail(&du->list, &disk_list);
find_add_disk_slaves(td, path, du);
+ return du;
}
}
-
static int check_dev_match(int majdev, int mindev, char *path)
{
int major, minor;
static int check_dev_match(int majdev, int mindev, char *path)
{
int major, minor;
@@
-271,9
+292,8
@@
static int check_dev_match(int majdev, int mindev, char *path)
if (read_block_dev_entry(path, &major, &minor))
return 1;
if (read_block_dev_entry(path, &major, &minor))
return 1;
- if (majdev == major && mindev == minor)
{
+ if (majdev == major && mindev == minor)
return 0;
return 0;
- }
return 1;
}
return 1;
}
@@
-330,9
+350,9
@@
static int find_block_dir(int majdev, int mindev, char *path, int link_ok)
return found;
}
return found;
}
-
-
static void __init_per_file_disk_util(struct thread_data *td, int maj
dev,
-
int mindev, char *
path)
+static struct disk_util *__init_per_file_disk_util(struct thread_data *td,
+
int majdev, int min
dev,
+
char *
path)
{
struct stat st;
char tmp[PATH_MAX];
{
struct stat st;
char tmp[PATH_MAX];
@@
-349,7
+369,7
@@
static void __init_per_file_disk_util(struct thread_data *td, int majdev,
sprintf(tmp, "%s/queue", p);
if (stat(tmp, &st)) {
log_err("unknown sysfs layout\n");
sprintf(tmp, "%s/queue", p);
if (stat(tmp, &st)) {
log_err("unknown sysfs layout\n");
- return;
+ return
NULL
;
}
strncpy(tmp, p, PATH_MAX - 1);
sprintf(path, "%s", tmp);
}
strncpy(tmp, p, PATH_MAX - 1);
sprintf(path, "%s", tmp);
@@
-358,20
+378,19
@@
static void __init_per_file_disk_util(struct thread_data *td, int majdev,
if (td->o.ioscheduler && !td->sysfs_root)
td->sysfs_root = strdup(path);
if (td->o.ioscheduler && !td->sysfs_root)
td->sysfs_root = strdup(path);
- disk_util_add(td, majdev, mindev, path);
+
return
disk_util_add(td, majdev, mindev, path);
}
}
-
-
-static void init_per_file_disk_util(struct thread_data *td, char * filename)
+static struct disk_util *init_per_file_disk_util(struct thread_data *td,
+ char *filename)
{
char foo[PATH_MAX];
struct disk_util *du;
int mindev, majdev;
{
char foo[PATH_MAX];
struct disk_util *du;
int mindev, majdev;
- if(get_device_numbers(filename, &majdev, &mindev))
- return;
+ if
(get_device_numbers(filename, &majdev, &mindev))
+ return
NULL
;
dprint(FD_DISKUTIL, "%s belongs to maj/min %d/%d\n", filename, majdev,
mindev);
dprint(FD_DISKUTIL, "%s belongs to maj/min %d/%d\n", filename, majdev,
mindev);
@@
-381,7
+400,7
@@
static void init_per_file_disk_util(struct thread_data *td, char * filename)
if (td->o.ioscheduler && !td->sysfs_root)
td->sysfs_root = strdup(du->sysfs_root);
if (td->o.ioscheduler && !td->sysfs_root)
td->sysfs_root = strdup(du->sysfs_root);
- return;
+ return
du
;
}
/*
}
/*
@@
-391,20
+410,20
@@
static void init_per_file_disk_util(struct thread_data *td, char * filename)
* everything again.
*/
if (mindev == last_mindev && majdev == last_majdev)
* everything again.
*/
if (mindev == last_mindev && majdev == last_majdev)
- return;
+ return
last_du
;
last_mindev = mindev;
last_majdev = majdev;
sprintf(foo, "/sys/block");
if (!find_block_dir(majdev, mindev, foo, 1))
last_mindev = mindev;
last_majdev = majdev;
sprintf(foo, "/sys/block");
if (!find_block_dir(majdev, mindev, foo, 1))
- return;
-
- __init_per_file_disk_util(td, majdev, mindev, foo);
+ return NULL;
+ return __init_per_file_disk_util(td, majdev, mindev, foo);
}
}
-static void __init_disk_util(struct thread_data *td, struct fio_file *f)
+static struct disk_util *__init_disk_util(struct thread_data *td,
+ struct fio_file *f)
{
return init_per_file_disk_util(td, f->file_name);
}
{
return init_per_file_disk_util(td, f->file_name);
}
@@
-419,7
+438,7
@@
void init_disk_util(struct thread_data *td)
return;
for_each_file(td, f, i)
return;
for_each_file(td, f, i)
- __init_disk_util(td, f);
+
f->du =
__init_disk_util(td, f);
}
static void aggregate_slaves_stats(struct disk_util *masterdu)
}
static void aggregate_slaves_stats(struct disk_util *masterdu)
@@
-430,11
+449,11
@@
static void aggregate_slaves_stats(struct disk_util *masterdu)
double util, max_util = 0;
int slavecount = 0;
double util, max_util = 0;
int slavecount = 0;
- unsigned merges[2];
- unsigned ticks[2];
- unsigned time_in_queue;
- unsigned long long sectors[2];
- unsigned ios[2];
+ unsigned merges[2]
= { 0, }
;
+ unsigned ticks[2]
= { 0, }
;
+ unsigned time_in_queue
= { 0, }
;
+ unsigned long long sectors[2]
= { 0, }
;
+ unsigned ios[2]
= { 0, }
;
flist_for_each(entry, &masterdu->slaves) {
slavedu = flist_entry(entry, struct disk_util, slavelist);
flist_for_each(entry, &masterdu->slaves) {
slavedu = flist_entry(entry, struct disk_util, slavelist);
@@
-471,8
+490,6
@@
static void aggregate_slaves_stats(struct disk_util *masterdu)
}
}
-
-
void show_disk_util(void)
{
struct disk_util_stat *dus;
void show_disk_util(void)
{
struct disk_util_stat *dus;
@@
-501,7
+518,7
@@
void show_disk_util(void)
* the master's stats line has been displayed in a
* previous iteration of this loop.
*/
* the master's stats line has been displayed in a
* previous iteration of this loop.
*/
- if(!flist_empty(&du->slavelist))
+ if
(!flist_empty(&du->slavelist))
log_info(" ");
log_info(" %s: ios=%u/%u, merge=%u/%u, ticks=%u/%u, "
log_info(" ");
log_info(" %s: ios=%u/%u, merge=%u/%u, ticks=%u/%u, "
@@
-514,7
+531,7
@@
void show_disk_util(void)
/* If the device has slaves, aggregate the stats for
* those slave devices also.
*/
/* If the device has slaves, aggregate the stats for
* those slave devices also.
*/
- if(!flist_empty(&du->slaves))
+ if
(!flist_empty(&du->slaves))
aggregate_slaves_stats(du);
log_info("\n");
aggregate_slaves_stats(du);
log_info("\n");
@@
-526,7
+543,6
@@
void show_disk_util(void)
flist_for_each_safe(entry, next, &disk_list) {
flist_del(entry);
du = flist_entry(entry, struct disk_util, list);
flist_for_each_safe(entry, next, &disk_list) {
flist_del(entry);
du = flist_entry(entry, struct disk_util, list);
- free(du->name);
- free(du);
+ disk_util_free(du);
}
}
}
}