[Devel] [PATCH RHEL9 COMMIT] Revert "fs/fuse kio: introduce a new rpc affinity mode"
Konstantin Khorenko
khorenko at virtuozzo.com
Tue Jul 8 17:41:15 MSK 2025
The commit is pushed to "branch-rh9-5.14.0-427.55.1.vz9.82.x-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh9-5.14.0-427.55.1.vz9.82.4
------>
commit 236bfbf16b33ba9a0f31674781bb03fad6aeeb1e
Author: Konstantin Khorenko <khorenko at virtuozzo.com>
Date: Tue Jul 8 16:38:20 2025 +0200
Revert "fs/fuse kio: introduce a new rpc affinity mode"
This reverts commit f921b884234b939aa33c7e3b0b8c9559d3a583d9.
We'll have another and better commit solving the problem:
[PATCH VZ9 v2] fs/fuse kio: do not set RPC affinity from a workequeue worker
https://virtuozzo.atlassian.net/browse/VSTOR-109481
Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
Feature: vStorage
---
fs/fuse/kio/pcs/pcs_rpc.c | 92 -----------------------------------------------
fs/fuse/kio/pcs/pcs_rpc.h | 7 ----
2 files changed, 99 deletions(-)
diff --git a/fs/fuse/kio/pcs/pcs_rpc.c b/fs/fuse/kio/pcs/pcs_rpc.c
index f15d0c3fb7cd5..e3ae54297f5a5 100644
--- a/fs/fuse/kio/pcs/pcs_rpc.c
+++ b/fs/fuse/kio/pcs/pcs_rpc.c
@@ -44,18 +44,8 @@ static unsigned long rpc_cpu_time_slice = PCS_RPC_CPU_SLICE;
module_param(rpc_cpu_time_slice, ulong, 0644);
MODULE_PARM_DESC(rpc_cpu_time_slice, "Time slice for RPC rebinding");
-static unsigned long rpc_cpu_timeout = PCS_RPC_CPU_TIMEOUT; // 500 ms
-module_param(rpc_cpu_timeout, ulong, 0644);
-MODULE_PARM_DESC(rpc_cpu_timeout, "Timeout for RPC binding after become idle");
-
-static unsigned int rpc_cpu_nr_base = 2;
-module_param(rpc_cpu_nr_base, uint, 0644);
-MODULE_PARM_DESC(rpc_cpu_nr_base, "The minimum cap of numbers of rpc per cpu");
-
DECLARE_WAIT_QUEUE_HEAD(pcs_waitq);
-static DEFINE_PER_CPU(struct pcs_rpc_cpu, rpc_cpu) = { .nr_attached = ATOMIC_INIT(0) };
-
static void timer_work(struct work_struct *w);
static int rpc_gc_classify(struct pcs_rpc * ep);
@@ -371,7 +361,6 @@ static void pcs_rpc_destroy(struct pcs_rpc *ep)
cancel_delayed_work_sync(&ep->calendar_work);
flush_work(&ep->work);
- flush_delayed_work(&ep->cpu_timer_work);
/* pcs_free(ep->sun); */
/* ep->sun = NULL; */
@@ -801,61 +790,6 @@ static int pcs_rpc_cpu_next(void)
return new;
}
-static void pcs_rpc_cpu_select(struct pcs_rpc *ep)
-{
- struct pcs_rpc_cpu *prc;
- int cpu, node, max_rpc_per_cpu;
-
- if (ep->cpu != WORK_CPU_UNBOUND)
- atomic_dec_if_positive(&per_cpu_ptr(&rpc_cpu, ep->cpu)->nr_attached);
-
- /*
- * lock protection for reading eng->nrpcs is unnecessary, as
- * we just need to derive a rough value.
- */
- max_rpc_per_cpu = ep->eng->nrpcs / nr_cpu_ids + rpc_cpu_nr_base;
-
- /* Check current cpu first.*/
- cpu = smp_processor_id();
- prc = per_cpu_ptr(&rpc_cpu, cpu);
- if (atomic_read(&prc->nr_attached) < max_rpc_per_cpu)
- goto found;
-
- /* Try to find one cpu from same numa node. */
- node = cpu_to_node(cpu);
- cpu = cpumask_first_and(cpumask_of_node(node), cpu_online_mask);
- while (cpu < nr_cpu_ids) {
- prc = per_cpu_ptr(&rpc_cpu, cpu);
- if (atomic_read(&prc->nr_attached) < max_rpc_per_cpu)
- goto found;
- cpu = cpumask_next_and(cpu, cpumask_of_node(node), cpu_online_mask);
- }
-
- /*
- * Otherwise, search all cpus to find one. It is a bit inefficient here,
- * however we don't expect this function to be called frequently in performance
- * critical path. So simplicity is preferred.
- */
- for_each_online_cpu(cpu) {
- prc = per_cpu_ptr(&rpc_cpu, cpu);
- if (atomic_read(&prc->nr_attached) < max_rpc_per_cpu)
- goto found;
- }
-
- // Should not reach here
- WARN_ONCE(1, "Failed to find a cpu for pcs_rpc work");
- ep->cpu = WORK_CPU_UNBOUND;
-
- return;
-
-found:
- atomic_inc(&prc->nr_attached);
- ep->cpu = cpu;
- ep->cpu_stamp = jiffies + rpc_cpu_time_slice;
- if (unlikely(!timer_pending(&ep->cpu_timer_work.timer)))
- mod_delayed_work(cc_from_rpc(ep->eng)->wq, &ep->cpu_timer_work, rpc_cpu_timeout);
-}
-
static void pcs_rpc_affinity(struct pcs_rpc *ep, bool was_idle)
{
switch(rpc_affinity_mode) {
@@ -911,31 +845,6 @@ void pcs_rpc_queue(struct pcs_rpc * ep, struct pcs_msg * msg)
pcs_rpc_kick_queue(ep);
}
-static void rpc_cpu_timer_work(struct work_struct *w)
-{
- struct pcs_rpc *ep = container_of(w, struct pcs_rpc, cpu_timer_work.work);
- struct pcs_rpc_cpu *prc;
-
- if (unlikely(ep->cpu == WORK_CPU_UNBOUND))
- return;
-
- spin_lock(&ep->q_lock);
- if ((ep->state == PCS_RPC_WORK) &&
- time_is_after_jiffies(ep->cpu_stamp + rpc_cpu_timeout)) {
- unsigned long timeout;
-
- spin_unlock(&ep->q_lock);
- timeout = rpc_cpu_timeout - (jiffies - ep->cpu_stamp);
- mod_delayed_work(cc_from_rpc(ep->eng)->wq, &ep->cpu_timer_work, timeout);
- return;
- }
-
- prc = per_cpu_ptr(&rpc_cpu, ep->cpu);
- ep->cpu = WORK_CPU_UNBOUND;
- atomic_dec(&prc->nr_attached);
- spin_unlock(&ep->q_lock);
-}
-
static void calendar_work(struct work_struct *w)
{
struct pcs_rpc * ep = container_of(w, struct pcs_rpc, calendar_work.work);
@@ -1124,7 +1033,6 @@ void pcs_rpc_configure_new_ep(struct pcs_rpc * ep, struct pcs_rpc_params *parm,
INIT_WORK(&ep->close_work, rpc_close_work);
INIT_DELAYED_WORK(&ep->timer_work, timer_work);
INIT_DELAYED_WORK(&ep->calendar_work, calendar_work);
- INIT_DELAYED_WORK(&ep->cpu_timer_work, rpc_cpu_timer_work);
for (i = 0; i < RPC_MAX_CALENDAR; i++)
INIT_HLIST_HEAD(&ep->kill_calendar[i]);
diff --git a/fs/fuse/kio/pcs/pcs_rpc.h b/fs/fuse/kio/pcs/pcs_rpc.h
index 0bafc8a742636..cef029a84579d 100644
--- a/fs/fuse/kio/pcs/pcs_rpc.h
+++ b/fs/fuse/kio/pcs/pcs_rpc.h
@@ -40,7 +40,6 @@ enum {
RPC_AFFINITY_RETENT = 1,
RPC_AFFINITY_SPREAD = 2,
RPC_AFFINITY_RSS = 3,
- RPC_AFFINITY_FAIR_SPREAD = 4,
};
extern unsigned int rpc_affinity_mode;
@@ -79,7 +78,6 @@ typedef union __pre_aligned(8) _PCS_CLUSTER_ID_T {
/////////////////////////////
#define PCS_RPC_CPU_SLICE (100 * HZ / 1000) /* 100ms */
-#define PCS_RPC_CPU_TIMEOUT (500 * HZ / 1000) /* 500ms */
struct pcs_rpc
{
struct hlist_node link; /* Link in hash table */
@@ -141,7 +139,6 @@ struct pcs_rpc
struct list_head input_queue; /* Queue of requests waiting to be handled */
int cpu;
unsigned long cpu_stamp;
- struct delayed_work cpu_timer_work; /* reset cpu affinity after being idle */
int rx_cpu;
struct mutex mutex;
@@ -164,10 +161,6 @@ struct pcs_rpc
struct work_struct close_work;
};
-struct pcs_rpc_cpu {
- atomic_t nr_attached;
-};
-
struct pcs_rpc_engine
{
spinlock_t lock;
More information about the Devel
mailing list