Пример #1
0
/*
 * Display current configuration parameters in a human readable format.
 */
void
display_config(struct mic_info *miclist)
{
	struct mic_info *mic;
	struct mbridge *br;
	char netmask[16];
	char micmac[64];
	char hostmac[64];
	int err = 0;
	int ret = 0;

	putchar('\n');
	mic = miclist;
	while (mic != NULL) {
		printf("%s:\n", mic->name);
		printf("=============================================================\n");

		if ((ret = micctrl_parse_config(&mpssenv, mic, &brlist, &mpssperr, PINFO))) {
			err++;

			if (ret < MIC_PARSE_ERRORS) {
				display(PERROR, "Not configured\n");
				goto nextmic;
			}
		}

		printf("    Config Version: %d.%d\n\n", (mic->config.version >> 16) & 0xff, mic->config.version & 0xff);
		printf("    Linux Kernel:   %s\n", check_set(mic->config.boot.osimage));
		printf("    Map File:       %s\n", check_set(mic->config.boot.systemmap));
		printf("    Family:         %s\n", family_to_str(mic->config.family));
		printf("    MPSSVersion:    %s\n", mpss_version_to_str(mic->config.mpss_version));

		printf("    BootOnStart:    %s\n",
			(mic->config.boot.onstart == TRUE)? "Enabled" : "Disabled");
		printf("    Shutdowntimeout: %s seconds\n", check_set(mic->config.misc.shutdowntimeout));

		printf("\n    ExtraCommandLine: %s\n", check_set(mic->config.boot.extraCmdline));
		printf("    PowerManagment: %s\n", check_set(mic->config.boot.pm));

		printf("\n    ");
		report_rootdev(mic);

		get_mac_strings(mic, micmac, hostmac, 64);

		switch (mic->config.net.type) {
		case NETWORK_TYPE_STATPAIR:
			printf("\n    Network:       Static Pair\n");
			printf("        Hostname:  %s\n", check_set(mic->config.net.hostname));
			printf("        MIC IP:    %s\n", check_set(mic->config.net.micIP));
			printf("        Host IP:   %s\n", check_set(mic->config.net.hostIP));

			if (mic->config.net.prefix == NULL)
				mic->config.net.prefix = "24";

			mpssnet_genmask(mic->config.net.prefix, netmask);
			printf("        Net Bits:  %s\n", check_set(mic->config.net.prefix));
			printf("        NetMask:   %s\n", netmask);

			if (mic->config.net.mtu)
				printf("        MtuSize:   %s\n", check_set(mic->config.net.mtu));

			break;

		case NETWORK_TYPE_STATBRIDGE:
			printf("\n    Network:       Static bridge %s\n", check_set(mic->config.net.bridge));
			printf("        MIC IP:    %s\n", check_set(mic->config.net.micIP));

			if ((br = mpss_bridge_byname(mic->config.net.bridge, brlist)) != NULL) {
				printf("        Host IP:   %s\n", check_set(br->ip));

				mpssnet_genmask(br->prefix, netmask);
				printf("        Net Bits:  %s\n", check_set(br->prefix));
				printf("        NetMask:   %s\n", netmask);
				printf("        MtuSize:   %s\n", check_set(br->mtu));
			}

			printf("        Hostname:  %s\n", check_set(mic->config.net.hostname));
			break;
		case NETWORK_TYPE_BRIDGE:
			printf("\n    Network:       Bridge %s with DHCP\n", check_set(mic->config.net.bridge));

			if ((br = mpss_bridge_byname(mic->config.net.bridge, brlist)) != NULL) {
				mpssnet_genmask(br->prefix, netmask);
				printf("        Net Bits:  %s\n", check_set(br->prefix));
				printf("        NetMask:   %s\n", netmask);
				printf("        MtuSize:   %s\n", check_set(br->mtu));
			}

			printf("        Hostname:  %s\n", check_set(mic->config.net.hostname));
			break;
		default:
			printf("%s: Unknown network configuration type\n", mic->name);
		}
		printf("        MIC MAC:   %s\n", micmac);
		printf("        Host MAC:  %s\n", hostmac);

		printf("\n    ");
		display_ldap(mic, TRUE);
		printf("     ");
		display_nis(mic, TRUE);

		printf("\n    Cgroup:\n");
		printf("        Memory:    %s\n", (mic->config.cgroup.memory == TRUE)? "Enabled" : "Disabled");

		printf("\n    Console:        %s\n", check_set(mic->config.boot.console));

		printf("    VerboseLogging: %s\n",
			(mic->config.boot.verbose == TRUE)? "Enabled" : "Disabled");

		if (mic->config.misc.crashdumpDir != NULL) 
			printf("    CrashDump:      %s %sGB\n", check_set(mic->config.misc.crashdumpDir),
								check_set(mic->config.misc.crashdumplimitgb));
		else
			printf("    CrashDump:      Not Enabled\n");
nextmic:
		putchar('\n');
		mic = mic->next;
	}

	exit(err);
}
Пример #2
0
void *
boot_mic(void *arg)
{
	struct mic_info *mic = (struct mic_info *)arg;
	struct mpssd_info *mpssdi = (struct mpssd_info *)mic->data;
	struct mpss_elist mpssperr;
	struct stat sbuf;
	char *initrd = NULL;
	char *state;
	char *save;
	char *errmsg;
	char boot_string[PATH_MAX];
	char cmdline[2048];
	int shutdown_wait = 180;// Do not wait for shutdown more than 180 secs.
	int reset_wait = 180;	// Do not wait for reset more than 180 secs.
	int err = 0;
	char *shutdown_str;
	char os_image_path[PATH_MAX];
	char kernel[PATH_MAX];
	char ramdisk[PATH_MAX];
	char efiimage[PATH_MAX];
	char *sysfs_rd;

	if ((err = mpss_parse_config(&mpssenv, mic, &brlist, &mpssperr))) {
		mpsslog(PINFO, "%s: Boot aborted - no configuation file present: %s\n", mic->name, strerror(err));
		goto bootexit;
	}

	mpss_print_elist(&mpssperr, PWARN, mpsslog);
	mpss_clear_elist(&mpssperr);

	switch(mic->config.family) {
		case MIC_FAMILY_KNL_VALUE:
			if (!is_mic_knl(mic))
				mpsslog(PWARN, "%s: Family mismatch. Configuration file parameter is %s but MIC family is different\n"
						"\t Please execute micctrl --cleanconfig and --initdefaults again\n", mic->name, family_to_str(mic->config.family));
			break;
		case MIC_FAMILY_KNC_VALUE:
			if (!is_mic_knc(mic))
				mpsslog(PWARN, "%s: Family mismatch. Configuration file parameter is %s but MIC family is different\n"
						"\t Please execute micctrl --cleanconfig and --initdefaults again\n", mic->name, family_to_str(mic->config.family));
			break;
		case MIC_FAMILY_UNKNOWN_VALUE:
		default:
			mpsslog(PWARN, "%s: Family parameter is %s\n\t Please execute micctrl --cleanconfig and --initdefaults again\n", mic->name, family_to_str(mic->config.family));
	}

	if (check_fs_params(mic))
		goto bootexit;

	if (mic->config.boot.osimage == NULL) {
		mpsslog(PINFO, "%s: Boot aborted - OsImage parameter not set\n", mic->name);
		goto bootexit;
	}

	if (is_mic_knl(mic) && mic->config.boot.efiimage == NULL) {
		mpsslog(PINFO, "%s: Boot aborted - EFI Image parameter not set\n", mic->name);
		goto bootexit;
	}

	if (verify_bzImage(&mpssenv, mic->config.boot.osimage, mic->name)) {
		mpsslog(PINFO, "%s: Boot aborted - %s is not a valid Linux bzImage\n",
				mic->name, mic->config.boot.osimage);
		goto bootexit;
	}

	if ((errmsg = mpss_set_cmdline(mic, brlist, cmdline, NULL)) != NULL) {
		mpsslog(PINFO, "%s: Boot aborted - %s\n", mic->name, errmsg);
		goto bootexit;
	}

	mpsslog(PINFO, "%s: Command line: %s\n", mic->name, cmdline);

	set_log_buf_info(mic);

	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

	if (mic->config.boot.onstart != TRUE) {
		mpsslog(PINFO, "%s: Not set to autoboot\n", mic->name);
		goto bootmic_done;
	}

	switch (mic->config.rootdev.type) {
	case ROOT_TYPE_RAMFS:
		if (stat(mic->config.rootdev.target, &sbuf) == 0)
			unlink(mic->config.rootdev.target);
		mpsslog(PINFO, "%s: Generate %s\n", mic->name, mic->config.rootdev.target);
		mpssfs_gen_initrd(&mpssenv, mic, &mpssperr);
		mpss_print_elist(&mpssperr, PWARN, mpsslog);
		mpss_clear_elist(&mpssperr);
	case ROOT_TYPE_STATICRAMFS:
		initrd = mic->config.rootdev.target;
		break;

	case ROOT_TYPE_NFS:
	case ROOT_TYPE_SPLITNFS:
	case ROOT_TYPE_PFS:
		initrd = mic->config.filesrc.base.image;
		break;
	}

	if (initrd == NULL) {
		mpsslog(PERROR, "%s Boot aborted - initial ramdisk not set", mic->name);
		goto bootmic_done;
	}

	if (is_upstream_driver()) {
		/* request_firmware() API that is used in the upstream stack
		 * expects the firmware images to be somewhere under /lib/firmware.
		 * We create /lib/firmware/mic/micX/ and place links to micX specific
		 * images under them. */
		snprintf(os_image_path, PATH_MAX, "/lib/firmware/mic/%s", mic->name);
		mpssut_deltree(&mpssenv, os_image_path);

		if (mpssut_mksubtree(&mpssenv, "", os_image_path, 0, 0, 0755)) {
			mpsslog(PERROR, "%s Boot aborted - Failed to create boot directory. %s\n",
				mic->name, strerror(errno));
			goto bootmic_done;
		}

		snprintf(kernel, PATH_MAX, "%s/uos.img", os_image_path);
		snprintf(ramdisk, PATH_MAX, "%s/mic.image", os_image_path);
		if(is_mic_knl(mic))
			snprintf(efiimage, PATH_MAX, "%s/efi.image", os_image_path);

		if (symlink(mic->config.boot.osimage, kernel) < 0) {
			mpsslog(PERROR, "%s Boot aborted - Failed to create symlink for kernel image. %s",
				mic->name, strerror(errno));
			goto bootmic_done;
		}

		if (initrd == NULL || symlink(initrd, ramdisk) < 0) {
			mpsslog(PERROR, "%s Boot aborted - Failed to create symlink for filesystem. %s",
				mic->name, strerror(errno));
			goto bootmic_done;
		}

		if (is_mic_knl(mic) && symlink(mic->config.boot.efiimage, efiimage) < 0) {
			mpsslog(PERROR, "%s Boot aborted - Failed to create symlink for EFI image. %s",
				mic->name, strerror(errno));
			goto bootmic_done;
		}

		if (mpss_setsysfs(mic->name, "bootmode", "linux")) {
			sysfs_rd = mpss_readsysfs(mic->name, "bootmode");
			mpsslog(PERROR, "%s failed to boot. Bootmode = %s\n", mic->name, sysfs_rd);
			free(sysfs_rd);
			goto bootmic_done;
		}

		/* request_firmware doesn't like absolute paths. */
		snprintf(kernel, PATH_MAX, "mic/%s/uos.img", mic->name);
		snprintf(ramdisk, PATH_MAX, "mic/%s/mic.image", mic->name);
		if (is_mic_knl(mic))
			snprintf(efiimage, PATH_MAX, "mic/%s/efi.image", mic->name);

		if (mpss_setsysfs(mic->name, "firmware", kernel)) {
			sysfs_rd = mpss_readsysfs(mic->name, "firmware");
			mpsslog(PERROR, "%s failed to boot. Firmware = %s\n", mic->name, sysfs_rd);
			free(sysfs_rd);
			goto bootmic_done;
		}

		if (mpss_setsysfs(mic->name, "ramdisk", ramdisk)) {
			sysfs_rd = mpss_readsysfs(mic->name, "ramdisk");
			mpsslog(PERROR, "%s failed to boot. Ramdisk = %s\n", mic->name, sysfs_rd);
			free(sysfs_rd);
			goto bootmic_done;
		}

		if (is_mic_knl(mic) && mpss_setsysfs(mic->name, "efiimage", efiimage)) {
			sysfs_rd = mpss_readsysfs(mic->name, "efiimage");
			mpsslog(PERROR, "%s failed to boot. EFI image = %s\n", mic->name, sysfs_rd);
			free(sysfs_rd);
			goto bootmic_done;
		}

		snprintf(boot_string, PATH_MAX, "boot");

	} else {
		snprintf(boot_string, PATH_MAX, "boot:linux:%s:%s", mic->config.boot.osimage, initrd);
	}

	if ((state = mpss_readsysfs(mic->name, "state")) == NULL) {
		mpsslog(PERROR, "%s: Cannot access state sysfs entry - skipping\n", mic->name);
		goto bootmic_done;
	}

	if (is_upstream_driver())
		shutdown_str = "shutting_down";
	else
		shutdown_str = "shutdown";

	while (!strcmp(state, shutdown_str)) {
		save = state;

		if ((state = mpss_readsysfs(mic->name, "state")) == NULL) {
			mpsslog(PWARN, "%s: Wait for shutdown failed to read state sysfs - try again\n", mic->name);
			state = save;
		} else {
			free(save);
		}

		if (!shutdown_wait--) {
			mpsslog(PWARN, "%s: Wait for shutdown timed out\n", mic->name);
			goto bootmic_done;
		}
		mpsslog(PINFO, "%s: Waiting for shutdown to complete\n", mic->name);
		sleep(1);
	}

	while (!strcmp(state, "resetting")) {
		save = state;
		if ((state = mpss_readsysfs(mic->name, "state")) == NULL) {
			mpsslog(PWARN, "%s: Wait for reset failed to read state sysfs - try again\n", mic->name);
			state = save;
		} else {
			free(save);
		}

		if (!reset_wait--) {
			mpsslog(PINFO, "%s: Wait for reset timed out\n", mic->name);
			goto bootmic_done;
		}
		mpsslog(PINFO, "%s: Waiting for reset to complete\n", mic->name);
		sleep(1);
	}

	if (strcmp(state, "ready")) {
		mpsslog(PINFO, "%s: Current state \"%s\" cannot boot card\n", mic->name, state);
		free(state);
		goto bootmic_done;
	}

	free(state);

	if ((err = mpss_setsysfs(mic->name, "state", boot_string)) != 0) {
		mpsslog(PINFO, "%s: Booting failed - cannot set state: %s\n", mic->name, strerror(err));
	} else {
		mpsslog(PINFO, "%s: Booting %s initrd %s\n", mic->name, mic->config.boot.osimage, initrd);
	}

bootmic_done:
	while (pthread_mutex_lock(&mpssdi->pth_lock) != 0);
	mpssdi->boot_pth = 0;
	while (pthread_mutex_unlock(&mpssdi->pth_lock) != 0);
bootexit:
	while (pthread_mutex_lock(&start_lock) != 0);
	start_count--;
	while (pthread_mutex_unlock(&start_lock) != 0);
	pthread_exit(NULL);
}