Received: by 2002:ac8:1205:0:b0:427:447f:218 with SMTP id x5csp4787832qti; Tue, 16 Jan 2024 12:48:32 -0800 (PST) X-Google-Smtp-Source: AGHT+IHBcANMIxzLymzQx5kXjdrBkXj9abwotbveFyRXvf9znumv+Zr3Pgz0JUsEnry3xuH6ZBTR X-Received: by 2002:a05:6a20:9597:b0:19a:fbe9:bcd with SMTP id iu23-20020a056a20959700b0019afbe90bcdmr4574369pzb.50.1705438112302; Tue, 16 Jan 2024 12:48:32 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705438112; cv=pass; d=google.com; s=arc-20160816; b=WAi9rtN64UR+8dSYSyAcZchlt/R8OnpKbNvbK/VNP5o0kYwivHo5XWdj3NeT47DsQJ yHMpSZpTWpRr5193WnPAIq+sNo1DiRffn4rKfTgNcyISXkxjXlOeeleYqhV01m6g/4Q9 GDepNnsdBcnlmQUUT9GsqMEXit7kydRC8MIZH7V6rL9sECu4rsa5NJOlLdiDxrsCTW0T KsXzjWY52mMKk9XLHgtqVwZdLp/gcZch2BqbstKz4aQ0GMGdcfHLK5j9NWPPC0Lxkr1l JwdQfEN3wBT8eaBPI2Y11FCBv9QH2xBqafs56OGKXlkcDkl5O1HKdtsOWYU5zoVJqpNW U/JQ== 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:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=IyvdNeuyqJkbm4K0AZIRocUyPQUwmTzjVswlhIty/pg=; fh=t9C8SyKTrM+i0OCrW3ZViOupZGC3V28uX53am9xua+g=; b=KQYnsiGB+SkfMawigPm/BXmcrq2/28g1gQ38LnYPaSGKk7PL4FSbJX05yNZ6mwIJXX fVjvJaH2zCisjA/Urqjjbn4dEWHND2UBcyO+yMgDXbVVxfyI5q7p4kcIqbYLqZyEsCZs Ffo44dgX5QvuVviNE8hytYRReMJnvnb2aYOdsUOA6Uzlei36W8ZxhaM52wOCfYWjuGN9 qXdc8Ffd/ADGM0qJxltufmVDCssc47ksFw0Lu5B8+hu7wV2rXhIGdedADCg5L0nP7ucU +gW8c5SOym2IubDzyoOUtwOC5UB4NzXJyYaRWQMn7KlUpPwHRB8lmmoeSCg38FPDNo5n /VSw== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="l/kms+1M"; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-27946-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-27946-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id im24-20020a056a008d9800b006d98b960149si11509pfb.347.2024.01.16.12.48.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jan 2024 12:48:32 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-27946-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="l/kms+1M"; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-27946-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-27946-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org 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 sy.mirrors.kernel.org (Postfix) with ESMTPS id EB936B2363C for ; Tue, 16 Jan 2024 20:39:36 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C3FC957488; Tue, 16 Jan 2024 19:50:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="l/kms+1M" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 DDE5B12DDB5; Tue, 16 Jan 2024 19:50:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705434637; cv=none; b=LnDmwf3XxjUHMnZzrVBSSdnfyY2UGDrwJqDzqrcygPEoIHMAhv7hqnEFMtzfGXsPwjXt8KDvZv19S4Y46iSrY65UBJH09aeShN2CReHYqvX0snYmaV2t3L9/im426WsEPVu/O8gaMNDn0ddloXiV0e58uV3UGi7Xxz4ZQH86Sfw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705434637; c=relaxed/simple; bh=thKbSs7bIhCPeSCjPC5NF+QQPkaZi3BsyTdozx/8mX4=; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID: X-Mailer:In-Reply-To:References:MIME-Version:X-stable: X-Patchwork-Hint:X-stable-base:Content-Transfer-Encoding; b=DPL22kLFHpmmmN2auPDoa4HJ+4FVY6Xnow/zJ7/eUvqKD+yRDvw2C4aFn3aAfZ7/oWdyg7bxpyT9L1WMQxdn7Hb0SthNxNgxVjL31Hl1VT8djFt7Jfx8yr9r4jY2U/LuBF1wIcsFCUNfL1Vc9TWDUgYlYW7p8z4n/8ZathOE/80= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l/kms+1M; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id C0B1BC433F1; Tue, 16 Jan 2024 19:50:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705434636; bh=thKbSs7bIhCPeSCjPC5NF+QQPkaZi3BsyTdozx/8mX4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l/kms+1Mq7BlP2LNQ6TqXEQFaY99ptjAwdkwEt4qBxNV0JBh820lK3Jw/EggbVHV9 a8gl0XiheaYxKgfwZaewuOvCVEgxYbIRYXVb8015ejKeECb1ScrzRtM9KiUGPun8rp jsqpjjjW5PxQs9TE1eMFXlZ7ATa77cTIGC/OoogGmv+z4kaGa/LBXoX81wbBhWypAP I9b8+6QWRbhnJWBCWKNflmqgIyyykPj6khTr9xRR5Y4GYjRJdl33mBYrTY3TJ5kt83 1mc9B7DkbEI72dkKk0vP6mdx6OIRHX7vMcgIfBG2fp+JjiHEdi+YEkuaLEdqwYAZGp RHGp1bUfpgOIQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Hou Tao , Alexei Starovoitov , Sasha Levin , daniel@iogearbox.net, andrii@kernel.org, bpf@vger.kernel.org Subject: [PATCH AUTOSEL 6.6 038/104] bpf: Set need_defer as false when clearing fd array during map free Date: Tue, 16 Jan 2024 14:46:04 -0500 Message-ID: <20240116194908.253437-38-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240116194908.253437-1-sashal@kernel.org> References: <20240116194908.253437-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.6.12 Content-Transfer-Encoding: 8bit From: Hou Tao [ Upstream commit 79d93b3c6ffd79abcd8e43345980aa1e904879c4 ] Both map deletion operation, map release and map free operation use fd_array_map_delete_elem() to remove the element from fd array and need_defer is always true in fd_array_map_delete_elem(). For the map deletion operation and map release operation, need_defer=true is necessary, because the bpf program, which accesses the element in fd array, may still alive. However for map free operation, it is certain that the bpf program which owns the fd array has already been exited, so setting need_defer as false is appropriate for map free operation. So fix it by adding need_defer parameter to bpf_fd_array_map_clear() and adding a new helper __fd_array_map_delete_elem() to handle the map deletion, map release and map free operations correspondingly. Signed-off-by: Hou Tao Link: https://lore.kernel.org/r/20231204140425.1480317-4-houtao@huaweicloud.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/arraymap.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c index 9bfad7e96913..c9843dde6908 100644 --- a/kernel/bpf/arraymap.c +++ b/kernel/bpf/arraymap.c @@ -871,7 +871,7 @@ int bpf_fd_array_map_update_elem(struct bpf_map *map, struct file *map_file, return 0; } -static long fd_array_map_delete_elem(struct bpf_map *map, void *key) +static long __fd_array_map_delete_elem(struct bpf_map *map, void *key, bool need_defer) { struct bpf_array *array = container_of(map, struct bpf_array, map); void *old_ptr; @@ -890,13 +890,18 @@ static long fd_array_map_delete_elem(struct bpf_map *map, void *key) } if (old_ptr) { - map->ops->map_fd_put_ptr(map, old_ptr, true); + map->ops->map_fd_put_ptr(map, old_ptr, need_defer); return 0; } else { return -ENOENT; } } +static long fd_array_map_delete_elem(struct bpf_map *map, void *key) +{ + return __fd_array_map_delete_elem(map, key, true); +} + static void *prog_fd_array_get_ptr(struct bpf_map *map, struct file *map_file, int fd) { @@ -925,13 +930,13 @@ static u32 prog_fd_array_sys_lookup_elem(void *ptr) } /* decrement refcnt of all bpf_progs that are stored in this map */ -static void bpf_fd_array_map_clear(struct bpf_map *map) +static void bpf_fd_array_map_clear(struct bpf_map *map, bool need_defer) { struct bpf_array *array = container_of(map, struct bpf_array, map); int i; for (i = 0; i < array->map.max_entries; i++) - fd_array_map_delete_elem(map, &i); + __fd_array_map_delete_elem(map, &i, need_defer); } static void prog_array_map_seq_show_elem(struct bpf_map *map, void *key, @@ -1072,7 +1077,7 @@ static void prog_array_map_clear_deferred(struct work_struct *work) { struct bpf_map *map = container_of(work, struct bpf_array_aux, work)->map; - bpf_fd_array_map_clear(map); + bpf_fd_array_map_clear(map, true); bpf_map_put(map); } @@ -1222,7 +1227,7 @@ static void perf_event_fd_array_release(struct bpf_map *map, for (i = 0; i < array->map.max_entries; i++) { ee = READ_ONCE(array->ptrs[i]); if (ee && ee->map_file == map_file) - fd_array_map_delete_elem(map, &i); + __fd_array_map_delete_elem(map, &i, true); } rcu_read_unlock(); } @@ -1230,7 +1235,7 @@ static void perf_event_fd_array_release(struct bpf_map *map, static void perf_event_fd_array_map_free(struct bpf_map *map) { if (map->map_flags & BPF_F_PRESERVE_ELEMS) - bpf_fd_array_map_clear(map); + bpf_fd_array_map_clear(map, false); fd_array_map_free(map); } @@ -1266,7 +1271,7 @@ static void cgroup_fd_array_put_ptr(struct bpf_map *map, void *ptr, bool need_de static void cgroup_fd_array_free(struct bpf_map *map) { - bpf_fd_array_map_clear(map); + bpf_fd_array_map_clear(map, false); fd_array_map_free(map); } @@ -1311,7 +1316,7 @@ static void array_of_map_free(struct bpf_map *map) * is protected by fdget/fdput. */ bpf_map_meta_free(map->inner_map_meta); - bpf_fd_array_map_clear(map); + bpf_fd_array_map_clear(map, false); fd_array_map_free(map); } -- 2.43.0