[Devel] [PATCH RHEL9 COMMIT] Revert "fs/fuse kio: introduce a new rpc affinity mode"
Konstantin Khorenko
khorenko at virtuozzo.com
Tue Jul 8 17:39:27 MSK 2025
disregard
--
Best regards,
Konstantin Khorenko,
Virtuozzo Linux Kernel Team
On 08.07.2025 16:24, Konstantin Khorenko wrote:
> 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 36c4e930385508483582da285c03311ac8bb3fee
> Author: Konstantin Khorenko <khorenko at virtuozzo.com>
> Date: Tue Jul 8 16:22:35 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 | 96 -----------------------------------------------
> fs/fuse/kio/pcs/pcs_rpc.h | 7 ----
> 2 files changed, 103 deletions(-)
>
> diff --git a/fs/fuse/kio/pcs/pcs_rpc.c b/fs/fuse/kio/pcs/pcs_rpc.c
> index 4ab38b3989148..81da47f761555 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);
>
> @@ -370,7 +360,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; */
> @@ -800,61 +789,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) {
> @@ -880,10 +814,6 @@ static void pcs_rpc_affinity(struct pcs_rpc *ep, bool was_idle)
> ep->cpu = pcs_rpc_cpu_next();
> }
> break;
> - case RPC_AFFINITY_FAIR_SPREAD:
> - if (time_is_before_jiffies(ep->cpu_stamp) && was_idle)
> - pcs_rpc_cpu_select(ep);
> - break;
> default:
> pr_err("Unknown affinity mode: %u\n", rpc_affinity_mode);
> }
> @@ -904,31 +834,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);
> @@ -1117,7 +1022,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 cb18557a3da5e..baec7f844e38c 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 */
>
> struct mutex mutex;
> u64 accounted;
> @@ -163,10 +160,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