tools: acrnlog: give user hint when acrn hvlog devices not found

If module acrn_hvlog is configured as "m" and we don't insert it before
launching acrnlog tool, acrnlog will run normally instead of throw
out an error in current implementation. And no log files are generated.
It will cause confusing here.

So, this patch throw out an error massage to user about the absence of acrn
hvlog devices.

BTW, this patch replaces cpuid/num related concept to devid/cnt which is more
suitable for /dev/acrn_hvlog_xxx.

Tracked-On: #1975
Signed-off-by: Kaige Fu <kaige.fu@intel.com>
Acked-by: Yan, Like <like.yan@intel.com>
This commit is contained in:
Kaige Fu 2018-12-03 06:23:50 +08:00 committed by wenlingz
parent d85a0b70ed
commit d737d6e63f
1 changed files with 21 additions and 20 deletions

View File

@ -19,13 +19,12 @@
#define LOG_ELEMENT_SIZE 80
#define LOG_MSG_SIZE 480
#define PCPU_NUM 4
#define DEFAULT_POLL_INTERVAL 100000
#define LOG_INCOMPLETE_WARNING "WARNING: logs missing here! "\
"Try reducing polling interval"
/* num of physical cpu, not the cpu num seen on SOS */
static unsigned int pcpu_num = PCPU_NUM;
/* Count of /dev/acrn_hvlog_cur_xxx */
static unsigned int dev_cnt;
static unsigned long interval = DEFAULT_POLL_INTERVAL;
/* this is for log file */
@ -84,14 +83,11 @@ struct hvlog_dev {
size_t write_log_file(struct hvlog_file * log, const char *buf, size_t len);
/*
* get pcpu_num, which is equal to num of acrnlog dev
*/
static int get_cpu_num(void)
static int get_dev_cnt(void)
{
char prefix[32] = "acrn_hvlog_cur_"; /* acrnlog dev prefix */
struct dirent *pdir;
int cpu_num = 0;
int cnt = 0;
char *ret;
DIR *dir;
@ -104,12 +100,12 @@ static int get_cpu_num(void)
while ((pdir = readdir(dir)) != NULL) {
ret = strstr(pdir->d_name, prefix);
if (ret)
cpu_num++;
cnt++;
}
closedir(dir);
return cpu_num;
return cnt;
}
/*
@ -358,8 +354,8 @@ static void *cur_read_func(void *arg)
char warn_msg[LOG_MSG_SIZE] = {0};
while (1) {
hvlog_dev_read_msg(cur, pcpu_num);
msg = get_min_seq_msg(cur, pcpu_num);
hvlog_dev_read_msg(cur, dev_cnt);
msg = get_min_seq_msg(cur, dev_cnt);
if (!msg) {
usleep(interval);
continue;
@ -506,14 +502,19 @@ int main(int argc, char *argv[])
return ret;
}
pcpu_num = get_cpu_num();
cur = calloc(pcpu_num, sizeof(struct hvlog_data));
dev_cnt = get_dev_cnt();
if (dev_cnt == 0) {
printf("Failed to find acrn hvlog devices, please check whether module acrn_hvlog is inserted\n");
return -1;
}
cur = calloc(dev_cnt, sizeof(struct hvlog_data));
if (!cur) {
printf("Failed to allocate buf for cur log buf\n");
return -1;
}
last = calloc(pcpu_num, sizeof(struct hvlog_data));
last = calloc(dev_cnt, sizeof(struct hvlog_data));
if (!last) {
printf("Failed to allocate buf for last log buf\n");
free(cur);
@ -521,7 +522,7 @@ int main(int argc, char *argv[])
}
num_cur = 0;
for (i = 0; i < pcpu_num; i++) {
for (i = 0; i < dev_cnt; i++) {
if (snprintf(name, sizeof(name), "/dev/acrn_hvlog_cur_%d", i) >= sizeof(name)) {
printf("ERROR: cur hvlog path is truncated\n");
return -1;
@ -535,7 +536,7 @@ int main(int argc, char *argv[])
}
num_last = 0;
for (i = 0; i < pcpu_num; i++) {
for (i = 0; i < dev_cnt; i++) {
if (snprintf(name, sizeof(name), "/dev/acrn_hvlog_last_%d", i) >= sizeof(name)) {
printf("ERROR: last hvlog path is truncated\n");
return -1;
@ -561,8 +562,8 @@ int main(int argc, char *argv[])
if (num_last) {
while (1) {
hvlog_dev_read_msg(last, pcpu_num);
msg = get_min_seq_msg(last, pcpu_num);
hvlog_dev_read_msg(last, dev_cnt);
msg = get_min_seq_msg(last, dev_cnt);
if (!msg)
break;
write_log_file(&last_log, msg->raw, msg->len);
@ -572,7 +573,7 @@ int main(int argc, char *argv[])
if (cur_thread)
pthread_join(cur_thread, NULL);
for (i = 0; i < pcpu_num; i++) {
for (i = 0; i < dev_cnt; i++) {
hvlog_close_dev(cur[i].dev);
hvlog_close_dev(last[i].dev);
}