Re: [PATCH v2] Fix the "foreach DE" task identifier displays incorrect state tasks.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2023/08/02 17:18, Lianbo Jiang wrote:
> Currently, the "foreach DE ps -m" command may display "DE" as well as
> "ZO" state tasks as below:
> 
>    crash> foreach DE ps -m
>    ...
>    [0 00:00:00.040] [ZO]  PID: 11458    TASK: ffff91c75680d280  CPU: 7    COMMAND: "ora_w01o_p01mci"
>    [0 00:00:00.044] [ZO]  PID: 49118    TASK: ffff91c7bf3e8000  CPU: 19   COMMAND: "oracle_49118_p0"
>    [0 00:00:00.050] [ZO]  PID: 28748    TASK: ffff91a7cbde3180  CPU: 2    COMMAND: "ora_imr0_p01sci"
>    [0 00:00:00.050] [DE]  PID: 28405    TASK: ffff91a7c8eb0000  CPU: 27   COMMAND: "ora_vktm_p01sci"
>    [0 00:00:00.051] [ZO]  PID: 31716    TASK: ffff91a7f7192100  CPU: 6    COMMAND: "ora_p001_p01sci"
>    ...
> 
> That is not expected behavior, the "foreach" command needs to handle
> such cases. Let's add a check to determine if the task state identifier
> is specified and the specified identifier is equal to the actual task
> state identifier, so that it can filter out the unspecified state
> tasks.
> 
> With the patch:
>    crash> foreach DE ps -m
>    [0 00:00:00.050] [DE]  PID: 28405    TASK: ffff91a7c8eb0000  CPU: 27   COMMAND: "ora_vktm_p01sci"
>    crash>
> 
> Signed-off-by: Lianbo Jiang <lijiang@xxxxxxxxxx>
> ---
>   defs.h |  2 +-
>   task.c | 52 +++++++++++++++++++---------------------------------
>   2 files changed, 20 insertions(+), 34 deletions(-)
> 
> diff --git a/defs.h b/defs.h
> index 358f365585cf..5ee60f1eb3a5 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -1203,7 +1203,7 @@ struct foreach_data {
>   		char *pattern;
>   		regex_t regex;
>   	} regex_info[MAX_REGEX_ARGS];
> -	ulong state;
> +	const char *state;
>   	char *reference;
>   	int keys;
>   	int pids;
> diff --git a/task.c b/task.c
> index b9076da35565..20a9ce3aa40b 100644
> --- a/task.c
> +++ b/task.c
> @@ -6636,39 +6636,42 @@ cmd_foreach(void)
>   		    STREQ(args[optind], "NE") ||
>   		    STREQ(args[optind], "SW")) {
>   
> +			ulong state = TASK_STATE_UNINITIALIZED;
> +
>   			if (fd->flags & FOREACH_STATE)
>   				error(FATAL, "only one task state allowed\n");
>   
>   			if (STREQ(args[optind], "RU"))
> -				fd->state = _RUNNING_;
> +				state = _RUNNING_;
>   			else if (STREQ(args[optind], "IN"))
> -				fd->state = _INTERRUPTIBLE_;
> +				state = _INTERRUPTIBLE_;
>   			else if (STREQ(args[optind], "UN"))
> -				fd->state = _UNINTERRUPTIBLE_;
> +				state = _UNINTERRUPTIBLE_;
>   			else if (STREQ(args[optind], "ST"))
> -				fd->state = _STOPPED_;
> +				state = _STOPPED_;
>   			else if (STREQ(args[optind], "TR"))
> -				fd->state = _TRACING_STOPPED_;
> +				state = _TRACING_STOPPED_;
>   			else if (STREQ(args[optind], "ZO"))
> -				fd->state = _ZOMBIE_;
> +				state = _ZOMBIE_;
>   			else if (STREQ(args[optind], "DE"))
> -				fd->state = _DEAD_;
> +				state = _DEAD_;
>   			else if (STREQ(args[optind], "SW"))
> -				fd->state = _SWAPPING_;
> +				state = _SWAPPING_;
>   			else if (STREQ(args[optind], "PA"))
> -				fd->state = _PARKED_;
> +				state = _PARKED_;
>   			else if (STREQ(args[optind], "WA"))
> -				fd->state = _WAKING_;
> +				state = _WAKING_;
>   			else if (STREQ(args[optind], "ID"))
> -				fd->state = _UNINTERRUPTIBLE_|_NOLOAD_;
> +				state = _UNINTERRUPTIBLE_|_NOLOAD_;
>   			else if (STREQ(args[optind], "NE"))
> -				fd->state = _NEW_;
> +				state = _NEW_;
>   
> -			if (fd->state == TASK_STATE_UNINITIALIZED)
> +			if (state == TASK_STATE_UNINITIALIZED)
>   				error(FATAL,
>   				    "invalid task state for this kernel: %s\n",
>   					args[optind]);
>   
> +			fd->state = args[optind];
>   			fd->flags |= FOREACH_STATE;
>   
>   			optind++;
> @@ -7039,26 +7042,9 @@ foreach(struct foreach_data *fd)
>   		if ((fd->flags & FOREACH_KERNEL) && !is_kernel_thread(tc->task))
>   			continue;
>   
> -		if (fd->flags & FOREACH_STATE) {
> -			if (fd->state == _RUNNING_) {
> -				if (task_state(tc->task) != _RUNNING_)
> -					continue;
> -			} else if (fd->state & _UNINTERRUPTIBLE_) {
> -				if (!(task_state(tc->task) & _UNINTERRUPTIBLE_))
> -					continue;
> -
> -				if (valid_task_state(_NOLOAD_)) {
> -					if (fd->state & _NOLOAD_) {
> -						if (!(task_state(tc->task) & _NOLOAD_))
> -							continue;
> -					} else {
> -						if ((task_state(tc->task) & _NOLOAD_))
> -							continue;
> -					}
> -				}
> -			} else if (!(task_state(tc->task) & fd->state))
> -				continue;
> -		}
> +		if ((fd->flags & FOREACH_STATE) &&
> +			(!STRNEQ(task_state_string(tc->task, buf, 0), fd->state)))
> +			continue;

Thank you for the update.

sorry for kind of nitpicking, why is this STRNEQ()?

Thanks,
Kazu
--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux