📄 obd.c
字号:
if (argc < 2 || argc > 4) return CMD_HELP; IOC_INIT(data); count = strtoull(argv[1], &end, 0); if (*end) { fprintf(stderr, "error: %s: invalid iteration count '%s'\n", jt_cmdname(argv[0]), argv[1]); return CMD_HELP; } if (argc >= 3) { verbose = get_verbose(argv[0], argv[2]); if (verbose == BAD_VERBOSE) return CMD_HELP; } if (argc >= 4) { if (argv[3][0] == 't') { objid = strtoull(argv[3] + 1, &end, 0); if (thread) objid += thread - 1; } else objid = strtoull(argv[3], &end, 0); if (*end) { fprintf(stderr, "error: %s: invalid objid '%s'\n", jt_cmdname(argv[0]), argv[3]); return CMD_HELP; } } gettimeofday(&start, NULL); next_time.tv_sec = start.tv_sec - verbose; next_time.tv_usec = start.tv_usec; if (verbose != 0) printf("%s: getting "LPD64" attrs (objid "LPX64"): %s", jt_cmdname(argv[0]), count, objid, ctime(&start.tv_sec)); for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) { data.ioc_obdo1.o_id = objid; data.ioc_obdo1.o_mode = S_IFREG; data.ioc_obdo1.o_valid = 0xffffffff; IOC_PACK(argv[0], data); rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_GETATTR, &data); shmem_bump(); if (rc < 0) { fprintf(stderr, "error: %s: #"LPD64" - %d:%s\n", jt_cmdname(argv[0]), i, errno, strerror(rc = errno)); break; } else { if (be_verbose (verbose, &next_time, i, &next_count, count)) printf("%s: got attr #"LPD64"\n", jt_cmdname(argv[0]), i); } } if (!rc) { struct timeval end; double diff; gettimeofday(&end, NULL); diff = difftime(&end, &start); --i; if (verbose != 0) printf("%s: "LPD64" attrs in %.3fs (%.3f attr/s): %s", jt_cmdname(argv[0]), i, diff, i / diff, ctime(&end.tv_sec)); } return rc;}/* test_brw <cnt> count <r|w[r(repeat)x(noverify)]> mode <q|v|#(print interval)> verbosity <npages[+offset]> blocksize <[[<interleave_threads>]t(inc obj by thread#)]obj> object [p|g<args>] batch */int jt_obd_test_brw(int argc, char **argv){ struct obd_ioctl_data data; struct timeval start, next_time; __u64 count, next_count, len, stride, thr_offset = 0, objid = 3; int write = 0, verbose = 1, cmd, i, rc = 0, pages = 1; int offset_pages = 0; long n; int repeat_offset = 0; unsigned long long ull; int nthr_per_obj = 0; int verify = 1; int obj_idx = 0; char *end; if (argc < 2 || argc > 7) { fprintf(stderr, "error: %s: bad number of arguments: %d\n", jt_cmdname(argv[0]), argc); return CMD_HELP; } count = strtoull(argv[1], &end, 0); if (*end) { fprintf(stderr, "error: %s: bad iteration count '%s'\n", jt_cmdname(argv[0]), argv[1]); return CMD_HELP; } if (argc >= 3) { if (argv[2][0] == 'w' || argv[2][0] == '1') write = 1; /* else it's a read */ if (argv[2][0] != 0) for (i = 1; argv[2][i] != 0; i++) switch (argv[2][i]) { case 'r': repeat_offset = 1; break; case 'x': verify = 0; break; default: fprintf (stderr, "Can't parse cmd '%s'\n", argv[2]); return CMD_HELP; } } if (argc >= 4) { verbose = get_verbose(argv[0], argv[3]); if (verbose == BAD_VERBOSE) return CMD_HELP; } if (argc >= 5) { pages = strtoul(argv[4], &end, 0); if (*end == '+') offset_pages = strtoul(end + 1, &end, 0); if (*end != 0 || offset_pages < 0 || offset_pages >= pages) { fprintf(stderr, "error: %s: bad npages[+offset] parameter '%s'\n", jt_cmdname(argv[0]), argv[4]); return CMD_HELP; } } if (argc >= 6) { if (thread && (n = strtol(argv[5], &end, 0)) > 0 && *end == 't' && (ull = strtoull(end + 1, &end, 0)) > 0 && *end == 0) { nthr_per_obj = n; objid = ull; } else if (thread && argv[5][0] == 't') { nthr_per_obj = 1; objid = strtoull(argv[5] + 1, &end, 0); } else { nthr_per_obj = 0; objid = strtoull(argv[5], &end, 0); } if (*end) { fprintf(stderr, "error: %s: bad objid '%s'\n", jt_cmdname(argv[0]), argv[5]); return CMD_HELP; } } IOC_INIT(data); /* communicate the 'type' of brw test and batching to echo_client. * don't start. we'd love to refactor this lctl->echo_client * interface */ data.ioc_pbuf1 = (void *)1; data.ioc_plen1 = 1; if (argc >= 7) { switch(argv[6][0]) { case 'g': /* plug and unplug */ data.ioc_pbuf1 = (void *)2; data.ioc_plen1 = strtoull(argv[6] + 1, &end, 0); break; case 'p': /* prep and commit */ data.ioc_pbuf1 = (void *)3; data.ioc_plen1 = strtoull(argv[6] + 1, &end, 0); break; default: fprintf(stderr, "error: %s: batching '%s' " "needs to specify 'p' or 'g'\n", jt_cmdname(argv[0]), argv[6]); return CMD_HELP; } if (*end) { fprintf(stderr, "error: %s: bad batching '%s'\n", jt_cmdname(argv[0]), argv[6]); return CMD_HELP; } data.ioc_plen1 *= getpagesize(); } len = pages * getpagesize(); thr_offset = offset_pages * getpagesize(); stride = len;#ifdef MAX_THREADS if (thread) { shmem_lock (); if (nthr_per_obj != 0) { /* threads interleave */ obj_idx = (thread - 1)/nthr_per_obj; objid += obj_idx; stride *= nthr_per_obj; if (thread == 1) shared_data->offsets[obj_idx] = stride + thr_offset; thr_offset += ((thread - 1) % nthr_per_obj) * len; } else { /* threads disjoint */ thr_offset += (thread - 1) * len; } shared_data->barrier--; if (shared_data->barrier == 0) l_cond_broadcast(&shared_data->cond); else l_cond_wait(&shared_data->cond, &shared_data->mutex); shmem_unlock (); }#endif data.ioc_obdo1.o_id = objid; data.ioc_obdo1.o_mode = S_IFREG; data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE | OBD_MD_FLFLAGS; data.ioc_obdo1.o_flags = (verify ? OBD_FL_DEBUG_CHECK : 0); data.ioc_count = len; data.ioc_offset = (repeat_offset ? 0 : thr_offset); gettimeofday(&start, NULL); next_time.tv_sec = start.tv_sec - verbose; next_time.tv_usec = start.tv_usec; if (verbose != 0) printf("%s: %s "LPU64"x%d pages (obj "LPX64", off "LPU64"): %s", jt_cmdname(argv[0]), write ? "writing" : "reading", count, pages, objid, data.ioc_offset, ctime(&start.tv_sec)); cmd = write ? OBD_IOC_BRW_WRITE : OBD_IOC_BRW_READ; for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) { data.ioc_obdo1.o_valid &= ~(OBD_MD_FLBLOCKS|OBD_MD_FLGRANT); IOC_PACK(argv[0], data); rc = l2_ioctl(OBD_DEV_ID, cmd, buf); shmem_bump(); if (rc) { fprintf(stderr, "error: %s: #%d - %s on %s\n", jt_cmdname(argv[0]), i, strerror(rc = errno), write ? "write" : "read"); break; } else if (be_verbose(verbose, &next_time,i, &next_count,count)) { shmem_lock (); printf("%s: %s number %d @ "LPD64":"LPU64" for %d\n", jt_cmdname(argv[0]), write ? "write" : "read", i, data.ioc_obdo1.o_id, data.ioc_offset, (int)(pages * getpagesize())); shmem_unlock (); } if (!repeat_offset) {#ifdef MAX_THREADS if (stride == len) { data.ioc_offset += stride; } else if (i < count) { shmem_lock (); data.ioc_offset = shared_data->offsets[obj_idx]; shared_data->offsets[obj_idx] += len; shmem_unlock (); }#else data.ioc_offset += len; obj_idx = 0; /* avoids an unused var warning */#endif } } if (!rc) { struct timeval end; double diff; gettimeofday(&end, NULL); diff = difftime(&end, &start); --i; if (verbose != 0) printf("%s: %s %dx%d pages in %.3fs (%.3f MB/s): %s", jt_cmdname(argv[0]), write ? "wrote" : "read", i, pages, diff, ((double)i * pages * getpagesize()) / (diff * 1048576.0), ctime(&end.tv_sec)); } return rc;}int jt_obd_lov_getconfig(int argc, char **argv){ struct obd_ioctl_data data; struct lov_desc desc; struct obd_uuid *uuidarray; __u32 *obdgens; char *path; int rc, fd; IOC_INIT(data); if (argc != 2) return CMD_HELP; path = argv[1]; fd = open(path, O_RDONLY); if (fd < 0) { fprintf(stderr, "open \"%s\" failed: %s\n", path, strerror(errno)); return -errno; } memset(&desc, 0, sizeof(desc)); obd_str2uuid(&desc.ld_uuid, argv[1]); desc.ld_tgt_count = ((OBD_MAX_IOCTL_BUFFER-sizeof(data)-sizeof(desc)) / (sizeof(*uuidarray) + sizeof(*obdgens)));repeat: uuidarray = calloc(desc.ld_tgt_count, sizeof(*uuidarray)); if (!uuidarray) { fprintf(stderr, "error: %s: no memory for %d uuid's\n", jt_cmdname(argv[0]), desc.ld_tgt_count); rc = -ENOMEM; goto out; } obdgens = calloc(desc.ld_tgt_count, sizeof(*obdgens)); if (!obdgens) { fprintf(stderr, "error: %s: no memory for %d generation #'s\n", jt_cmdname(argv[0]), desc.ld_tgt_count); rc = -ENOMEM; goto out_uuidarray; } data.ioc_inllen1 = sizeof(desc); data.ioc_inlbuf1 = (char *)&desc; data.ioc_inllen2 = desc.ld_tgt_count * sizeof(*uuidarray); data.ioc_inlbuf2 = (char *)uuidarray; data.ioc_inllen3 = desc.ld_tgt_count * sizeof(*obdgens); data.ioc_inlbuf3 = (char *)obdgens; if (obd_ioctl_pack(&data, &buf, max)) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); rc = -EINVAL; goto out_obdgens; } rc = ioctl(fd, OBD_IOC_LOV_GET_CONFIG, buf); if (rc == -ENOSPC) { free(uuidarray); free(obdgens); goto repeat; } else if (rc) { fprintf(stderr, "error: %s: ioctl error: %s\n", jt_cmdname(argv[0]), strerror(rc = errno)); } else { struct obd_uuid *uuidp; __u32 *genp; int i; if (obd_ioctl_unpack(&data, buf, max)) { fprintf(stderr, "error: %s: invalid reply\n", jt_cmdname(argv[0])); rc = -EINVAL; goto out; } if (desc.ld_default_stripe_count == (__u16)-1) printf("default_stripe_count: %d\n", -1); else printf("default_stripe_count: %u\n", desc.ld_default_stripe_count); printf("default_stripe_size: "LPU64"\n", desc.ld_default_stripe_size); printf("default_stripe_offset: "LPU64"\n", desc.ld_default_stripe_offset); printf("default_stripe_pattern: %u\n", desc.ld_pattern); printf("obd_count: %u\n", desc.ld_tgt_count); printf("OBDS:\tobdidx\t\tobdgen\t\t obduuid\n"); uuidp = uuidarray; genp = obdgens; for (i = 0; i < desc.ld_tgt_count; i++, uuidp++, genp++) printf("\t%6u\t%14u\t\t %s\n", i, *genp, (char *)uuidp); }out_obdgens: free(obdgens);out_uuidarray: free(uuidarray);out: close(fd); return rc;}int jt_obd_ldlm_regress_start(int argc, char **argv){ int rc; struct obd_ioctl_data data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -