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 EF8B4CCA47A for ; Sun, 19 Jun 2022 15:51:00 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 890048D000D; Sun, 19 Jun 2022 11:51:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 77B408D0006; Sun, 19 Jun 2022 11:51:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 558098D000D; Sun, 19 Jun 2022 11:51:00 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 301438D0006 for ; Sun, 19 Jun 2022 11:51:00 -0400 (EDT) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 1402633808 for ; Sun, 19 Jun 2022 15:51:00 +0000 (UTC) X-FDA: 79595423880.23.A193C6C Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) by imf28.hostedemail.com (Postfix) with ESMTP id B1FCCC0002 for ; Sun, 19 Jun 2022 15:50:59 +0000 (UTC) Received: by mail-pj1-f52.google.com with SMTP id cv13so5477093pjb.4 for ; Sun, 19 Jun 2022 08:50:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wupU3s6HDHFwU6sdzvBeIV5oXRSNq7jyoLqRbCJxYac=; b=ouUobzlqmq8S/Azfyps3usSVZ5UvHYpdVP1vu+gtd0yfCYf+Bzj6oDe+t+ss7KLBSf 49dFjjsYRk7VFsjhV3FODdJpDko/alFqgElQMsTdQ7rE3prZj2MIR3wBldkL29tmg8hY WdHG53fBco4KiIraG/2iAZgtIVMOvMVToF33Rx2Q9+oc4GQX/3Q5aq8Wo8P4nysP+w5e 2eUFBCQxRzJk2HamKYvCj0plIjvc0hhDGIC8v68RlNWj6n0rlOJa48Ff1QOKAuzhCW93 gS4S70/+InEZ+SY8uBkQpCQ9xW4bcbu79d4WCk/f6OGain7VFBSaQrtbwWMxyWF6uwKH 17fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wupU3s6HDHFwU6sdzvBeIV5oXRSNq7jyoLqRbCJxYac=; b=wm/UCnPs3bjWQutYF5aVBR5WzglgEo9D/Wxk6ILlPpUEFkqzYmoQk4lyPgy88NoDVO YmxtjvqAh7HDSaOr76tys6GpURQVWSRSSPCIcTtmn2wKDEVZTTjFM2Fzu8qDTrl5i2cx UfHv1G3TNiwQzUFp2aZCPoLoFrjIPtiiNXGynlmA6EyOmtmZQgojg1h0v/LHy1bIs+WW b5X7O7DLaDFsB/nf6ddytuA+29NOKowu+651kkNHw2jnSQFfKuKdZHbhBFEB0ShONKXY KF8oul7kAFrASsPPapzaGUHrm6sPpDH5TBPF8j/Q/U4LWyJDGCzwVdk13CDqO2o0ZR+b iK1Q== X-Gm-Message-State: AJIora9O6Uzu/wg1kg1PGG+PXkGbrwdlU7spEL0Fm8cGzwCYKzTjSdNq 47Mr6MWrGETj84asDrn/f0Y= X-Google-Smtp-Source: AGRyM1vEp6+rL+Wouq6U3Uc3dHqIACyRg+BpnCyHuM0NN5vXImRir63qLU15/bkknG3MjEs3GQ/aPw== X-Received: by 2002:a17:902:bb86:b0:169:caf:895c with SMTP id m6-20020a170902bb8600b001690caf895cmr16028267pls.13.1655653859261; Sun, 19 Jun 2022 08:50:59 -0700 (PDT) Received: from vultr.guest ([2001:19f0:6001:2b24:5400:4ff:fe09:b144]) by smtp.gmail.com with ESMTPSA id z10-20020a1709027e8a00b001690a7df347sm6381761pla.96.2022.06.19.08.50.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jun 2022 08:50:58 -0700 (PDT) From: Yafang Shao To: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, john.fastabend@gmail.com, kpsingh@kernel.org, quentin@isovalent.com, hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev, shakeelb@google.com, songmuchun@bytedance.com, akpm@linux-foundation.org, cl@linux.com, penberg@kernel.org, rientjes@google.com, iamjoonsoo.kim@lge.com, vbabka@suse.cz Cc: linux-mm@kvack.org, bpf@vger.kernel.org, Yafang Shao Subject: [RFC PATCH bpf-next 08/10] bpf: Recharge memory when reuse bpf map Date: Sun, 19 Jun 2022 15:50:30 +0000 Message-Id: <20220619155032.32515-9-laoar.shao@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220619155032.32515-1-laoar.shao@gmail.com> References: <20220619155032.32515-1-laoar.shao@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1655653859; a=rsa-sha256; cv=none; b=VfTgBuA+doud5TAy38aFt1hG9BjnOZ4+QmNBCOjG1beDYpBWvv7papUaV/cBk217nufunN lduildqbPER3IuQaIIuy9R1NYo4p39Wha4OXXyWEyxUpZIXepX/3LokRUGrNfhkGB0n2N3 Pu/UiNxeSGvTIgJ97rpRdkQ6SHmV7Po= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=ouUobzlq; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf28.hostedemail.com: domain of laoar.shao@gmail.com designates 209.85.216.52 as permitted sender) smtp.mailfrom=laoar.shao@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1655653859; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=wupU3s6HDHFwU6sdzvBeIV5oXRSNq7jyoLqRbCJxYac=; b=LICXkpYF+fS3qqcNVppias9ZiL6zG8eJmOx1gY585BHfePAQD120mYJD2l56PbRCKn5Nz8 DVqzir1GSxU+fwmhK+JD6Bb2aXEbNYxyu2hb7dOKXvDFY3QfumieDg3vlD4InQFzydjrKk hbf3chp52fgtyFN6HSIzZYMfQNcQNz4= X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: B1FCCC0002 X-Stat-Signature: xhpfbde8j8mexpogfzrfmog1s14pyq11 X-Rspam-User: Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=ouUobzlq; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf28.hostedemail.com: domain of laoar.shao@gmail.com designates 209.85.216.52 as permitted sender) smtp.mailfrom=laoar.shao@gmail.com X-HE-Tag: 1655653859-450706 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: When we reuse a pinned bpf map, if it belongs to a memcg which needs to be recharged, we will uncharge the pages of this bpf map from its original memcg and then charge its pages to the current memcg. We have to explicitly tell the kernel if it is a reuse path as the kernel can't detect it intelligently. That can be done in libbpf, then the user code don't need to be changed. Signed-off-by: Yafang Shao --- include/linux/bpf.h | 2 ++ include/uapi/linux/bpf.h | 2 +- kernel/bpf/syscall.c | 10 ++++++++++ tools/include/uapi/linux/bpf.h | 2 +- tools/lib/bpf/libbpf.c | 2 +- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 0edd7d2c0064..b18a30e70507 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -152,6 +152,8 @@ struct bpf_map_ops { bpf_callback_t callback_fn, void *callback_ctx, u64 flags); + bool (*map_memcg_recharge)(struct bpf_map *map); + /* BTF id of struct allocated by map_alloc */ int *map_btf_id; diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index f2f658e224a7..ffbe15c1c8c6 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -6093,7 +6093,7 @@ struct bpf_map_info { __u32 btf_key_type_id; __u32 btf_value_type_id; __s8 memcg_state; - __s8 :8; /* alignment pad */ + __s8 memcg_recharge; __u16 :16; /* alignment pad */ __u64 map_extra; } __attribute__((aligned(8))); diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index d4659d58d288..8817c40275f3 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -4170,12 +4170,22 @@ static int bpf_map_get_info_by_fd(struct file *file, #ifdef CONFIG_MEMCG_KMEM if (map->memcg) { + size_t offset = offsetof(struct bpf_map_info, memcg_recharge); struct mem_cgroup *memcg = map->memcg; + char recharge; if (memcg == root_mem_cgroup) info.memcg_state = 0; else info.memcg_state = memcg_need_recharge(memcg) ? -1 : 1; + + if (copy_from_user(&recharge, (char __user *)uinfo + offset, sizeof(char))) + return -EFAULT; + + if (recharge && memcg_need_recharge(memcg)) { + if (map->ops->map_memcg_recharge) + map->ops->map_memcg_recharge(map); + } } #endif diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index f2f658e224a7..ffbe15c1c8c6 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -6093,7 +6093,7 @@ struct bpf_map_info { __u32 btf_key_type_id; __u32 btf_value_type_id; __s8 memcg_state; - __s8 :8; /* alignment pad */ + __s8 memcg_recharge; __u16 :16; /* alignment pad */ __u64 map_extra; } __attribute__((aligned(8))); diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 49e359cd34df..f0eb67c983d8 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -4488,7 +4488,7 @@ int bpf_map__set_autocreate(struct bpf_map *map, bool autocreate) int bpf_map__reuse_fd(struct bpf_map *map, int fd) { - struct bpf_map_info info = {}; + struct bpf_map_info info = {.memcg_recharge = 1}; __u32 len = sizeof(info); int new_fd, err; char *new_name; -- 2.17.1