lproc_ptlrpc.c
来自「lustre 1.6.5 source code」· C语言 代码 · 共 635 行 · 第 1/2 页
C
635 行
if (rc == 0) { *pos = srhi->srhi_seq; return srhi; } OBD_FREE(srhi, sizeof(*srhi)); return NULL;}static voidptlrpc_lprocfs_svc_req_history_stop(struct seq_file *s, void *iter){ struct ptlrpc_srh_iterator *srhi = iter; if (srhi != NULL) OBD_FREE(srhi, sizeof(*srhi));}static void *ptlrpc_lprocfs_svc_req_history_next(struct seq_file *s, void *iter, loff_t *pos){ struct ptlrpc_service *svc = s->private; struct ptlrpc_srh_iterator *srhi = iter; int rc; spin_lock(&svc->srv_lock); rc = ptlrpc_lprocfs_svc_req_history_seek(svc, srhi, *pos + 1); spin_unlock(&svc->srv_lock); if (rc != 0) { OBD_FREE(srhi, sizeof(*srhi)); return NULL; } *pos = srhi->srhi_seq; return srhi;}/* common ost/mdt srv_request_history_print_fn */void target_print_req(void *seq_file, struct ptlrpc_request *req){ /* Called holding srv_lock with irqs disabled. * Print specific req contents and a newline. * CAVEAT EMPTOR: check request message length before printing!!! * You might have received any old crap so you must be just as * careful here as the service's request parser!!! */ struct seq_file *sf = seq_file; switch (req->rq_phase) { case RQ_PHASE_NEW: /* still awaiting a service thread's attention, or rejected * because the generic request message didn't unpack */ seq_printf(sf, "<not swabbed>\n"); break; case RQ_PHASE_INTERPRET: /* being handled, so basic msg swabbed, and opc is valid * but racing with mds_handle() */ case RQ_PHASE_COMPLETE: /* been handled by mds_handle() reply state possibly still * volatile */ seq_printf(sf, "opc %d\n", lustre_msg_get_opc(req->rq_reqmsg)); break; default: DEBUG_REQ(D_ERROR, req, "bad phase %d", req->rq_phase); }}EXPORT_SYMBOL(target_print_req);static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter){ struct ptlrpc_service *svc = s->private; struct ptlrpc_srh_iterator *srhi = iter; struct ptlrpc_request *req; int rc; spin_lock(&svc->srv_lock); rc = ptlrpc_lprocfs_svc_req_history_seek(svc, srhi, srhi->srhi_seq); if (rc == 0) { req = srhi->srhi_req; /* Print common req fields. * CAVEAT EMPTOR: we're racing with the service handler * here. The request could contain any old crap, so you * must be just as careful as the service's request * parser. Currently I only print stuff here I know is OK * to look at coz it was set up in request_in_callback()!!! */ seq_printf(s, LPD64":%s:%s:x"LPD64":%d:%s:%ld:%lds(%+lds) ", req->rq_history_seq, libcfs_nid2str(req->rq_self), libcfs_id2str(req->rq_peer), req->rq_xid, req->rq_reqlen, ptlrpc_rqphase2str(req), req->rq_arrival_time.tv_sec, req->rq_sent - req->rq_arrival_time.tv_sec, req->rq_sent - req->rq_deadline); if (svc->srv_request_history_print_fn == NULL) seq_printf(s, "\n"); else svc->srv_request_history_print_fn(s, srhi->srhi_req); } spin_unlock(&svc->srv_lock); return rc;}static intptlrpc_lprocfs_svc_req_history_open(struct inode *inode, struct file *file){ static struct seq_operations sops = { .start = ptlrpc_lprocfs_svc_req_history_start, .stop = ptlrpc_lprocfs_svc_req_history_stop, .next = ptlrpc_lprocfs_svc_req_history_next, .show = ptlrpc_lprocfs_svc_req_history_show, }; struct proc_dir_entry *dp = PDE(inode); struct seq_file *seqf; int rc; LPROCFS_ENTRY_AND_CHECK(dp); rc = seq_open(file, &sops); if (rc) { LPROCFS_EXIT(); return rc; } seqf = file->private_data; seqf->private = dp->data; return 0;}/* See also lprocfs_rd_timeouts */static int ptlrpc_lprocfs_rd_timeouts(char *page, char **start, off_t off, int count, int *eof, void *data){ struct ptlrpc_service *svc = data; unsigned int cur, worst; time_t worstt; struct dhms ts; int rc = 0; *eof = 1; cur = at_get(&svc->srv_at_estimate); worst = svc->srv_at_estimate.at_worst_ever; worstt = svc->srv_at_estimate.at_worst_time; s2dhms(&ts, cfs_time_current_sec() - worstt); if (AT_OFF) rc += snprintf(page + rc, count - rc, "adaptive timeouts off, using obd_timeout %u\n", obd_timeout); rc += snprintf(page + rc, count - rc, "%10s : cur %3u worst %3u (at %ld, "DHMS_FMT" ago) ", "service", cur, worst, worstt, DHMS_VARS(&ts)); rc = lprocfs_at_hist_helper(page, count, rc, &svc->srv_at_estimate); return rc;} void ptlrpc_lprocfs_register_service(struct proc_dir_entry *entry, struct ptlrpc_service *svc){ struct lprocfs_vars lproc_vars[] = { {.name = "req_buffer_history_len", .write_fptr = NULL, .read_fptr = ptlrpc_lprocfs_read_req_history_len, .data = svc}, {.name = "req_buffer_history_max", .write_fptr = ptlrpc_lprocfs_write_req_history_max, .read_fptr = ptlrpc_lprocfs_read_req_history_max, .data = svc}, {.name = "timeouts", .read_fptr = ptlrpc_lprocfs_rd_timeouts, .data = svc}, {NULL} }; static struct file_operations req_history_fops = { .owner = THIS_MODULE, .open = ptlrpc_lprocfs_svc_req_history_open, .read = seq_read, .llseek = seq_lseek, .release = lprocfs_seq_release, }; struct proc_dir_entry *req_history; ptlrpc_lprocfs_register(entry, svc->srv_name, "stats", &svc->srv_procroot, &svc->srv_stats); if (svc->srv_procroot == NULL) return; lprocfs_add_vars(svc->srv_procroot, lproc_vars, NULL); req_history = create_proc_entry("req_history", 0400, svc->srv_procroot); if (req_history != NULL) { req_history->data = svc; req_history->proc_fops = &req_history_fops; }}void ptlrpc_lprocfs_register_obd(struct obd_device *obddev){ ptlrpc_lprocfs_register(obddev->obd_proc_entry, NULL, "stats", &obddev->obd_svc_procroot, &obddev->obd_svc_stats);}EXPORT_SYMBOL(ptlrpc_lprocfs_register_obd);void ptlrpc_lprocfs_rpc_sent(struct ptlrpc_request *req){ struct lprocfs_stats *svc_stats; __u32 op = lustre_msg_get_opc(req->rq_reqmsg); int opc = opcode_offset(op); svc_stats = req->rq_import->imp_obd->obd_svc_stats; if (svc_stats == NULL || opc <= 0) return; LASSERT(opc < LUSTRE_MAX_OPCODES); /* These two use the ptlrpc_lprocfs_brw below */ if (!(opc == OST_WRITE || opc == OST_READ || op == LDLM_ENQUEUE || op == MDS_REINT)) lprocfs_counter_add(svc_stats, opc + EXTRA_MAX_OPCODES, 0);}void ptlrpc_lprocfs_brw(struct ptlrpc_request *req, int opc, int bytes){ struct lprocfs_stats *svc_stats; svc_stats = req->rq_import->imp_obd->obd_svc_stats; if (!svc_stats) return; lprocfs_counter_add(svc_stats, opc + EXTRA_MAX_OPCODES, bytes);}EXPORT_SYMBOL(ptlrpc_lprocfs_brw);void ptlrpc_lprocfs_unregister_service(struct ptlrpc_service *svc){ if (svc->srv_procroot != NULL) lprocfs_remove(&svc->srv_procroot); if (svc->srv_stats) lprocfs_free_stats(&svc->srv_stats);}void ptlrpc_lprocfs_unregister_obd(struct obd_device *obd){ if (obd->obd_svc_procroot) lprocfs_remove(&obd->obd_svc_procroot); if (obd->obd_svc_stats) lprocfs_free_stats(&obd->obd_svc_stats);}EXPORT_SYMBOL(ptlrpc_lprocfs_unregister_obd);int lprocfs_wr_evict_client(struct file *file, const char *buffer, unsigned long count, void *data){ struct obd_device *obd = data; char tmpbuf[sizeof(struct obd_uuid)]; /* Kludge code(deadlock situation): the lprocfs lock has been held * since the client is evicted by writting client's * uuid/nid to procfs "evict_client" entry. However, * obd_export_evict_by_uuid() will call lprocfs_remove() to destroy * the proc entries under the being destroyed export{}, so I have * to drop the lock at first here. * - jay, jxiong@clusterfs.com */ class_incref(obd); LPROCFS_EXIT(); sscanf(buffer, "%40s", tmpbuf); if (strncmp(tmpbuf, "nid:", 4) == 0) obd_export_evict_by_nid(obd, tmpbuf + 4); else if (strncmp(tmpbuf, "uuid:", 5) == 0) obd_export_evict_by_uuid(obd, tmpbuf + 5); else obd_export_evict_by_uuid(obd, tmpbuf); LPROCFS_ENTRY(); class_decref(obd); return count;}EXPORT_SYMBOL(lprocfs_wr_evict_client);int lprocfs_wr_ping(struct file *file, const char *buffer, unsigned long count, void *data){ struct obd_device *obd = data; struct ptlrpc_request *req; int rc; ENTRY; LPROCFS_CLIMP_CHECK(obd); req = ptlrpc_prep_req(obd->u.cli.cl_import, LUSTRE_OBD_VERSION, OBD_PING, 1, NULL, NULL); LPROCFS_CLIMP_EXIT(obd); if (req == NULL) RETURN(-ENOMEM); ptlrpc_req_set_repsize(req, 1, NULL); req->rq_send_state = LUSTRE_IMP_FULL; req->rq_no_resend = 1; req->rq_no_delay = 1; rc = ptlrpc_queue_wait(req); ptlrpc_req_finished(req); if (rc >= 0) RETURN(count); RETURN(rc);}EXPORT_SYMBOL(lprocfs_wr_ping);#endif /* LPROCFS */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?