X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=blktrace.c;h=d0d271f9add5106b4481321058787f1ba1aa82a4;hb=d025d6c67760a52e34e6c7352f33ad5dbbb4f6f4;hp=3a25338cc9ad271a82fa30dbae1aa0ccb0e21cba;hpb=d7a1f72671eb67a7d0cd261ea4520b9551c51f5f;p=blktrace.git diff --git a/blktrace.c b/blktrace.c index 3a25338..d0d271f 100644 --- a/blktrace.c +++ b/blktrace.c @@ -112,6 +112,7 @@ struct devpath { struct cl_host *ch; u32 cl_id; time_t cl_connect_time; + int setup_done; /* ioctl BLKTRACESETUP done */ struct io_info *ios; }; @@ -1066,9 +1067,10 @@ static void close_client_connections(void) } } -static void setup_buts(void) +static int setup_buts(void) { struct list_head *p; + int ret = 0; __list_for_each(p, &devpaths) { struct blk_user_trace_setup buts; @@ -1082,14 +1084,19 @@ static void setup_buts(void) if (ioctl(dpp->fd, BLKTRACESETUP, &buts) >= 0) { dpp->ncpus = max_cpus; dpp->buts_name = strdup(buts.name); + dpp->setup_done = 1; if (dpp->stats) free(dpp->stats); dpp->stats = calloc(dpp->ncpus, sizeof(*dpp->stats)); memset(dpp->stats, 0, dpp->ncpus * sizeof(*dpp->stats)); - } else + } else { fprintf(stderr, "BLKTRACESETUP(2) %s failed: %d/%s\n", dpp->path, errno, strerror(errno)); + ret++; + } } + + return ret; } static void start_buts(void) @@ -1280,7 +1287,8 @@ static void rel_devpaths(void) struct devpath *dpp = list_entry(p, struct devpath, head); list_del(&dpp->head); - __stop_trace(dpp->fd); + if (dpp->setup_done) + __stop_trace(dpp->fd); close(dpp->fd); if (dpp->heads) @@ -1893,6 +1901,26 @@ static int start_tracer(int cpu) return 0; } +static int create_output_files(int cpu) +{ + char fname[MAXPATHLEN + 64]; + struct list_head *p; + FILE *f; + + __list_for_each(p, &devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + + if (fill_ofname(fname, sizeof(fname), NULL, dpp->buts_name, + cpu)) + return 1; + f = my_fopen(fname, "w+"); + if (!f) + return 1; + fclose(f); + } + return 0; +} + static void start_tracers(void) { int cpu, started = 0; @@ -1900,8 +1928,16 @@ static void start_tracers(void) size_t alloc_size = CPU_ALLOC_SIZE(max_cpus); for (cpu = 0; cpu < max_cpus; cpu++) { - if (!CPU_ISSET_S(cpu, alloc_size, online_cpus)) + if (!CPU_ISSET_S(cpu, alloc_size, online_cpus)) { + /* + * Create fake empty output files so that other tools + * like blkparse don't have to bother with sparse CPU + * number space. + */ + if (create_output_files(cpu)) + break; continue; + } if (start_tracer(cpu)) break; started++; @@ -2648,7 +2684,8 @@ static int run_tracers(void) if (net_mode == Net_client) printf("blktrace: connecting to %s\n", hostname); - setup_buts(); + if (setup_buts()) + return 1; if (use_tracer_devpaths()) { if (setup_tracer_devpaths())