device-mapper-multipath/0152-multipathd-remove-thread-from-mpath_pr_event_handle.patch
Benjamin Marzinski 5a8898b817 device-mapper-multipath-0.8.7-40
Add 0150-libmpathpersist-retry-commands-on-other-paths-in-mpa.patch
Add 0151-libmpathpersist-check-released-key-against-the-reser.patch
Add 0152-multipathd-remove-thread-from-mpath_pr_event_handle.patch
Add 0153-libmpathpersist-remove-uneeded-wrapper-function.patch
Add 0154-libmpathpersist-reduce-log-level-for-persistent-rese.patch
Add 0155-libmpathpersist-remove-pointless-update_map_pr-ret-v.patch
Add 0156-multipathd-use-update_map_pr-in-mpath_pr_event_handl.patch
Add 0157-libmpathpersist-limit-changing-prflag-in-update_map_.patch
Add 0158-multipathd-Don-t-call-update_map_pr-unnecessarily.patch
Add 0159-libmpathpersist-remove-useless-function-send_prout_a.patch
Add 0160-libmpathpersist-fix-memory-leak-in-mpath_prout_rel.patch
Add 0161-limpathpersist-redesign-failed-release-workaround.patch
Add 0162-libmpathpersist-fail-the-release-if-all-threads-fail.patch
Add 0163-limpathpersist-Handle-changing-key-corner-case.patch
Add 0164-libmpathpersist-fix-command-keyword-ordering.patch
Add 0165-libmpathpersist-use-conf-timeout-for-updating-persis.patch
Add 0166-libmapthpersist-Handle-REGISTER-AND-IGNORE-changing-.patch
Add 0167-libmultipath-rename-prflag_value-enums.patch
Add 0168-libmpathpersist-use-a-switch-statement-for-prout-com.patch
Add 0169-libmpathpersist-Add-safety-check-for-preempting-on-k.patch
Add 0170-limpathpersist-remove-update_map_pr-code-for-NULL-pp.patch
Add 0171-libmpathpersist-move-update_map_pr-to-multipathd.patch
Add 0172-multipathd-clean-up-update_map_pr-and-mpath_pr_event.patch
Add 0173-libmpathpersist-clean-up-duplicate-function-declarat.patch
Add 0174-multipathd-wrap-setting-and-unsetting-prflag.patch
Add 0175-multipathd-unregister-PR-key-when-path-is-restored-i.patch
Add 0176-libmpathpersist-Fix-up-reservation_key-checking.patch
Add 0177-libmpathpersist-change-how-reservation-conflicts-are.patch
Add 0178-libmpathpersist-Clear-prkey-in-multipathd-before-unr.patch
Add 0179-libmpathpersist-only-clear-the-key-if-we-are-using-t.patch
Add 0180-libmpathpersist-Restore-old-reservation-key-on-failu.patch
Add 0181-libmpatpersist-update-reservation-key-before-checkin.patch
Add 0182-libmpathpersist-retry-on-conflicts-in-mpath_prout_co.patch
Add 0183-libmpathpersist-Don-t-always-fail-registrations-for-.patch
Add 0184-libmpathpersist-Don-t-try-release-workaround-for-inv.patch
Add 0185-libmpathpersist-Don-t-fail-RESERVE-commands-unnecess.patch
Add 0186-libmpathpersist-reregister-keys-when-self-preempting.patch
Add 0187-libmpathpersist-handle-updating-key-race-condition.patch
Add 0188-libmpathpersist-handle-preempting-all-registrants-re.patch
Add 0189-libmpathpersist-Fix-REGISTER-AND-IGNORE-while-holdin.patch
Add 0190-libmpathpersist-Handle-RESERVE-with-reservation-held.patch
Add 0191-libmpathpersist-use-check_holding_reservation-in-mpa.patch
Add 0192-libmpathpersist-Fix-unregistering-while-holding-the-.patch
Add 0193-libmpathpersist-Fix-race-between-restoring-a-path-an.patch
Add 0194-multipathd-Fix-tracking-of-old-PR-key.patch
  * Fixes RHEL-118515 ("There are many bugs in multipath's persistent
    reservation handling")
Resolves: RHEL-118515
2025-10-01 15:39:06 -04:00

113 lines
3.1 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Benjamin Marzinski <bmarzins@redhat.com>
Date: Mon, 16 Jun 2025 19:25:50 -0400
Subject: [PATCH] multipathd: remove thread from mpath_pr_event_handle
mpath_pr_event_handle() creates a separate thread to do the persistent
reservation work, but it doesn't take any advantage of the work being
done in another thread. Merge mpath_pr_event_handle() and
mpath_pr_event_handler_fn() into a single function with no separate
thread.
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
multipathd/main.c | 49 ++++++++++++-----------------------------------
multipathd/main.h | 3 ---
2 files changed, 12 insertions(+), 40 deletions(-)
diff --git a/multipathd/main.c b/multipathd/main.c
index 4119ad79..3f4b8ff6 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -90,6 +90,8 @@
#define CMDSIZE 160
#define MSG_SIZE 32
+static void mpath_pr_event_handle(struct path *pp);
+
#define LOG_MSG(lvl, pp) \
do { \
if (pp->mpp && checker_selected(&pp->checker) && \
@@ -3722,17 +3724,24 @@ main (int argc, char *argv[])
return (child(NULL));
}
-void * mpath_pr_event_handler_fn (void * pathp )
+static void mpath_pr_event_handle(struct path *pp)
{
struct multipath * mpp;
unsigned int i;
int ret, isFound;
- struct path * pp = (struct path *)pathp;
struct prout_param_descriptor *param;
struct prin_resp *resp;
- rcu_register_thread();
mpp = pp->mpp;
+ if (pp->bus != SYSFS_BUS_SCSI) {
+ mpp->prflag = PRFLAG_UNSET;
+ return;
+ }
+
+ if (!get_be64(mpp->reservation_key)) {
+ mpp->prflag = PRFLAG_UNSET;
+ return;
+ }
resp = mpath_alloc_prin_response(MPATH_PRIN_RKEY_SA);
if (!resp){
@@ -3799,38 +3808,4 @@ void * mpath_pr_event_handler_fn (void * pathp )
out:
if (resp)
free(resp);
- rcu_unregister_thread();
- return NULL;
-}
-
-int mpath_pr_event_handle(struct path *pp)
-{
- pthread_t thread;
- int rc;
- pthread_attr_t attr;
- struct multipath * mpp;
-
- if (pp->bus != SYSFS_BUS_SCSI)
- goto no_pr;
-
- mpp = pp->mpp;
-
- if (!get_be64(mpp->reservation_key))
- goto no_pr;
-
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
-
- rc = pthread_create(&thread, NULL , mpath_pr_event_handler_fn, pp);
- if (rc) {
- condlog(0, "%s: ERROR; return code from pthread_create() is %d", pp->dev, rc);
- return -1;
- }
- pthread_attr_destroy(&attr);
- rc = pthread_join(thread, NULL);
- return 0;
-
-no_pr:
- pp->mpp->prflag = PRFLAG_UNSET;
- return 0;
}
diff --git a/multipathd/main.h b/multipathd/main.h
index 4138faa4..897051e0 100644
--- a/multipathd/main.h
+++ b/multipathd/main.h
@@ -52,10 +52,7 @@ void dumpHex(const char * , int len, int no_ascii);
int prout_do_scsi_ioctl(char * , int rq_servact, int rq_scope,
unsigned int rq_type,
struct prout_param_descriptor *param, int noisy);
-int mpath_pr_event_handle(struct path *pp);
-void * mpath_pr_event_handler_fn (void * );
int update_map_pr(struct multipath *mpp);
-void * mpath_pr_event_handler_fn (void * pathp );
void handle_signals(bool);
int __setup_multipath (struct vectors * vecs, struct multipath * mpp,
int reset);