diff mbox series

[v2,03/20] multipathd: remove checker restart optimization

Message ID 20240717181106.2173527-4-bmarzins@redhat.com (mailing list archive)
State Not Applicable, archived
Delegated to: christophe varoqui
Headers show
Series path checker refactor and misc fixes | expand

Commit Message

Benjamin Marzinski July 17, 2024, 6:10 p.m. UTC
Future commits will make this optimization unusable.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
 multipathd/main.c | 27 +++++----------------------
 1 file changed, 5 insertions(+), 22 deletions(-)

Comments

Martin Wilck July 18, 2024, 7:41 p.m. UTC | #1
On Wed, 2024-07-17 at 14:10 -0400, Benjamin Marzinski wrote:
> Future commits will make this optimization unusable.
> 
> Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
> ---
>  multipathd/main.c | 27 +++++----------------------
>  1 file changed, 5 insertions(+), 22 deletions(-)
> 
> diff --git a/multipathd/main.c b/multipathd/main.c
> index 13ed6d05..eaef505a 100644
> --- a/multipathd/main.c
> +++ b/multipathd/main.c
> @@ -2704,7 +2704,7 @@ checkerloop (void *ap)
>  
>  	while (1) {
>  		struct timespec diff_time, start_time, end_time;
> -		int num_paths = 0, strict_timing, rc = 0, i = 0;
> +		int num_paths = 0, strict_timing, rc = 0;
>  		unsigned int ticks = 0;
>  		enum checker_state checker_state = CHECKER_STARTING;
>  
> @@ -2723,7 +2723,7 @@ checkerloop (void *ap)
>  			sd_notify(0, "WATCHDOG=1");
>  #endif
>  		while (checker_state != CHECKER_FINISHED) {
> -			unsigned int paths_checked = 0;
> +			unsigned int paths_checked = 0, i;

Nit: To avoid a coverity warning for the "i--" statement below, you
need to use a signed int for "i".

I can change this later on.

Martin

>  			struct timespec chk_start_time;
>  
>  			pthread_cleanup_push(cleanup_lock, &vecs-
> >lock);
> @@ -2733,28 +2733,11 @@ checkerloop (void *ap)
>  			if (checker_state == CHECKER_STARTING) {
>  				vector_foreach_slot(vecs->pathvec,
> pp, i)
>  					pp->is_checked = false;
> -				i = 0;
>  				checker_state = CHECKER_RUNNING;
> -			} else {
> -				/*
> -				 * Paths could have been removed
> since we
> -				 * dropped the lock. Find the path
> to continue
> -				 * checking at. Since paths can be
> removed from
> -				 * anywhere in the vector, but can
> only be added
> -				 * at the end, the last checked path
> must be
> -				 * between its old location, and the
> start or
> -				 * the vector.
> -				 */
> -				if (i >= VECTOR_SIZE(vecs->pathvec))
> -					i = VECTOR_SIZE(vecs-
> >pathvec) - 1;
> -				while ((pp = VECTOR_SLOT(vecs-
> >pathvec, i))) {
> -					if (pp->is_checked == true)
> -						break;
> -					i--;
> -				}
> -				i++;
>  			}
> -			vector_foreach_slot_after (vecs->pathvec,
> pp, i) {
> +			vector_foreach_slot(vecs->pathvec, pp, i) {
> +				if (pp->is_checked)
> +					continue;
>  				pp->is_checked = true;
>  				rc = check_path(vecs, pp, ticks);
>  				if (rc < 0) {
diff mbox series

Patch

diff --git a/multipathd/main.c b/multipathd/main.c
index 13ed6d05..eaef505a 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2704,7 +2704,7 @@  checkerloop (void *ap)
 
 	while (1) {
 		struct timespec diff_time, start_time, end_time;
-		int num_paths = 0, strict_timing, rc = 0, i = 0;
+		int num_paths = 0, strict_timing, rc = 0;
 		unsigned int ticks = 0;
 		enum checker_state checker_state = CHECKER_STARTING;
 
@@ -2723,7 +2723,7 @@  checkerloop (void *ap)
 			sd_notify(0, "WATCHDOG=1");
 #endif
 		while (checker_state != CHECKER_FINISHED) {
-			unsigned int paths_checked = 0;
+			unsigned int paths_checked = 0, i;
 			struct timespec chk_start_time;
 
 			pthread_cleanup_push(cleanup_lock, &vecs->lock);
@@ -2733,28 +2733,11 @@  checkerloop (void *ap)
 			if (checker_state == CHECKER_STARTING) {
 				vector_foreach_slot(vecs->pathvec, pp, i)
 					pp->is_checked = false;
-				i = 0;
 				checker_state = CHECKER_RUNNING;
-			} else {
-				/*
-				 * Paths could have been removed since we
-				 * dropped the lock. Find the path to continue
-				 * checking at. Since paths can be removed from
-				 * anywhere in the vector, but can only be added
-				 * at the end, the last checked path must be
-				 * between its old location, and the start or
-				 * the vector.
-				 */
-				if (i >= VECTOR_SIZE(vecs->pathvec))
-					i = VECTOR_SIZE(vecs->pathvec) - 1;
-				while ((pp = VECTOR_SLOT(vecs->pathvec, i))) {
-					if (pp->is_checked == true)
-						break;
-					i--;
-				}
-				i++;
 			}
-			vector_foreach_slot_after (vecs->pathvec, pp, i) {
+			vector_foreach_slot(vecs->pathvec, pp, i) {
+				if (pp->is_checked)
+					continue;
 				pp->is_checked = true;
 				rc = check_path(vecs, pp, ticks);
 				if (rc < 0) {