From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E2B07C25B7C for ; Tue, 28 May 2024 13:21:10 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 77C0C6B008C; Tue, 28 May 2024 09:21:10 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 72B066B0092; Tue, 28 May 2024 09:21:10 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5CB226B0095; Tue, 28 May 2024 09:21:10 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 4144D6B008C for ; Tue, 28 May 2024 09:21:10 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id DA83C1C112E for ; Tue, 28 May 2024 13:21:09 +0000 (UTC) X-FDA: 82167865458.29.4F4AD83 Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com [209.85.208.179]) by imf17.hostedemail.com (Postfix) with ESMTP id C12DF40007 for ; Tue, 28 May 2024 13:21:07 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=mZnMESpL; spf=pass (imf17.hostedemail.com: domain of urezki@gmail.com designates 209.85.208.179 as permitted sender) smtp.mailfrom=urezki@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1716902467; a=rsa-sha256; cv=none; b=FsF2crVaV5yUTiQsNt5gPRegXE7+dQ5jDr9lOlrVkEPFOYjNe1TqVVM2pTDRsAu0JKIf4U nSzDbWWOTcUtMoiWiDFu221bIebv0Ej1mqsaaL+YL08MkVs7HH67dxxlrU/vjzbzIiBrdW 6oPq0kEzNz53LgEwMLSuDy3+3Rs22MI= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=mZnMESpL; spf=pass (imf17.hostedemail.com: domain of urezki@gmail.com designates 209.85.208.179 as permitted sender) smtp.mailfrom=urezki@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1716902467; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=PXVQeHY6tAgT2cR7UV7fRM7xYi2AxOuPJoQ0kCYU9tM=; b=IVIDTibPVRqXM6150Q1o9AdsZJfllokeJg+SA4Xfu35dnjC/fN+9RDElOsr0+hSYv6iNVM liqPKMMuuzLGkNVwcooTYrOxc0Be9G1ua1sRcNveUYJTkWcuxNhxrZ83dd8xGP2sGSTvhA 1hSP8y92kBY+vxXRDtMz7HpYDlc6+Ho= Received: by mail-lj1-f179.google.com with SMTP id 38308e7fff4ca-2e73359b900so8505851fa.2 for ; Tue, 28 May 2024 06:21:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1716902466; x=1717507266; darn=kvack.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:date:from:from:to:cc:subject:date:message-id:reply-to; bh=PXVQeHY6tAgT2cR7UV7fRM7xYi2AxOuPJoQ0kCYU9tM=; b=mZnMESpL78BxWKXrXmjj/9HvEighWbcKZbkW1UbEuvi0jM29SQRYwYHpb0bRWJd00d khsvNRHMRzxBMFxQSNCRNQC+88Vexsej5eQUUvgefqWrHRyxzA/XtJbf3f7Qv+bKsQqa ljDnB7yTKYvx7B2IUVkgRVTsVeZaJelkRbUwch9wdBt1W9jFjbZcPNG2CNvE1TOr1BKP KFCgOX2UnjgnpXFNvW0RY13BbzWIZ1HZItS4AHATjouEMWBI31QP5wk9MK9ddq8ylJtK VubOKCZs/uk1MlEKWFeM6zEvOaqBENUZlfHnFgSQtp4j4bEsiA6w4Nq0/cQS5eA1ZDYC fGUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716902466; x=1717507266; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:date:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=PXVQeHY6tAgT2cR7UV7fRM7xYi2AxOuPJoQ0kCYU9tM=; b=aT5KGUYr948p67mjY4w8djcQo6nLCltOzrgc21PW3E5oUMp/IJStaW4hhQenxA7ucl gObYppkCBxouJGqDGE76Stel0I/BPmgn9TOgk0/DBivdbffcIYektlHbotabsHMutajf JDgRoSrOQIDQO8rJ72Q5S2Jj48aaRsx7u2qmm+jziH9DQ0ahK9sBytI82cHn6rchPC/H 5Dp5TiE7VpAtZWRMrMg8byxN7a0isb+sSuGTCL2YGHzTDN2/tIrey1BvrhRIeQck2EIz 3M2oMX+4GpCWBdg+AsciBGPjY6DgobfFJQ3t6B2m5DMaumeUDgOjrpPfkTENgevp2Nl6 nLrg== X-Forwarded-Encrypted: i=1; AJvYcCVQ3PPGSzeU89o+NJJCeT/EDtixXtJEQQ07YqwVpPeQSh0JzusU2F5BTE4WnOFyI5PPhwvaKMdwoAckPhcwfU9Drr8= X-Gm-Message-State: AOJu0YzR98/xjkr76id79kTfLc8PqM2SKxFqujjIFbapiOA0SL3l0AHi zgDhxeeCsKkBEIVePc4iBStAAanbDC35XwI+E0lUTsry4TcG/IXz X-Google-Smtp-Source: AGHT+IFm/iWYb0lm2G8Hh7/weYnf9OTvd9wXHxG3uAC/HX4CB+gAkndqgsdY/hkJSme+5B7olDLSuQ== X-Received: by 2002:a2e:a592:0:b0:2d4:54f2:c409 with SMTP id 38308e7fff4ca-2e95b282910mr92739591fa.38.1716902465603; Tue, 28 May 2024 06:21:05 -0700 (PDT) Received: from pc636 (host-95-193-70-101.mobileonline.telia.com. [95.193.70.101]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-2e95bcc4a7asm22749691fa.3.2024.05.28.06.21.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 May 2024 06:21:05 -0700 (PDT) From: Uladzislau Rezki X-Google-Original-From: Uladzislau Rezki Date: Tue, 28 May 2024 15:21:02 +0200 To: Julia Lawall Cc: Uladzislau Rezki , "Paul E. McKenney" , Vlastimil Babka , "linux-mm@kvack.org" , RCU , cocci@inria.fr Subject: Re: [cocci] patch idea: convert trivial call_rcu users to kfree_rcu Message-ID: References: <68b85796-c674-4691-936a-2051849f4692@suse.cz> <6b7e3ed9-d974-cb3b-6839-a6b7cf5f5a36@inria.fr> <2dd5bafb-ceb1-238d-2f51-83ebf135b73@inria.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2dd5bafb-ceb1-238d-2f51-83ebf135b73@inria.fr> X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: C12DF40007 X-Stat-Signature: adjzxqd8ujgxakzt8akwg3rpb8khebtg X-HE-Tag: 1716902467-760394 X-HE-Meta: U2FsdGVkX1/I52JOncJxNVNlLfQgXhjB9WoMdsbWz5S2bKxyy4lk0ZeUXhUbmXsknnYCBwtIt3BU9TKgVPuqae3HiDqglWM2eWKEnd/ySoyDvI1MYB0pL0biZEMw9NCHQUgccAAUiXfyXrVWOsGqKKA8UBgaClvmet9oqo1mUZM5MWJKHVaVaI1WSe3DnfXhSnN5EqSwWHNqmxyclmy7gF1ZdQP6gi2Z7Mq8IRKpPXmEGkCpid5KQCwNXlBp8kSFI0eGJTXqUyniHzf2DkFQIyEhJXXjPwovOupwqzpy67bSZp60soOsPXONvkwlbBBU2Qzy8mySYQ4FXnSLYsWj2YeZL4+sspU0nif4lYdiBe39Mr+judWJel+H5knDb+6zL9jxwfWJ0Y09UN9tZc3N2B9VQrKkf3N1wB33JkxNSgtESV7AAJstB6qqrYCrQm91k4uYYVi8fvqsUqepnDHJNBHNCunEFmIz9uJrLirQQvTZ4JiB11o8r28wCIVrpu9plA/8qy6K89pZdJ7YunB7HE+Tn2s3VbAGACNOdvgTIXLXvth27q/24ax8DdDvRkNrOG4oCaoH5yLLyt1kluNC+lwv4FP4S9hbORI0E4s4Li8AuBWB0LA2kJeJMOOpF7JTKCFkf+tibNmidp+zAFiWEXF7xnWz7/Ecjoo+Pf7j0uvXS/L9edHxJeGPx/PGEOzHiyzAsX4gdXj0cGx2jy4X3ehsfZXjMG6VxCZNvpjdCD5JnpD0fe6el0xMU7zrU0LpIPLKC/IP13Nlwo9CS8x5qysNluxN7uv4JWzdr4PASq4XWOhvx6m3piFlIcyeVeRFrbFhNhJM9LwQicRCXOpWVGzA1mHDLbz05M56CjSKBbwZglv17O+4kFbKrd2HHJyeA3rF7f6yK8Pv/5KVLuRVw8BHeFZpHVmr5iskxXaoQGf9W8tfWk7iM1rYJV1VCCs7lWeD8HUij5lcSv9N9lc vFePn+Rj 2BLCvQoDcEloEnueSLo/HstRqJLs+i+o1RU9iaI3IGvFjOeTp8hsQKusG3qkhdphK2zV3IfvZPXFVmjYmYLAEgLIiujS3HYjB1RbSSxXkVs6r/VfyriIIFOEDHvu3KoWIBmzKt0ar/ztfp/E7EyV03jtWlF1Op9qZnoKxBkH9mWO5D5YUaSNXJbStAbuQti7/3Y8NeWxPOpaxASlXY6WhuB3yp/ZN+oMoLfQsaV/I5FjED5SANWg9d61sMFIFUTktRLuW7zngT8lOTxruZKOAQCwZptNo2Kgfe85tgJDkHQzEdxWv1CIABUXrdoZjBU2eRQZJp2s4565eOPqIspwdKpBfb6jshZ8sfbfSY7NQiHtl8wPSfoU5hqoNiwjN7uoq4DihQbnTL/bvzI9bN0LM59zxU6ujQYPRahnbyrnngXm02UdGrgqTEmFFYPhyICO+d/rJSxu/XH3j1BNPoWWzW4GQpHF3g6TNDZsTntHLhXgaptb2GcDR6hruZ/npnWAkgIVDg1JbkUBAyz4= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Tue, May 28, 2024 at 02:08:20PM +0200, Julia Lawall wrote: > > > On Tue, 28 May 2024, Uladzislau Rezki wrote: > > > Hello. > > > > > > > > > > > On Mon, 27 May 2024, Paul E. McKenney wrote: > > > > > > > On Mon, May 27, 2024 at 10:13:40AM +0200, Julia Lawall wrote: > > > > > > > > > > > > > > > On Mon, 27 May 2024, Vlastimil Babka wrote: > > > > > > > > > > > Hi, > > > > > > > > > > > > one bit from LSF/MM discussions is that there might be call_rcu users with a > > > > > > callback that only does a kmem_cache_free() to a specific cache. Since SLOB > > > > > > was removed, it's always ok to use kfree() and thus also kfree_rcu() on > > > > > > allocations from kmem_cache_alloc() in addition to kmalloc(). Thus, such > > > > > > call_rcu() users might be simplified to kfree_rcu(). I found some cases > > > > > > semi-manually, but I'd expect coccinelle could help here so if anyone wants > > > > > > to take this task, feel free to. > > > > > > > > > > Thanks for the suggestion! I will try to look into it. > > > > > > > > Thank you both! > > > > > > I found the following functions. Do you want some other information, such > > > as where they are called from? > > > > > > Ignore the -s at the beginning of some lines. Those are for emphasis. not > > > to suggest to remove the code. > > > > > > I checked that the functions are only used in calls to call_rcu. > > > > > > Without more effort, Coccinelle only looks for functions defined in the > > > same file. Here are the functions that are passed to call_rcu where the > > > function is not defined in the same file: > > > > > > need definition for audit_free_rule_rcu > > > need definition for __i915_gem_free_object_rcu > > > need definition for io_eventfd_ops > > > need definition for ip_vs_dest_dst_rcu_free > > > need definition for __put_task_struct_rcu_cb > > > need definition for radix_tree_node_rcu_free > > > > > > They all do something more, although radix_tree_node_rcu_free doesn't do > > > much more (some memsets). > > > > > > julia > > > > > > diff -u -p /home/jll/linux/drivers/net/wireguard/allowedips.c /tmp/nothing/drivers/net/wireguard/allowedips.c > > > --- /home/jll/linux/drivers/net/wireguard/allowedips.c > > > +++ /tmp/nothing/drivers/net/wireguard/allowedips.c > > > @@ -50,7 +50,6 @@ static void push_rcu(struct allowedips_n > > > > > > static void node_free_rcu(struct rcu_head *rcu) > > > { > > > - kmem_cache_free(node_cache, container_of(rcu, struct allowedips_node, rcu)); > > > } > > > > > > static void root_free_rcu(struct rcu_head *rcu) > > > diff -u -p /home/jll/linux/fs/ecryptfs/dentry.c /tmp/nothing/fs/ecryptfs/dentry.c > > > --- /home/jll/linux/fs/ecryptfs/dentry.c > > > +++ /tmp/nothing/fs/ecryptfs/dentry.c > > > @@ -53,8 +53,6 @@ struct kmem_cache *ecryptfs_dentry_info_ > > > > > > static void ecryptfs_dentry_free_rcu(struct rcu_head *head) > > > { > > > - kmem_cache_free(ecryptfs_dentry_info_cache, > > > - container_of(head, struct ecryptfs_dentry_info, rcu)); > > > } > > > > > > /** > > > diff -u -p /home/jll/linux/kernel/fork.c /tmp/nothing/kernel/fork.c > > > --- /home/jll/linux/kernel/fork.c > > > +++ /tmp/nothing/kernel/fork.c > > > @@ -378,7 +378,6 @@ static struct kmem_cache *thread_stack_c > > > > > > static void thread_stack_free_rcu(struct rcu_head *rh) > > > { > > > - kmem_cache_free(thread_stack_cache, rh); > > > } > > > > > > static void thread_stack_delayed_free(struct task_struct *tsk) > > > diff -u -p /home/jll/linux/kernel/workqueue.c /tmp/nothing/kernel/workqueue.c > > > --- /home/jll/linux/kernel/workqueue.c > > > +++ /tmp/nothing/kernel/workqueue.c > > > @@ -5024,8 +5024,6 @@ fail: > > > > > > static void rcu_free_pwq(struct rcu_head *rcu) > > > { > > > - kmem_cache_free(pwq_cache, > > > - container_of(rcu, struct pool_workqueue, rcu)); > > > } > > > > > > /* > > > diff -u -p /home/jll/linux/net/ipv4/inetpeer.c /tmp/nothing/net/ipv4/inetpeer.c > > > --- /home/jll/linux/net/ipv4/inetpeer.c > > > +++ /tmp/nothing/net/ipv4/inetpeer.c > > > @@ -130,7 +130,6 @@ static struct inet_peer *lookup(const st > > > > > > static void inetpeer_free_rcu(struct rcu_head *head) > > > { > > > - kmem_cache_free(peer_cachep, container_of(head, struct inet_peer, rcu)); > > > } > > > > > > /* perform garbage collect on all items stacked during a lookup */ > > > diff -u -p /home/jll/linux/net/ipv6/xfrm6_tunnel.c /tmp/nothing/net/ipv6/xfrm6_tunnel.c > > > --- /home/jll/linux/net/ipv6/xfrm6_tunnel.c > > > +++ /tmp/nothing/net/ipv6/xfrm6_tunnel.c > > > @@ -180,8 +180,6 @@ EXPORT_SYMBOL(xfrm6_tunnel_alloc_spi); > > > > > > static void x6spi_destroy_rcu(struct rcu_head *head) > > > { > > > - kmem_cache_free(xfrm6_tunnel_spi_kmem, > > > - container_of(head, struct xfrm6_tunnel_spi, rcu_head)); > > > } > > > > > > static void xfrm6_tunnel_free_spi(struct net *net, xfrm_address_t *saddr) > > > diff -u -p /home/jll/linux/security/security.c /tmp/nothing/security/security.c > > > --- /home/jll/linux/security/security.c > > > +++ /tmp/nothing/security/security.c > > > @@ -1599,7 +1599,6 @@ static void inode_free_by_rcu(struct rcu > > > /* > > > * The rcu head is at the start of the inode blob > > > */ > > > - kmem_cache_free(lsm_inode_cache, head); > > > } > > > > > > /** > > > > > See below some extra functions which can be eliminated. How i found them: > > > > find ./ -name "*.c" -o -name "*.h" | xargs grep -rn call_rcu -B 10 | grep kmem_cache_free > > > > > > static void nfsd4_free_file_rcu(struct rcu_head *rcu); > > Thanks. I tried to find this kind of issue, but it turned up nothing. > There must be some mistake, and I will try again. > You are welcome. Also there are several places like below: static void blk_free_queue_rcu(struct rcu_head *rcu_head) { struct request_queue *q = container_of(rcu_head, struct request_queue, rcu_head); percpu_ref_exit(&q->q_usage_counter); kmem_cache_free(blk_requestq_cachep, q); } static void blk_free_queue(struct request_queue *q) { blk_free_queue_stats(q->stats); if (queue_is_mq(q)) blk_mq_release(q); ida_free(&blk_queue_ida, q->id); call_rcu(&q->rcu_head, blk_free_queue_rcu); } and potentially it can be also replaced: diff --git a/block/blk-core.c b/block/blk-core.c index 82c3ae22d76d..898d6990600d 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -257,15 +257,6 @@ void blk_clear_pm_only(struct request_queue *q) } EXPORT_SYMBOL_GPL(blk_clear_pm_only); -static void blk_free_queue_rcu(struct rcu_head *rcu_head) -{ - struct request_queue *q = container_of(rcu_head, - struct request_queue, rcu_head); - - percpu_ref_exit(&q->q_usage_counter); - kmem_cache_free(blk_requestq_cachep, q); -} - static void blk_free_queue(struct request_queue *q) { blk_free_queue_stats(q->stats); @@ -273,7 +264,8 @@ static void blk_free_queue(struct request_queue *q) blk_mq_release(q); ida_free(&blk_queue_ida, q->id); - call_rcu(&q->rcu_head, blk_free_queue_rcu); + percpu_ref_exit(&q->q_usage_counter); + kfree_rcu(q, rcu_head); } /** but a maintainer of "blk-core.c" should check it if a usage counter can be updated before a completion of GP. Probably we can skip as of now such cases, so i do not have a strong opinion here. -- Uladzislau Rezki