From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (unknown [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id 335E380069 for ; Wed, 26 Aug 2026 13:10:40 +0000 (UTC) Received: from mail.openvz.org (localhost [127.0.0.1]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 67QD9FlW008326; Wed, 26 Aug 2026 16:09:16 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 67QD9FlW008326 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="OzFfxF52" Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 67QD9DHB008312 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Wed, 26 Aug 2026 16:09:14 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 67QD9DHB008312 Received: by mail-ed1-f72.google.com with SMTP id 4fb4d7f45d1cf-6a5d7e3ac13so917306a12.3 for ; Wed, 26 Aug 2026 06:09:14 -0700 (PDT) X-Gm-Message-State: AFuF++m1V+ndN+UvPTliQe5W4Zj2EGvdGUu+zCqFfb+c5X/rm04hJOQC tvGYNswdAH/6QUBeI84EBcl7HJ0ZYhxbD8fu8TBIrMom9j8vm18QJYfWD0D3e5F6GuUESqHcebC A15dFI8ROxezX0yin+8AeBKT5usf/ihpTdFIjF4bZgOBpxUHNJ6fMCg== X-Gm-Gg: AR+sD12s7MrSAjp+RBUg7oQkwk7DitrSZsuyPyiK3sUvur72DBcqva8eXmYMI/R9guh d9/spXdmHFiuoLNjiznjVUeFV0DGHi6NUH2pZltsOE00mNI6HM3V4ptKgmJZwQbqfOfN57guIgI d16UbS0Icyo+N+Dme1If5bQNHwrJEh1m8UdeIzmBVYZ7/SupmDpizUYOx21fo/kOozOGDzJiQmO 8RkOnsfylQV+mc76KDtrLTz7J6fFKKASYDbG79NK7Fy6cKz823YAueOTC74m98IHUOCqVdHRQa+ 0g0WYMPwS1Gjzfu7mhkOpaTgbgwsV3BKJ9R9/8kBnu2lEsPIjC3EgTR3bFKuyF8oQID79+vGdsY 9mwBsdLRHdKq+SlZQ X-Received: by 2002:a05:6402:52cb:b0:69a:b38d:403c with SMTP id 4fb4d7f45d1cf-6a5df5fd2ebmr8987274a12.7.1787749753671; Wed, 26 Aug 2026 06:09:13 -0700 (PDT) X-Received: by 2002:a05:6402:52cb:b0:69a:b38d:403c with SMTP id 4fb4d7f45d1cf-6a5df5fd2ebmr8987174a12.7.1787749753082; Wed, 26 Aug 2026 06:09:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1787749753; cv=none; d=google.com; s=arc-20260327; b=KX2oMPIWh6gpDjySOwgUOm81m1gkzTW47YUc3Bu6NMTEeb43aydN3mhwtb0XoEH1R3 vM2VGV8Jd3oJPGmsivD5nrcmDFuPSy8Bjsv9E4JWMz6iEtLxl3U+ZSCKZwrhLTTaX4cA g7b6091kGw05yWXNxZGOnFQAIC3O9s36h8LAxFb4upObf8PZkdltXUyEYx+rpcZ8SPXZ kg/bMp4L7W/3NTVOtiI5fODlRV1AuseW50+pr7/sgRjeLs5l8K+8rnmwS7m5a8JQZSyN iuafgNBn+SFDUONzV6xZV+69nshvGpBlOwKtoPPZAEXIL5G8KAYoSIb0nbqFOaU13zJZ 4JAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=subject:in-reply-to:cc:to:from:message-id:date:dkim-signature; bh=D9Ldlo4RSjC1JnjL4Ia6iVDGir6i3t6AmgjNXYP9GLM=; fh=UoUx/ScICNSLS7LR9gyUDsZM8Zuq0DvPxxrx16Z82mE=; b=CoirajpCZP5AJshyHSV/to1f3Kb26NJTq7svXFNz7nFeWXpofWPhZQII92N5drnmOa YX9i4/Ym0nFbeMLUTvOMVgLvW06619Y21RkUWu+QUJG0eUyvtIn4/GnFROZhTZ/TzxFc NHkQ38CLYpDJjePOkh9wpIiitAFXs1QpOwuTer3WVPy+WIx5fz5woN0NpQsNgl64ZY+I 3eDXB17IbBogkbyU99khOsQADkzY0T0Lw1rL7Ai5ObT3DvJ1AmtfiBZphSYrC6UxBE/Z Qpzhs6t1UMLHVz3Xyrh9mld3A5Mwisf7qr+vV+HNeY7gtZOGeJF6KXhhkFDN2Mall0U4 bueg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=OzFfxF52; spf=pass (google.com: domain of khorenko@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=khorenko@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from relay.virtuozzo.com (relay.virtuozzo.com. [130.117.225.111]) by mx.google.com with ESMTPS id 4fb4d7f45d1cf-6a5deac57f3si4953432a12.224.2026.08.26.06.09.12 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Aug 2026 06:09:13 -0700 (PDT) Received-SPF: pass (google.com: domain of khorenko@virtuozzo.com designates 130.117.225.111 as permitted sender) client-ip=130.117.225.111; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=OzFfxF52; spf=pass (google.com: domain of khorenko@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=khorenko@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=Subject:From:Message-Id:Date:Content-Type: MIME-Version; bh=D9Ldlo4RSjC1JnjL4Ia6iVDGir6i3t6AmgjNXYP9GLM=; b=OzFfxF52zPow 3BYnL6jIoXzGIQZQ90peOHImjMgd1lvpMY11Di4CFx4oe7C6jlss+WXNvIvwd6tdPJNTtCAWuTv0E G6I9j+IiHR8WFvZkU6zdcKnrYc8+FjwSKPHzuXklyZ3KpyvLhNPbqiyJciYTTsZ9PmnUuW6Mu8BZj QC8sW5wrPfYOD0w9B1ZsbArljMUqP4BGHlPbalaAlJNQ+5wZItwinjwtAaijnQtKpg7G1flrFiVVr tj9tcD2zYmWJKuAozIx+tlmzk+iSWiy1Fc2dbqNlqnRo/zY5v/4R5D6G+baPRA+2Z/aWPEOoctS6i BaIh1LnmqVC8pSVTLMfK5A==; Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=f0.sw.ru) by relay.virtuozzo.com with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wzDLC-001rmT-0K; Wed, 26 Aug 2026 15:09:11 +0200 Received: from f0.sw.ru (localhost [127.0.0.1]) by f0.sw.ru (8.18.1/8.18.1/Debian-2) with ESMTP id 67QD9BVx890812; Wed, 26 Aug 2026 15:09:12 +0200 Received: (from kostja@localhost) by f0.sw.ru (8.18.1/8.18.1/Submit) id 67QD9Bah890811; Wed, 26 Aug 2026 15:09:11 +0200 Date: Wed, 26 Aug 2026 15:09:11 +0200 Message-Id: <202608261309.67QD9Bah890811@f0.sw.ru> X-Authentication-Warning: f0.sw.ru: kostja set sender to khorenko@virtuozzo.com using -f From: Konstantin Khorenko To: Vasileios Almpanis In-Reply-to: <20260825-connectors-v3-1-7b26773876a0@virtuozzo.com> X-OZ-Fwd: true Cc: OpenVZ devel Subject: Re: [Devel] [PATCH RHEL10 COMMIT] connector: annotate ve->cn with __rcu X-BeenThere: devel@openvz.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: OpenVZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org The commit is pushed to "branch-rh10-6.12.0-211.39.1.16.x.vz10-ovz" and will appear at git@bitbucket.org:openvz/vzkernel.git after rh10-6.12.0-211.39.1.16.10.vz10 ------> commit 644625e415b34c9e1be8adeadf4e17f72f586ee1 Author: Vasileios Almpanis Date: Tue Aug 25 16:19:51 2026 +0000 connector: annotate ve->cn with __rcu The following patches will clear ve->cn on container stop and free the per-VE connector state only after an RCU grace period, so that the proc event delivery path can use it under rcu_read_lock() even when the reported task no longer pins the VE. Prepare for that: annotate ve->cn with __rcu and switch all accesses to the RCU accessors so sparse can verify the protocol. All current users run either in the context of a task alive in the VE or from the VE start/stop hooks under ve->op_sem (or on ve0), so plain readers use rcu_dereference_check(ve->cn, 1) with a comment and the start/stop hooks use rcu_dereference_protected() with the proper lockdep condition. No functional change intended https://virtuozzo.atlassian.net/browse/VSTOR-140421 Feature: ve: ve generic structures Signed-off-by: Vasileios Almpanis Reviewed-by: Konstantin Khorenko --- drivers/connector/cn_proc.c | 48 +++++++++++++++++++++++++++++++------------ drivers/connector/connector.c | 43 +++++++++++++++++++++++++------------- include/linux/ve.h | 2 +- 3 files changed, 65 insertions(+), 28 deletions(-) diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index d41c8aca1866b..d4ce1697dd0bb 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c @@ -84,6 +84,8 @@ static int cn_filter(struct sock *dsk, struct sk_buff *skb, void *data) static inline void send_msg_ve(struct ve_struct *ve, struct cn_msg *msg) { + /* See the comment in proc_event_num_listeners() */ + struct cn_private *cn = rcu_dereference_check(ve->cn, 1); struct local_event *le_ptr; __u32 filter_data[2]; @@ -93,9 +95,9 @@ static inline void send_msg_ve(struct ve_struct *ve, struct cn_msg *msg) * so be of the safe side. */ BUILD_BUG_ON(offsetof(struct local_event, lock) != 0); - local_lock(&ve->cn->local_event->lock); + local_lock(&cn->local_event->lock); - le_ptr = this_cpu_ptr(ve->cn->local_event); + le_ptr = this_cpu_ptr(cn->local_event); msg->seq = le_ptr->count++; ((struct proc_event *)msg->data)->cpu = smp_processor_id(); @@ -116,7 +118,7 @@ static inline void send_msg_ve(struct ve_struct *ve, struct cn_msg *msg) cn_netlink_send_mult_ve(ve, msg, msg->len, 0, CN_IDX_PROC, GFP_NOWAIT, cn_filter, (void *)filter_data); - local_unlock(&ve->cn->local_event->lock); + local_unlock(&cn->local_event->lock); } static struct cn_msg *cn_msg_fill(__u8 *buffer, struct ve_struct *ve, @@ -147,8 +149,15 @@ static struct cn_msg *cn_msg_fill(__u8 *buffer, struct ve_struct *ve, static int proc_event_num_listeners(struct ve_struct *ve) { - if (ve->cn) - return atomic_read(&ve->cn->proc_event_num_listeners); + /* + * Callers not under rcu_read_lock() are pinned by a live task + * of this VE (or run on ve0 whose connector state lives as long + * as the connector itself). + */ + struct cn_private *cn = rcu_dereference_check(ve->cn, 1); + + if (cn) + return atomic_read(&cn->proc_event_num_listeners); return 0; } @@ -414,6 +423,8 @@ static void cn_proc_mcast_ctl(struct cn_msg *msg, enum proc_cn_event ev_type = 0; int err = 0, initial = 0; struct sock *sk = NULL; + /* current is a live task of this VE, it cannot be stopped under us */ + struct cn_private *cn = rcu_dereference_check(ve->cn, 1); /* * Events are reported with respect to the initial pid @@ -467,11 +478,11 @@ static void cn_proc_mcast_ctl(struct cn_msg *msg, switch (mc_op) { case PROC_CN_MCAST_LISTEN: if (initial || (prev_mc_op != PROC_CN_MCAST_LISTEN)) - atomic_inc(&ve->cn->proc_event_num_listeners); + atomic_inc(&cn->proc_event_num_listeners); break; case PROC_CN_MCAST_IGNORE: if (!initial && (prev_mc_op != PROC_CN_MCAST_IGNORE)) - atomic_dec(&ve->cn->proc_event_num_listeners); + atomic_dec(&cn->proc_event_num_listeners); ((struct proc_input *)(sk->sk_user_data))->event_type = PROC_EVENT_NONE; break; @@ -488,13 +499,18 @@ int cn_proc_init_ve(struct ve_struct *ve) { int err, cpu; struct local_event *le_ptr; + struct cn_private *cn; - ve->cn->local_event = alloc_percpu(struct local_event); - if (!ve->cn->local_event) + cn = rcu_dereference_protected(ve->cn, + lockdep_is_held(&ve->op_sem) || + ve_is_super(ve)); + + cn->local_event = alloc_percpu(struct local_event); + if (!cn->local_event) return -ENOMEM; for_each_possible_cpu(cpu) { - le_ptr = per_cpu_ptr(ve->cn->local_event, cpu); + le_ptr = per_cpu_ptr(cn->local_event, cpu); local_lock_init(&le_ptr->lock); } @@ -503,15 +519,21 @@ int cn_proc_init_ve(struct ve_struct *ve) &cn_proc_mcast_ctl); if (err) { pr_warn("VE#%d: cn_proc failed to register\n", ve->veid); - free_percpu(ve->cn->local_event); + free_percpu(cn->local_event); return err; } - atomic_set(&ve->cn->proc_event_num_listeners, 0); + atomic_set(&cn->proc_event_num_listeners, 0); return 0; } void cn_proc_fini_ve(struct ve_struct *ve) { + struct cn_private *cn; + + cn = rcu_dereference_protected(ve->cn, + lockdep_is_held(&ve->op_sem) || + ve_is_super(ve)); + cn_del_callback_ve(ve, &cn_proc_event_id); - free_percpu(ve->cn->local_event); + free_percpu(cn->local_event); } diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 39a697803d0f1..bf4a83f3f8703 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -29,7 +29,13 @@ MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_CONNECTOR); static struct cn_dev *get_cdev(struct ve_struct *ve) { - return &ve->cn->cdev; + /* + * Callers not under rcu_read_lock() are pinned by a live task + * of this VE or run from the VE start/stop hooks. + */ + struct cn_private *cn = rcu_dereference_check(ve->cn, 1); + + return cn ? &cn->cdev : NULL; } /* @@ -230,12 +236,13 @@ int cn_add_callback_ve(struct ve_struct *ve, void (*callback)(struct cn_msg *, struct netlink_skb_parms *)) { - struct cn_dev *dev = get_cdev(ve); + /* See the comment in get_cdev() */ + struct cn_private *cn = rcu_dereference_check(ve->cn, 1); - if (!ve->cn->cn_already_initialized) + if (!cn || !cn->cn_already_initialized) return -EAGAIN; - return cn_queue_add_callback(dev->cbdev, name, id, callback); + return cn_queue_add_callback(cn->cdev.cbdev, name, id, callback); } /* @@ -297,6 +304,7 @@ static int __maybe_unused cn_proc_show(struct seq_file *m, void *v) static int cn_init_ve(void *data) { struct ve_struct *ve = data; + struct cn_private *cn; struct cn_dev *dev; struct netlink_kernel_cfg cfg = { .groups = CN_NETLINK_USERS + 0xf, @@ -308,11 +316,12 @@ static int cn_init_ve(void *data) struct net *net; int err; - ve->cn = kzalloc(sizeof(*ve->cn), GFP_KERNEL); - if (!ve->cn) + cn = kzalloc(sizeof(*cn), GFP_KERNEL); + if (!cn) return -ENOMEM; + rcu_assign_pointer(ve->cn, cn); - dev = &ve->cn->cdev; + dev = &cn->cdev; /* * This is a hook, hooks are called under a single lock, so ve_nsproxy will @@ -331,7 +340,7 @@ static int cn_init_ve(void *data) goto netlink_release; } - ve->cn->cn_already_initialized = 1; + cn->cn_already_initialized = 1; if (!proc_ve_create_single("connector", S_IRUGO, net->proc_net, cn_proc_show)) { @@ -353,18 +362,24 @@ static int cn_init_ve(void *data) netlink_release: netlink_kernel_release(dev->nls); free_cn: - kfree(ve->cn); - ve->cn = NULL; + RCU_INIT_POINTER(ve->cn, NULL); + kfree(cn); goto net_unlock; } static void cn_fini_ve(void *data) { struct ve_struct *ve = data; - struct cn_dev *dev = get_cdev(ve); + struct cn_private *cn; + struct cn_dev *dev; struct net *net; - ve->cn->cn_already_initialized = 0; + cn = rcu_dereference_protected(ve->cn, + lockdep_is_held(&ve->op_sem) || + ve_is_super(ve)); + dev = &cn->cdev; + + cn->cn_already_initialized = 0; cn_proc_fini_ve(ve); @@ -379,8 +394,8 @@ static void cn_fini_ve(void *data) cn_queue_free_dev(dev->cbdev); netlink_kernel_release(dev->nls); - kfree(ve->cn); - ve->cn = NULL; + RCU_INIT_POINTER(ve->cn, NULL); + kfree(cn); } #ifdef CONFIG_VE diff --git a/include/linux/ve.h b/include/linux/ve.h index 46e67d00cf783..2dc93e42784b2 100644 --- a/include/linux/ve.h +++ b/include/linux/ve.h @@ -102,7 +102,7 @@ struct ve_struct { char core_pattern[CORENAME_MAX_SIZE]; #endif #ifdef CONFIG_CONNECTOR - struct cn_private *cn; + struct cn_private __rcu *cn; #endif struct kthread_worker *kthreadd_worker; _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel