[igt-dev] [PATCH i-g-t v2 01/17] lib/kunit: Drop unused file stream

Mauro Carvalho Chehab mauro.chehab at linux.intel.com
Fri Sep 15 10:36:04 UTC 2023


On Fri,  8 Sep 2023 14:32:35 +0200
Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com> wrote:

> In the process of reviewing patches that introduced kunit support, I asked
> once if we could use line buffered input instead of explicitly looking for
> newlines in KTAP data.  While my idea was wrong because reading raw data
> from /dev/kmsg already returns full log records that always end with a
> newline, conversion of /dev/kmsg file descriptor to a file stream with
> freopen() was added to the code.  However, that file stream has never been
> used for line buffered input.  While the file stream is passed to
> functions that actually read the data, there it is converted back to a
> file descriptor with fileno() and the data is read with read().
> 
> Drop the unnecessary conversions and teach functions to accept and process
> just the file descriptor of /dev/kmsg.

LGTM.

Acked-by: Mauro Carvalho Chehab <mchehab at kernel.org>
> 
> Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com>
> ---
>  lib/igt_kmod.c | 12 +---------
>  lib/igt_ktap.c | 62 +++++++++++++++++++++++---------------------------
>  lib/igt_ktap.h |  2 +-
>  3 files changed, 31 insertions(+), 45 deletions(-)
> 
> diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
> index 6205871791..97667a896f 100644
> --- a/lib/igt_kmod.c
> +++ b/lib/igt_kmod.c
> @@ -758,7 +758,6 @@ static void __igt_kunit(const char *module_name, const char *opts)
>  {
>  	struct igt_ktest tst;
>  	struct kmod_module *kunit_kmod;
> -	FILE *f;
>  	bool is_builtin;
>  	int ret;
>  	struct ktap_test_results *results;
> @@ -774,7 +773,6 @@ static void __igt_kunit(const char *module_name, const char *opts)
>  
>  	if (igt_ktest_begin(&tst) != 0) {
>  		igt_warn("Unable to begin ktest for %s\n", module_name);
> -
>  		igt_ktest_fini(&tst);
>  		igt_fail(IGT_EXIT_ABORT);
>  	}
> @@ -791,14 +789,6 @@ static void __igt_kunit(const char *module_name, const char *opts)
>  		goto unload;
>  	}
>  
> -	f = fdopen(tst.kmsg, "r");
> -
> -	if (f == NULL) {
> -		igt_warn("Could not turn /dev/kmsg file descriptor into a FILE pointer\n");
> -		fail = true;
> -		goto unload;
> -	}
> -
>  	/* The KUnit module is required for running any KUnit tests */
>  	ret = igt_kmod_load("kunit", NULL);
>  	if (ret) {
> @@ -814,7 +804,7 @@ static void __igt_kunit(const char *module_name, const char *opts)
>  
>  	is_builtin = kmod_module_get_initstate(kunit_kmod) == KMOD_MODULE_BUILTIN;
>  
> -	results = ktap_parser_start(f, is_builtin);
> +	results = ktap_parser_start(tst.kmsg, is_builtin);
>  
>  	ret = igt_kmod_load(module_name, opts);
>  	if (ret) {
> diff --git a/lib/igt_ktap.c b/lib/igt_ktap.c
> index ecdcb8d83d..123a40d183 100644
> --- a/lib/igt_ktap.c
> +++ b/lib/igt_ktap.c
> @@ -16,7 +16,7 @@
>  #define DELIMITER "-"
>  
>  struct ktap_parser_args {
> -	FILE *fp;
> +	int fd;
>  	bool is_builtin;
>  	volatile bool is_running;
>  	int ret;
> @@ -24,7 +24,7 @@ struct ktap_parser_args {
>  
>  static struct ktap_test_results results;
>  
> -static int log_to_end(enum igt_log_level level, FILE *f,
> +static int log_to_end(enum igt_log_level level, int fd,
>  		      char *record, const char *format, ...) __attribute__((format(printf, 4, 5)));
>  
>  /**
> @@ -39,12 +39,11 @@ static int log_to_end(enum igt_log_level level, FILE *f,
>   *
>   * Returns: 0 for success, or -2 if there's an error reading from the file
>   */
> -static int log_to_end(enum igt_log_level level, FILE *f,
> +static int log_to_end(enum igt_log_level level, int fd,
>  		      char *record, const char *format, ...)
>  {
>  	va_list args;
>  	const char *lend;
> -	int f_fd = fileno(f);
>  
>  	/* Cutoff after newline character, in order to not display garbage */
>  	char *cutoff = strchr(record, '\n');
> @@ -61,7 +60,7 @@ static int log_to_end(enum igt_log_level level, FILE *f,
>  	while (*lend == '\0') {
>  		igt_log(IGT_LOG_DOMAIN, level, "%s", record);
>  
> -		while (read(f_fd, record, BUF_LEN) < 0) {
> +		while (read(fd, record, BUF_LEN) < 0) {
>  			if (!READ_ONCE(ktap_args.is_running)) {
>  				igt_warn("ktap parser stopped\n");
>  				return -2;
> @@ -157,8 +156,8 @@ static int tap_version_present(char* record, bool print_info)
>  
>  /**
>   * find_next_tap_subtest:
> - * @fp: FILE pointer
> - * @record: buffer used to read fp
> + * @fd: file descriptor
> + * @record: buffer used to read fd
>   * @is_builtin: whether KUnit is built-in or not
>   *
>   * Returns:
> @@ -167,11 +166,10 @@ static int tap_version_present(char* record, bool print_info)
>   * -2 if there are problems while reading the file.
>   * any other value corresponds to the amount of cases of the next (sub)test
>   */
> -static int find_next_tap_subtest(FILE *fp, char *record, char *test_name, bool is_builtin)
> +static int find_next_tap_subtest(int fd, char *record, char *test_name, bool is_builtin)
>  {
>  	const char *test_lookup_str, *subtest_lookup_str, *name_rptr;
>  	long test_count;
> -	int fp_fd = fileno(fp);
>  	char *cutoff;
>  
>  	test_name[0] = '\0';
> @@ -184,7 +182,7 @@ static int find_next_tap_subtest(FILE *fp, char *record, char *test_name, bool i
>  		return -1;
>  
>  	if (is_builtin) {
> -		while (read(fp_fd, record, BUF_LEN) < 0) {
> +		while (read(fd, record, BUF_LEN) < 0) {
>  			if (!READ_ONCE(ktap_args.is_running)) {
>  				igt_warn("ktap parser stopped\n");
>  				return -2;
> @@ -228,7 +226,7 @@ static int find_next_tap_subtest(FILE *fp, char *record, char *test_name, bool i
>  		if (cutoff)
>  			cutoff[0] = '\0';
>  
> -		while (read(fp_fd, record, BUF_LEN) < 0) {
> +		while (read(fd, record, BUF_LEN) < 0) {
>  			if (!READ_ONCE(ktap_args.is_running)) {
>  				igt_warn("ktap parser stopped\n");
>  				return -2;
> @@ -265,7 +263,7 @@ static int find_next_tap_subtest(FILE *fp, char *record, char *test_name, bool i
>  		igt_info("Missing test count\n");
>  		if (test_name[0] == '\0')
>  			return 0;
> -		if (log_to_end(IGT_LOG_INFO, fp, record,
> +		if (log_to_end(IGT_LOG_INFO, fd, record,
>  				"Running some tests in: %s\n",
>  				test_name) < 0)
>  			return -2;
> @@ -275,7 +273,7 @@ static int find_next_tap_subtest(FILE *fp, char *record, char *test_name, bool i
>  		return 0;
>  	}
>  
> -	if (log_to_end(IGT_LOG_INFO, fp, record,
> +	if (log_to_end(IGT_LOG_INFO, fd, record,
>  			"Executing %ld tests in: %s\n",
>  			test_count, test_name) < 0)
>  		return -2;
> @@ -285,8 +283,8 @@ static int find_next_tap_subtest(FILE *fp, char *record, char *test_name, bool i
>  
>  /**
>   * parse_kmsg_for_tap:
> - * @fp: FILE pointer
> - * @record: buffer used to read fp
> + * @fd: file descriptor
> + * @record: buffer used to read fd
>   * @test_name: buffer to store the test name
>   *
>   * Returns:
> @@ -295,7 +293,7 @@ static int find_next_tap_subtest(FILE *fp, char *record, char *test_name, bool i
>   * -1 if a test failed
>   * -2 if there are problems reading the file
>   */
> -static int parse_kmsg_for_tap(FILE *fp, char *record, char *test_name)
> +static int parse_kmsg_for_tap(int fd, char *record, char *test_name)
>  {
>  	const char *lstart, *ok_lookup_str, *nok_lookup_str,
>  	      *ok_rptr, *nok_rptr, *comment_start, *value_parse_start;
> @@ -324,7 +322,7 @@ static int parse_kmsg_for_tap(FILE *fp, char *record, char *test_name)
>  		while (!isspace(*test_name_end))
>  			test_name_end++;
>  		*test_name_end = '\0';
> -		if (log_to_end(IGT_LOG_WARN, fp, record,
> +		if (log_to_end(IGT_LOG_WARN, fd, record,
>  			       "%s", lstart) < 0)
>  			return -2;
>  		return -1;
> @@ -338,7 +336,7 @@ static int parse_kmsg_for_tap(FILE *fp, char *record, char *test_name)
>  		value_parse_start = comment_start;
>  
>  		if (lookup_value(value_parse_start, "fail: ") > 0) {
> -			if (log_to_end(IGT_LOG_WARN, fp, record,
> +			if (log_to_end(IGT_LOG_WARN, fd, record,
>  				       "%s", lstart) < 0)
>  				return -2;
>  			return -1;
> @@ -362,7 +360,7 @@ static int parse_kmsg_for_tap(FILE *fp, char *record, char *test_name)
>  
>  /**
>   * parse_tap_level:
> - * @fp: FILE pointer
> + * @fd: file descriptor
>   * @base_test_name: test_name from upper recursion level
>   * @test_count: test_count of this level
>   * @failed_tests: top level failed_tests pointer
> @@ -373,10 +371,9 @@ static int parse_kmsg_for_tap(FILE *fp, char *record, char *test_name)
>   * 0 if succeded
>   * -1 if error occurred
>   */
> -static int parse_tap_level(FILE *fp, char *base_test_name, int test_count, bool *failed_tests,
> +static int parse_tap_level(int fd, char *base_test_name, int test_count, bool *failed_tests,
>  			   bool *found_tests, bool is_builtin)
>  {
> -	int fp_fd = fileno(fp);
>  	char record[BUF_LEN + 1];
>  	struct ktap_test_results_element *r, *temp;
>  	int internal_test_count;
> @@ -384,7 +381,7 @@ static int parse_tap_level(FILE *fp, char *base_test_name, int test_count, bool
>  	char base_test_name_for_next_level[BUF_LEN + 1];
>  
>  	for (int i = 0; i < test_count; i++) {
> -		while (read(fp_fd, record, BUF_LEN) < 0) {
> +		while (read(fd, record, BUF_LEN) < 0) {
>  			if (!READ_ONCE(ktap_args.is_running)) {
>  				igt_warn("ktap parser stopped\n");
>  				return -1;
> @@ -409,7 +406,7 @@ static int parse_tap_level(FILE *fp, char *base_test_name, int test_count, bool
>  		/* Sublevel found */
>  		if (tap_version_present(record, false))
>  		{
> -			internal_test_count = find_next_tap_subtest(fp, record, test_name,
> +			internal_test_count = find_next_tap_subtest(fd, record, test_name,
>  								    is_builtin);
>  			switch (internal_test_count) {
>  			case -2:
> @@ -433,7 +430,7 @@ static int parse_tap_level(FILE *fp, char *base_test_name, int test_count, bool
>  				memcpy(base_test_name_for_next_level + strlen(base_test_name_for_next_level),
>  				       test_name, BUF_LEN - strlen(base_test_name_for_next_level));
>  
> -				if (parse_tap_level(fp, base_test_name_for_next_level,
> +				if (parse_tap_level(fd, base_test_name_for_next_level,
>  						    internal_test_count, failed_tests, found_tests,
>  						    is_builtin) == -1)
>  					return -1;
> @@ -441,7 +438,7 @@ static int parse_tap_level(FILE *fp, char *base_test_name, int test_count, bool
>  			}
>  		}
>  
> -		switch (parse_kmsg_for_tap(fp, record, test_name)) {
> +		switch (parse_kmsg_for_tap(fd, record, test_name)) {
>  		case -2:
>  			return -1;
>  		case -1:
> @@ -516,8 +513,7 @@ static int parse_tap_level(FILE *fp, char *base_test_name, int test_count, bool
>   */
>  void *igt_ktap_parser(void *unused)
>  {
> -	FILE *fp = ktap_args.fp;
> -	int fp_fd = fileno(fp);
> +	int fd = ktap_args.fd;
>  	char record[BUF_LEN + 1];
>  	bool is_builtin = ktap_args.is_builtin;
>  	char test_name[BUF_LEN + 1];
> @@ -534,7 +530,7 @@ igt_ktap_parser_start:
>  	test_name[0] = '\0';
>  	test_name[BUF_LEN] = '\0';
>  
> -	while (read(fp_fd, record, BUF_LEN) < 0) {
> +	while (read(fd, record, BUF_LEN) < 0) {
>  		if (!READ_ONCE(ktap_args.is_running)) {
>  			igt_warn("ktap parser stopped\n");
>  			goto igt_ktap_parser_end;
> @@ -553,7 +549,7 @@ igt_ktap_parser_start:
>  		}
>  	}
>  
> -	test_count = find_next_tap_subtest(fp, record, test_name, is_builtin);
> +	test_count = find_next_tap_subtest(fd, record, test_name, is_builtin);
>  
>  	switch (test_count) {
>  	case -2:
> @@ -569,7 +565,7 @@ igt_ktap_parser_start:
>  	default:
>  		found_tests = true;
>  
> -		if (parse_tap_level(fp, test_name, test_count, &failed_tests, &found_tests,
> +		if (parse_tap_level(fd, test_name, test_count, &failed_tests, &found_tests,
>  				    is_builtin) == -1)
>  			goto igt_ktap_parser_end;
>  
> @@ -578,7 +574,7 @@ igt_ktap_parser_start:
>  
>  	/* Parse topmost level */
>  	test_name[0] = '\0';
> -	parse_tap_level(fp, test_name, test_count, &failed_tests, &found_tests, is_builtin);
> +	parse_tap_level(fd, test_name, test_count, &failed_tests, &found_tests, is_builtin);
>  
>  igt_ktap_parser_end:
>  	results.still_running = false;
> @@ -593,13 +589,13 @@ igt_ktap_parser_end:
>  
>  static pthread_t ktap_parser_thread;
>  
> -struct ktap_test_results *ktap_parser_start(FILE *fp, bool is_builtin)
> +struct ktap_test_results *ktap_parser_start(int fd, bool is_builtin)
>  {
>  	results.head = NULL;
>  	pthread_mutex_init(&results.mutex, NULL);
>  	results.still_running = true;
>  
> -	ktap_args.fp = fp;
> +	ktap_args.fd = fd;
>  	ktap_args.is_builtin = is_builtin;
>  	ktap_args.is_running = true;
>  	pthread_create(&ktap_parser_thread, NULL, igt_ktap_parser, NULL);
> diff --git a/lib/igt_ktap.h b/lib/igt_ktap.h
> index 34fe095720..ea57c2bb9b 100644
> --- a/lib/igt_ktap.h
> +++ b/lib/igt_ktap.h
> @@ -44,7 +44,7 @@ struct ktap_test_results {
>  
>  
>  
> -struct ktap_test_results *ktap_parser_start(FILE *fp, bool is_builtin);
> +struct ktap_test_results *ktap_parser_start(int fd, bool is_builtin);
>  int ktap_parser_stop(void);
>  
>  #endif /* IGT_KTAP_H */


More information about the igt-dev mailing list