📄 xenstat.c
字号:
return domain->num_vcpus;}xenstat_vcpu *xenstat_domain_vcpu(xenstat_domain * domain, unsigned int vcpu){ if (0 <= vcpu && vcpu < domain->num_vcpus) return &(domain->vcpus[vcpu]); return NULL;}/* Find the current memory reservation for this domain */unsigned long long xenstat_domain_cur_mem(xenstat_domain * domain){ return domain->cur_mem;}/* Find the maximum memory reservation for this domain */unsigned long long xenstat_domain_max_mem(xenstat_domain * domain){ return domain->max_mem;}/* Find the domain's SSID */unsigned int xenstat_domain_ssid(xenstat_domain * domain){ return domain->ssid;}/* Get domain states */unsigned int xenstat_domain_dying(xenstat_domain * domain){ return (domain->state & XEN_DOMINF_dying) == XEN_DOMINF_dying;}unsigned int xenstat_domain_crashed(xenstat_domain * domain){ return ((domain->state & XEN_DOMINF_shutdown) == XEN_DOMINF_shutdown) && (((domain->state >> XEN_DOMINF_shutdownshift) & XEN_DOMINF_shutdownmask) == SHUTDOWN_crash);}unsigned int xenstat_domain_shutdown(xenstat_domain * domain){ return ((domain->state & XEN_DOMINF_shutdown) == XEN_DOMINF_shutdown) && (((domain->state >> XEN_DOMINF_shutdownshift) & XEN_DOMINF_shutdownmask) != SHUTDOWN_crash);}unsigned int xenstat_domain_paused(xenstat_domain * domain){ return (domain->state & XEN_DOMINF_paused) == XEN_DOMINF_paused;}unsigned int xenstat_domain_blocked(xenstat_domain * domain){ return (domain->state & XEN_DOMINF_blocked) == XEN_DOMINF_blocked;}unsigned int xenstat_domain_running(xenstat_domain * domain){ return (domain->state & XEN_DOMINF_running) == XEN_DOMINF_running;}/* Get the number of networks for a given domain */unsigned int xenstat_domain_num_networks(xenstat_domain * domain){ return domain->num_networks;}/* Get the network handle to obtain network stats */xenstat_network *xenstat_domain_network(xenstat_domain * domain, unsigned int network){ if (domain->networks && 0 <= network && network < domain->num_networks) return &(domain->networks[network]); return NULL;}/* Get the number of VBDs for a given domain */unsigned int xenstat_domain_num_vbds(xenstat_domain * domain){ return domain->num_vbds;}/* Get the VBD handle to obtain VBD stats */xenstat_vbd *xenstat_domain_vbd(xenstat_domain * domain, unsigned int vbd){ if (domain->vbds && 0 <= vbd && vbd < domain->num_vbds) return &(domain->vbds[vbd]); return NULL;}/* * VCPU functions *//* Collect information about VCPUs */static int xenstat_collect_vcpus(xenstat_node * node){ unsigned int i, vcpu, inc_index; /* Fill in VCPU information */ for (i = 0; i < node->num_domains; i+=inc_index) { inc_index = 1; /* default is to increment to next domain */ node->domains[i].vcpus = malloc(node->domains[i].num_vcpus * sizeof(xenstat_vcpu)); if (node->domains[i].vcpus == NULL) return 0; for (vcpu = 0; vcpu < node->domains[i].num_vcpus; vcpu++) { /* FIXME: need to be using a more efficient mechanism*/ xc_vcpuinfo_t info; if (xc_vcpu_getinfo(node->handle->xc_handle, node->domains[i].id, vcpu, &info) != 0) { if (errno == ENOMEM) { /* fatal error */ return 0; } else { /* domain is in transition - remove from list */ xenstat_prune_domain(node, i); /* remember not to increment index! */ inc_index = 0; break; } } else { node->domains[i].vcpus[vcpu].online = info.online; node->domains[i].vcpus[vcpu].ns = info.cpu_time; } } } return 1;}/* Free VCPU information */static void xenstat_free_vcpus(xenstat_node * node){ unsigned int i; for (i = 0; i < node->num_domains; i++) free(node->domains[i].vcpus);}/* Free VCPU information in handle - nothing to do */static void xenstat_uninit_vcpus(xenstat_handle * handle){}/* Get VCPU online status */unsigned int xenstat_vcpu_online(xenstat_vcpu * vcpu){ return vcpu->online;}/* Get VCPU usage */unsigned long long xenstat_vcpu_ns(xenstat_vcpu * vcpu){ return vcpu->ns;}/* * Network functions *//* Free network information */static void xenstat_free_networks(xenstat_node * node){ unsigned int i; for (i = 0; i < node->num_domains; i++) free(node->domains[i].networks);}/* Get the network ID */unsigned int xenstat_network_id(xenstat_network * network){ return network->id;}/* Get the number of receive bytes */unsigned long long xenstat_network_rbytes(xenstat_network * network){ return network->rbytes;}/* Get the number of receive packets */unsigned long long xenstat_network_rpackets(xenstat_network * network){ return network->rpackets;}/* Get the number of receive errors */unsigned long long xenstat_network_rerrs(xenstat_network * network){ return network->rerrs;}/* Get the number of receive drops */unsigned long long xenstat_network_rdrop(xenstat_network * network){ return network->rdrop;}/* Get the number of transmit bytes */unsigned long long xenstat_network_tbytes(xenstat_network * network){ return network->tbytes;}/* Get the number of transmit packets */unsigned long long xenstat_network_tpackets(xenstat_network * network){ return network->tpackets;}/* Get the number of transmit errors */unsigned long long xenstat_network_terrs(xenstat_network * network){ return network->terrs;}/* Get the number of transmit dropped packets */unsigned long long xenstat_network_tdrop(xenstat_network * network){ return network->tdrop;}/* * Xen version functions *//* Collect Xen version information */static int xenstat_collect_xen_version(xenstat_node * node){ long vnum = 0; xen_extraversion_t version; /* Collect Xen version information if not already collected */ if (node->handle->xen_version[0] == '\0') { /* Get the Xen version number and extraversion string */ vnum = xc_version(node->handle->xc_handle, XENVER_version, NULL); if (vnum < 0) return 0; if (xc_version(node->handle->xc_handle, XENVER_extraversion, &version) < 0) return 0; /* Format the version information as a string and store it */ snprintf(node->handle->xen_version, VERSION_SIZE, "%ld.%ld%s", ((vnum >> 16) & 0xFFFF), vnum & 0xFFFF, version); } return 1;}/* Free Xen version information in node - nothing to do */static void xenstat_free_xen_version(xenstat_node * node){}/* Free Xen version information in handle - nothing to do */static void xenstat_uninit_xen_version(xenstat_handle * handle){}/* * VBD functions *//* Free VBD information */static void xenstat_free_vbds(xenstat_node * node){ unsigned int i; for (i = 0; i < node->num_domains; i++) free(node->domains[i].vbds);}/* Get the back driver type for Virtual Block Device */unsigned int xenstat_vbd_type(xenstat_vbd * vbd){ return vbd->back_type;}/* Get the major number of VBD device */unsigned int xenstat_vbd_dev(xenstat_vbd * vbd){ return vbd->dev;}/* Get the number of OO(Out of) requests */unsigned long long xenstat_vbd_oo_reqs(xenstat_vbd * vbd){ return vbd->oo_reqs;}/* Get the number of READ requests */unsigned long long xenstat_vbd_rd_reqs(xenstat_vbd * vbd){ return vbd->rd_reqs;}/* Get the number of WRITE requests */unsigned long long xenstat_vbd_wr_reqs(xenstat_vbd * vbd){ return vbd->wr_reqs;}static char *xenstat_get_domain_name(xenstat_handle *handle, unsigned int domain_id){ char path[80]; snprintf(path, sizeof(path),"/local/domain/%i/name", domain_id); return xs_read(handle->xshandle, XBT_NULL, path, NULL);} /* Remove specified entry from list of domains */static void xenstat_prune_domain(xenstat_node *node, unsigned int entry){ /* nothing to do if array is empty or entry is beyond end */ if (node->num_domains == 0 || entry >= node->num_domains) return; /* decrement count of domains */ node->num_domains--; /* shift entries following specified entry up by one */ if (entry < node->num_domains) { xenstat_domain *domain = &node->domains[entry]; memmove(domain,domain+1,(node->num_domains - entry) * sizeof(xenstat_domain) ); } /* zero out original last entry from node -- not strictly necessary but safer! */ memset(&node->domains[node->num_domains], 0, sizeof(xenstat_domain)); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -