Received: by 2002:ab2:3350:0:b0:1f4:6588:b3a7 with SMTP id o16csp715524lqe; Sat, 6 Apr 2024 23:55:16 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXyYl4oQBsO4xA05c5SbzSQJ/7uwJiXwdKede5lMTMG+Tugs5jS1wlboC9QXHs9f693nLDgmQvVyj67pLPvz3dmi0Db/O2UWmNgHGQzuw== X-Google-Smtp-Source: AGHT+IFLo9S7QhVpBgq1/oVAuk+ZK6JdIyp4eHO9B+8V6j663S5kQnKimST81l2G7l7U22LuczBK X-Received: by 2002:a17:906:5610:b0:a4e:e47:9ee7 with SMTP id f16-20020a170906561000b00a4e0e479ee7mr4208402ejq.49.1712472916765; Sat, 06 Apr 2024 23:55:16 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712472916; cv=pass; d=google.com; s=arc-20160816; b=CRm4daUkcizEZfmp2LQYQCzCnbXxjeQWUqaQKXqeqFR6ocrx/s47amgkMkfwRLKzE6 rOIAZnzPQgOePYiUcYE9xNEaE0spz3VP3iQWCiElFmo4CqR37MlaPJXZ8PrCYpc+17FR yu4Xg+OWcfU5G9RgWkaVfs81tX2I5Ueqz9MB9YvwEIGoNtBhleqKWpqpZ1ZsENvp2VLg LTwehc4bZITp2lodlhaTqU7q1nDVtGNqGKMVZ2C+3hRQ3oIc94gPZxtRV4vFfDwLybMH pB18oLBP8ppevQOfZhDLFlInpEYDnzRdmrPCPQKxx+hJZ2cpZ8oiq0bzLcs16Q/bIKzG ldow== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=hGkWrkSwuB6XImaQOxuRnDWiN8Nv8s3YVG791x/y61E=; fh=aI5P48IjWGIFc8vXaVTMkUj3nbpRgEpZP3CJGSlsZQU=; b=vzpqfM2DceA7iO7ZxSrm1z9jyNe/Nxcgluik913NEs/zIiBapSOU6smlHkjWLn4Hhg eiSCddrFKKCGspglPrCRFmy4kYF6ff+DZZVffmF01/tV81tshbxt3hr/kmv3SL5VAchQ Gh2aMNt3uf4Q9bRg3BsbI8X8oggQECZPdoBD2/zY/AXOcZWkzZksuhTCiuwpyIuk9QsA ayEvKDMWQ15k/WpsV0PIenre9iEJt3edok3FLKw4HR8EnPdMGflOqHL7jlmcBjaPGzUK XPFGpKlKLWuNgJMLrzH8HaQWscn9G7wH4FeCXd1GnmFJQuSCnM0wgUTlRX2sSPeMHNVp FYmg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Q0AFAdzQ; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-134207-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-134207-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id e21-20020a170906081500b00a51c5475045si769486ejd.889.2024.04.06.23.55.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Apr 2024 23:55:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-134207-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Q0AFAdzQ; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-134207-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-134207-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 7EF7C1F22EB6 for ; Sun, 7 Apr 2024 06:55:16 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0A4BF8F72; Sun, 7 Apr 2024 06:55:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Q0AFAdzQ" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 214111DFC4 for ; Sun, 7 Apr 2024 06:55:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.15 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712472908; cv=none; b=DaWT675Rrfv0LY+ZeCyc8SQsBNoTwIt536Ucds5RrZWG2f79BnrlePVHbvVb0dGQrZOsk83DpiESkn9uB2EAQzG/8CqLRI/zSMaqlEJ85HGNazEsr1Q0h7ow7LQ9b5FmWNARSCP/EGGvoywLwo1UynEJOlE4yrUMwI0m9sj5a24= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712472908; c=relaxed/simple; bh=iCd4mqulyCBb7Qt4H3d7QCvUjxPxbKW3n2d2uZXJx4M=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=KuBkKRbeqwc3aZd59OOcZsFiiblEwha5AjvOR+tL6K1PJEqL1pMXsiQCZYot00WwJN6589GFgAlC+H/eUnkAJb/25yGXJ+xHNRERyV2W0MBy0PY3zpWZOVaWOHPHnYTNJyw+iCmBzH0PHUResEOfUhcCJeKN1xklWQjvGo+M828= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Q0AFAdzQ; arc=none smtp.client-ip=198.175.65.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1712472907; x=1744008907; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=iCd4mqulyCBb7Qt4H3d7QCvUjxPxbKW3n2d2uZXJx4M=; b=Q0AFAdzQUAvyBzcGz5zV8zYtfmvFsgOc/12zDoLRs07NrvZ87J4toKla Eh+bwrZc/pI7Pd7pX0ZopSA5EToS+A0LUp+jML5IqG6Y7yKPfKT8OsVRL yMzZvGzysgnN9l7t98VXCsa8cHQF6SKdDO2yn1GQ0HnLTPH8m/e16p0CE 2SdZdImIlCUzCyBm/CD33GDm3An2by7uBLkm3gxq7TKkxTpfs2HX6v3tS e/VZdxB9WG3IazrcGpFgrIehdi3t19pL8YBS3PgIp5+q3ZNDrFvvN8eb/ SWHfegyPCdcGtkMXW8LIgqYLyS3FTsVLi0wXivboMlg5b97QAsFWes5ZR g==; X-CSE-ConnectionGUID: OMOoyVPMRwK7zXjFAgCRPA== X-CSE-MsgGUID: rmJ4PieIQjKSXi2Whq8eMw== X-IronPort-AV: E=McAfee;i="6600,9927,11036"; a="11553347" X-IronPort-AV: E=Sophos;i="6.07,184,1708416000"; d="scan'208";a="11553347" Received: from orviesa003.jf.intel.com ([10.64.159.143]) by orvoesa107.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2024 23:55:06 -0700 X-CSE-ConnectionGUID: p7xOMK39Rwu9L0HLtgKMNw== X-CSE-MsgGUID: vXEl9dyTRHuimbx6P1capg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,184,1708416000"; d="scan'208";a="24243470" Received: from yangdaiy-mobl.ccr.corp.intel.com (HELO yhuang6-mobl2.ccr.corp.intel.com) ([10.255.29.196]) by ORVIESA003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2024 23:55:03 -0700 From: Huang Ying To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Huang Ying , Ryan Roberts , David Hildenbrand , Miaohe Lin , Hugh Dickins , Minchan Kim Subject: [PATCH] mm,swap: add document about RCU read lock and swapoff interaction Date: Sun, 7 Apr 2024 14:54:50 +0800 Message-Id: <20240407065450.498821-1-ying.huang@intel.com> X-Mailer: git-send-email 2.39.2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit During reviewing a patch to fix the race condition between free_swap_and_cache() and swapoff() [1], it was found that the document about how to prevent racing with swapoff isn't clear enough. Especially RCU read lock can prevent swapoff from freeing data structures. So, the document is added as comments. [1] https://lore.kernel.org/linux-mm/c8fe62d0-78b8-527a-5bef-ee663ccdc37a@huawei.com/ Signed-off-by: "Huang, Ying" Cc: Ryan Roberts Cc: David Hildenbrand Cc: Miaohe Lin Cc: Hugh Dickins Cc: Minchan Kim --- mm/swapfile.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mm/swapfile.c b/mm/swapfile.c index 4919423cce76..6925462406fa 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1226,16 +1226,15 @@ static unsigned char __swap_entry_free_locked(struct swap_info_struct *p, /* * When we get a swap entry, if there aren't some other ways to - * prevent swapoff, such as the folio in swap cache is locked, page - * table lock is held, etc., the swap entry may become invalid because - * of swapoff. Then, we need to enclose all swap related functions - * with get_swap_device() and put_swap_device(), unless the swap - * functions call get/put_swap_device() by themselves. + * prevent swapoff, such as the folio in swap cache is locked, RCU + * reader side is locked, etc., the swap entry may become invalid + * because of swapoff. Then, we need to enclose all swap related + * functions with get_swap_device() and put_swap_device(), unless the + * swap functions call get/put_swap_device() by themselves. * - * Note that when only holding the PTL, swapoff might succeed immediately - * after freeing a swap entry. Therefore, immediately after - * __swap_entry_free(), the swap info might become stale and should not - * be touched without a prior get_swap_device(). + * RCU reader side lock (including any spinlock) is sufficient to + * prevent swapoff, because synchronize_rcu() is called in swapoff() + * before freeing data structures. * * Check whether swap entry is valid in the swap device. If so, * return pointer to swap_info_struct, and keep the swap entry valid @@ -2495,10 +2494,11 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) /* * Wait for swap operations protected by get/put_swap_device() - * to complete. - * - * We need synchronize_rcu() here to protect the accessing to - * the swap cache data structure. + * to complete. Because of synchronize_rcu() here, all swap + * operations protected by RCU reader side lock (including any + * spinlock) will be waited too. This makes it easy to + * prevent folio_test_swapcache() and the following swap cache + * operations from racing with swapoff. */ percpu_ref_kill(&p->users); synchronize_rcu(); -- 2.39.2