Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp388277pxv; Thu, 22 Jul 2021 02:42:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxvJfuC69qGZVm/Bz6A6b+GtCh5L2mwKYse261jieESD5RRmAaAmVHKonKXO5QUb9OSMib4 X-Received: by 2002:a17:906:9b8d:: with SMTP id dd13mr43161357ejc.480.1626946954718; Thu, 22 Jul 2021 02:42:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626946954; cv=none; d=google.com; s=arc-20160816; b=I/iDNvn/rG1aUqvj+Y0wY7dluZRViwwhtlKo8d0EoOaXEjHB28HhtniPiOEwoKsakF rSmM78YMZ3BNSuqBrhmqU/U9t9zN0hRVumMmqq7Pptav8Ds7J2KxVAO917xiAmPSXuiw /4M9RPYCxhzuPvru+HordeaVBtowWdVVHNbqvznpJ5D0ywDqW2To9YSk2E0UifDiZ0ZT YZUGiZ9rOBfLuiPqaEK5glSOrRWdH/vjmBoUhdOCQ4GX2G1r+V6JVVtVGe26ouC8yWhN mH6S1TDeGHGMHP6YWvbcQ5275VOxEDFrsetHeC2c3BhuTHncrJ9MhDz5lW8o3HjmVwRp 2PGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from :dkim-signature; bh=f1tJJWsNPHtyLHNkjYc8ShNPedoFW/MJWzFqp9S/91w=; b=vgO5kZoig0cjiimweCZLmy1Er9syu4LUPvbXeFz0AUoFd6Q5FWyDT5ZZxpVFMUn5DQ 07ZLzJ96+8Q+O6/NQ2LiwE5qEKYmpSn5zs0HrfS+rqPifyKFBAE08bAGzQ9CA7Ks/+RQ OPw5Gh9/1Z2WAwTeO6v4NSzvOKtDGAPiAh4THBCnUaQ3LqpTQmU/trawUVYKd45xFO/l kRCkh9C3FxKBq+/3f74sW/Q+HqahiCjaep/kHDTfRGBqeGGIfzbFI7bL7cNZ7pQJXFjo FUygyB0XWdpiAWhpolQpFHuI6y9YT+6sl4ZFyKpZjWsXvddzUVFR3CvbtSoqCSgfiOx1 /9Ig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=B7f+or+T; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l12si30446738ejk.477.2021.07.22.02.42.10; Thu, 22 Jul 2021 02:42:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=B7f+or+T; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231408AbhGVI6K (ORCPT + 99 others); Thu, 22 Jul 2021 04:58:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35250 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231280AbhGVI6J (ORCPT ); Thu, 22 Jul 2021 04:58:09 -0400 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 095CAC061575; Thu, 22 Jul 2021 02:38:45 -0700 (PDT) Received: by mail-pl1-x632.google.com with SMTP id n11so3811074plc.2; Thu, 22 Jul 2021 02:38:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=f1tJJWsNPHtyLHNkjYc8ShNPedoFW/MJWzFqp9S/91w=; b=B7f+or+TDrkCSwBhquaRkJnVlXzRiPzhjVZKT6H4pC9Uji8jM1Wv9kqqB9wyhEVsM1 35O+q0km0e+c2lSlCF97LN9J+ataibov+Ghn58k5OQ2rG89hlkPhiuHqWau7uEGMUjNz SWWK9RKKPp1bQqX2GE/YoA8TTriF+Crd/UVJbPWPdnKRYTox32OHYUP1FvVUlReWSNzk hwPCAjQgdUh1sUHCqad0dU4VVwqmMng0+K3MeDAd2nrdFc3J3K21YpoF8AktZODlpvqs 5HhfBRz3K8hxxUEfkCKEUCT6HWHprqmtKprsLViWfb3Pph9RK/3DGryXEpsG3YdS4lCH XsEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=f1tJJWsNPHtyLHNkjYc8ShNPedoFW/MJWzFqp9S/91w=; b=OSEOFX71PcFiir9yevpn6FGYJ05g1Wnp6L0TnLTSRynp52ErCeo3SXlF2/RCtPotcm ul28E1auIo9/x4ESfj00cgvLiaQWrMEcuG+F7DjpCElWfI60ia3x7sxdXPJwCLRYLSh8 JnHfi4imGH3ZlDW6urY3JkCs4OS5elGaZv8gB+FTuOL555Guko1FMhOobrKRHm9UPAwz Giizt0eWGywQDDJA/ugTuUH8UA5KRGB5yDRs0+oPcGfBbkJG4NiQvSzNiq9TXERaodLu zdRzG++saE6UI/8Xs5IgKM5QBS2WdqmO8h+cw2IQ9RsJ3XE+cQganSMIwx4j6LPCUkVk O81w== X-Gm-Message-State: AOAM531y14GgS6AxnGqmWCV+EveHNQsqLtOZSytkxqjYipE//jnMxfWd /LY4uIjW9GPrwKI/8VeDhlo= X-Received: by 2002:a17:90a:fb86:: with SMTP id cp6mr8357408pjb.211.1626946724513; Thu, 22 Jul 2021 02:38:44 -0700 (PDT) Received: from VM-0-3-centos.localdomain ([101.32.213.191]) by smtp.gmail.com with ESMTPSA id m1sm14208741pfc.36.2021.07.22.02.38.42 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Jul 2021 02:38:43 -0700 (PDT) From: brookxu To: viro@zeniv.linux.org.uk, tj@kernel.org, lizefan.x@bytedance.com, hannes@cmpxchg.org Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, cgroups@vger.kernel.org Subject: [RFC PATCH 1/3] misc_cgroup: add support for nofile limit Date: Thu, 22 Jul 2021 17:38:38 +0800 Message-Id: <4775e8d187920399403b296f8bb11bd687688671.1626946231.git.brookxu@tencent.com> X-Mailer: git-send-email 1.8.3.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chunguang Xu Since the global open files are limited, in order to avoid the abnormal behavior of some containers from generating too many files, causing other containers to be unavailable, we need to limit the open files of some containers. Signed-off-by: Chunguang Xu --- fs/file_table.c | 25 +++++++++++++++++++++++-- include/linux/fs.h | 4 +++- include/linux/misc_cgroup.h | 1 + kernel/cgroup/misc.c | 1 + 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/fs/file_table.c b/fs/file_table.c index 45437f8e1003..a7848a4cac19 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -29,6 +29,7 @@ #include #include +#include #include "internal.h" @@ -53,8 +54,14 @@ static void file_free_rcu(struct rcu_head *head) static inline void file_free(struct file *f) { security_file_free(f); - if (!(f->f_mode & FMODE_NOACCOUNT)) + if (!(f->f_mode & FMODE_NOACCOUNT)) { + struct misc_cg *misc_cg = css_misc(f->f_css); + + misc_cg_uncharge(MISC_CG_RES_NOFILE, misc_cg, 1); + put_misc_cg(misc_cg); + percpu_counter_dec(&nr_files); + } call_rcu(&f->f_u.fu_rcuhead, file_free_rcu); } @@ -148,8 +155,20 @@ struct file *alloc_empty_file(int flags, const struct cred *cred) } f = __alloc_file(flags, cred); - if (!IS_ERR(f)) + if (!IS_ERR(f)) { + struct misc_cg *misc_cg = get_current_misc_cg(); + int ret; + + ret = misc_cg_try_charge(MISC_CG_RES_NOFILE, misc_cg, 1); + if (ret < 0) { + put_misc_cg(misc_cg); + file_free(f); + goto out; + } + percpu_counter_inc(&nr_files); + f->f_css = &misc_cg->css; + } return f; @@ -159,6 +178,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred) pr_info("VFS: file-max limit %lu reached\n", get_max_files()); old_max = get_nr_files(); } + out: return ERR_PTR(-ENFILE); } @@ -397,4 +417,5 @@ void __init files_maxfiles_init(void) n = ((nr_pages - memreserve) * (PAGE_SIZE / 1024)) / 10; files_stat.max_files = max_t(unsigned long, n, NR_FILE); + misc_cg_set_capacity(MISC_CG_RES_NOFILE, files_stat.max_files); } diff --git a/include/linux/fs.h b/include/linux/fs.h index fad6663cd1b0..9ef3dd579ed6 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -947,7 +947,9 @@ struct file { #endif /* needed for tty driver, and maybe others */ void *private_data; - +#ifdef CONFIG_CGROUP_MISC + struct cgroup_subsys_state *f_css; +#endif #ifdef CONFIG_EPOLL /* Used by fs/eventpoll.c to link all the hooks to this file */ struct hlist_head *f_ep; diff --git a/include/linux/misc_cgroup.h b/include/linux/misc_cgroup.h index da2367e2ac1e..8450a5e66de0 100644 --- a/include/linux/misc_cgroup.h +++ b/include/linux/misc_cgroup.h @@ -18,6 +18,7 @@ enum misc_res_type { /* AMD SEV-ES ASIDs resource */ MISC_CG_RES_SEV_ES, #endif + MISC_CG_RES_NOFILE, MISC_CG_RES_TYPES }; diff --git a/kernel/cgroup/misc.c b/kernel/cgroup/misc.c index ec02d963cad1..5d51b8eeece6 100644 --- a/kernel/cgroup/misc.c +++ b/kernel/cgroup/misc.c @@ -24,6 +24,7 @@ static const char *const misc_res_name[] = { /* AMD SEV-ES ASIDs resource */ "sev_es", #endif + "nofile" }; /* Root misc cgroup */ -- 2.30.0