[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