unsigned long long last_reported_time;
unsigned long long last_read_time;
struct io_stats io_stats;
- unsigned long skips, nskips;
- unsigned long long seq_skips, seq_nskips;
+ unsigned long skips;
+ unsigned long long seq_skips;
unsigned int max_depth[2];
unsigned int cur_depth[2];
struct per_cpu_info *cpus;
};
+/*
+ * some duplicated effort here, we can unify this hash and the ppi hash later
+ */
+struct process_pid_map {
+ pid_t pid;
+ char comm[16];
+ struct process_pid_map *hash_next, *list_next;
+};
+
+#define PPM_HASH_SHIFT (8)
+#define PPM_HASH_SIZE (1 << PPM_HASH_SHIFT)
+#define PPM_HASH_MASK (PPM_HASH_SIZE - 1)
+static struct process_pid_map *ppm_hash_table[PPM_HASH_SIZE];
+
struct per_process_info {
- char name[16];
- __u32 pid;
+ struct process_pid_map *ppm;
struct io_stats io_stats;
struct per_process_info *hash_next, *list_next;
int more_than_one;
static struct per_process_info *ppi_list;
static int ppi_list_entries;
-/*
- * some duplicated effort here, we can unify this hash and the ppi hash later
- */
-struct process_pid_map {
- pid_t pid;
- char comm[16];
- struct process_pid_map *hash_next, *list_next;
-};
-
-#define PPM_HASH_SHIFT (8)
-#define PPM_HASH_SIZE (1 << PPM_HASH_SHIFT)
-#define PPM_HASH_MASK (PPM_HASH_SIZE - 1)
-static struct process_pid_map *ppm_hash_table[PPI_HASH_SIZE];
-
#define S_OPTS "a:A:i:o:b:stqw:f:F:vVhD:"
static struct option l_opts[] = {
{
struct io_track {
struct rb_node rb_node;
+ struct process_pid_map *ppm;
__u64 sector;
- __u32 pid;
- char comm[16];
unsigned long long allocation_time;
unsigned long long queue_time;
unsigned long long dispatch_time;
static inline int ppi_hash(struct per_process_info *ppi)
{
+ struct process_pid_map *ppm = ppi->ppm;
+
if (ppi_hash_by_pid)
- return ppi_hash_pid(ppi->pid);
+ return ppi_hash_pid(ppm->pid);
- return ppi_hash_name(ppi->name);
+ return ppi_hash_name(ppm->comm);
}
static inline void add_ppi_to_hash(struct per_process_info *ppi)
ppi = ppi_hash_table[hash_idx];
while (ppi) {
- if (!strcmp(ppi->name, name))
+ struct process_pid_map *ppm = ppi->ppm;
+
+ if (!strcmp(ppm->comm, name))
return ppi;
ppi = ppi->hash_next;
ppi = ppi_hash_table[hash_idx];
while (ppi) {
- if (ppi->pid == pid)
+ struct process_pid_map *ppm = ppi->ppm;
+
+ if (ppm->pid == pid)
return ppi;
ppi = ppi->hash_next;
return NULL;
ppi = find_ppi_by_name(name);
- if (ppi && ppi->pid != pid)
+ if (ppi && ppi->ppm->pid != pid)
ppi->more_than_one = 1;
return ppi;
iot = __find_track(pdi, sector);
if (!iot) {
- char *name = find_process_name(pid);
-
iot = malloc(sizeof(*iot));
- iot->pid = pid;
- if (name)
- memcpy(iot->comm, name, sizeof(iot->comm));
+ iot->ppm = find_ppm(pid);
iot->sector = sector;
track_rb_insert(pdi, iot);
}
elapsed = iot->queue_time - iot->allocation_time;
if (per_process_stats) {
- struct per_process_info *ppi = find_ppi(iot->pid);
+ struct per_process_info *ppi = find_ppi(iot->ppm->pid);
int w = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0;
if (ppi && elapsed > ppi->longest_allocation_wait[w])
elapsed = iot->dispatch_time - iot->queue_time;
if (per_process_stats) {
- struct per_process_info *ppi = find_ppi(iot->pid);
+ struct per_process_info *ppi = find_ppi(iot->ppm->pid);
int w = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0;
if (ppi && elapsed > ppi->longest_dispatch_wait[w])
elapsed = iot->completion_time - iot->dispatch_time;
if (per_process_stats) {
- struct per_process_info *ppi = find_ppi(iot->pid);
+ struct per_process_info *ppi = find_ppi(iot->ppm->pid);
int w = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0;
if (ppi && elapsed > ppi->longest_completion_wait[w])
struct per_process_info *ppi = find_ppi(pid);
if (!ppi) {
- char *name = find_process_name(pid);
-
ppi = malloc(sizeof(*ppi));
memset(ppi, 0, sizeof(*ppi));
- if (name)
- memcpy(ppi->name, name, 16);
- ppi->pid = pid;
+ ppi->ppm = find_ppm(pid);
add_ppi_to_hash(ppi);
add_ppi_to_list(ppi);
}
struct per_process_info *ppi2 = *((struct per_process_info **) p2);
int res;
- res = strverscmp(ppi1->name, ppi2->name);
+ res = strverscmp(ppi1->ppm->comm, ppi2->ppm->comm);
if (!res)
- res = ppi1->pid > ppi2->pid;
+ res = ppi1->ppm->pid > ppi2->ppm->pid;
return res;
}
ppi = ppi_list;
while (ppi) {
+ struct process_pid_map *ppm = ppi->ppm;
char name[64];
if (ppi->more_than_one)
- sprintf(name, "%s (%u, ...)", ppi->name, ppi->pid);
+ sprintf(name, "%s (%u, ...)", ppm->comm, ppm->pid);
else
- sprintf(name, "%s (%u)", ppi->name, ppi->pid);
+ sprintf(name, "%s (%u)", ppm->comm, ppm->pid);
dump_io_stats(NULL, &ppi->io_stats, name);
dump_wait_stats(ppi);