Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp3269590iob; Mon, 16 May 2022 17:42:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz0DQgr1znSl9/7HT6NMcCw/yRCUWDe+NVUlyVYJ6sUcHArGjsNGNk+rXFdRkM4MrU7smPn X-Received: by 2002:a17:90a:6308:b0:1de:fb6c:5944 with SMTP id e8-20020a17090a630800b001defb6c5944mr18201190pjj.60.1652748152695; Mon, 16 May 2022 17:42:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652748152; cv=none; d=google.com; s=arc-20160816; b=cknxxwSQBS3D8x1srd6s4KPjYS8SvzFCzXW28yll/0sBysW0FfguQr/EuzjsgdI6U5 eWzR7u4gsehHJ37ODsG2RAjWvf43DbsYRFJOst2rPNBZ0idChcP4KbIKZJpwoiK/wgpg 4vlxp+Lt0At5p7F+4pTnavOg74fQDczy89w5wSYl4Nj/REcswyYFUAmX0llh1Jy5uMUy MiidU0XUpakIUKa0nHP1JuybBaX/NmAZnyCzdN8JC9TtsZd1+2ZhEEOGvsKL7obOa7D8 GMI4McO/bPfPyHPfS+MsYmsrfHjF+dFO6AMjAafqUToYBjqlbbhMnqZEDcauHRexFER3 QByg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=TT5G9m1CewsSK7p6uttx8+xlrJKz7Eg1GNiEsBeyh+Y=; b=IT+sb1q2XZpVSBCnsnT3eEhYEhtxHxb+TZ8vGKgrt8wIw6SdeQVODLHdUD17ieKY1c 67osYF+u7uyo2yUJ9rglrkRBtTzeX7zNUzbBW7vzIG6ZdozM56Pt3pSTwcfizrdLd8L3 ANXG6eXVhgPEP3pfNxGZvwePBaOX1Pv2ZKNYB688W72lANBw7OAasWy+5W5p5XHIIngP P19V9Xssfegjsvb7smHZO6xCnKdfqiTTt+ATAm2QoLs7l493uHRxEkGS6BYiNvGyDCgC XxQ+3EXSPuqBcBR7TN6KwopumJaxzLn8IvD5JFx3Um4ctOsk1q89j8wGIIP5AfZxq8rp dcoA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h35-20020a63f923000000b003c1cb8950b4si14007466pgi.353.2022.05.16.17.42.21; Mon, 16 May 2022 17:42:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238786AbiEPFlY convert rfc822-to-8bit (ORCPT + 99 others); Mon, 16 May 2022 01:41:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56696 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239507AbiEPFlH (ORCPT ); Mon, 16 May 2022 01:41:07 -0400 Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B311EDF6F for ; Sun, 15 May 2022 22:41:06 -0700 (PDT) Received: from pps.filterd (m0044010.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 24F8tbOk008840 for ; Sun, 15 May 2022 22:41:06 -0700 Received: from mail.thefacebook.com ([163.114.132.120]) by mx0a-00082601.pphosted.com (PPS) with ESMTPS id 3g27rnqmat-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sun, 15 May 2022 22:41:06 -0700 Received: from twshared19572.14.frc2.facebook.com (2620:10d:c085:208::11) by mail.thefacebook.com (2620:10d:c085:21d::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Sun, 15 May 2022 22:41:05 -0700 Received: by devbig932.frc1.facebook.com (Postfix, from userid 4523) id E7C627AEBC12; Sun, 15 May 2022 22:40:57 -0700 (PDT) From: Song Liu To: , CC: , , , , , , , Song Liu Subject: [PATCH bpf-next 1/5] bpf: fill new bpf_prog_pack with illegal instructions Date: Sun, 15 May 2022 22:40:47 -0700 Message-ID: <20220516054051.114490-2-song@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220516054051.114490-1-song@kernel.org> References: <20220516054051.114490-1-song@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8BIT X-FB-Internal: Safe Content-Type: text/plain X-Proofpoint-ORIG-GUID: L7peFkeXj_AniXSh3i3mJ_54k8K-YbXN X-Proofpoint-GUID: L7peFkeXj_AniXSh3i3mJ_54k8K-YbXN X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.858,Hydra:6.0.486,FMLib:17.11.64.514 definitions=2022-05-15_11,2022-05-13_01,2022-02-23_01 X-Spam-Status: No, score=-2.4 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org bpf_prog_pack enables sharing huge pages among multiple BPF programs. These pages are marked as executable before the JIT engine fill it with BPF programs. To make these pages safe, fill the hole bpf_prog_pack with illegal instructions before making it executable. Fixes: 57631054fae6 ("bpf: Introduce bpf_prog_pack allocator") Fixes: 33c9805860e5 ("bpf: Introduce bpf_jit_binary_pack_[alloc|finalize|free]") Signed-off-by: Song Liu --- kernel/bpf/core.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 9cc91f0f3115..2d0c9d4696ad 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -873,7 +873,7 @@ static size_t select_bpf_prog_pack_size(void) return size; } -static struct bpf_prog_pack *alloc_new_pack(void) +static struct bpf_prog_pack *alloc_new_pack(bpf_jit_fill_hole_t bpf_fill_ill_insns) { struct bpf_prog_pack *pack; @@ -886,6 +886,7 @@ static struct bpf_prog_pack *alloc_new_pack(void) kfree(pack); return NULL; } + bpf_fill_ill_insns(pack->ptr, bpf_prog_pack_size); bitmap_zero(pack->bitmap, bpf_prog_pack_size / BPF_PROG_CHUNK_SIZE); list_add_tail(&pack->list, &pack_list); @@ -895,7 +896,7 @@ static struct bpf_prog_pack *alloc_new_pack(void) return pack; } -static void *bpf_prog_pack_alloc(u32 size) +static void *bpf_prog_pack_alloc(u32 size, bpf_jit_fill_hole_t bpf_fill_ill_insns) { unsigned int nbits = BPF_PROG_SIZE_TO_NBITS(size); struct bpf_prog_pack *pack; @@ -910,6 +911,7 @@ static void *bpf_prog_pack_alloc(u32 size) size = round_up(size, PAGE_SIZE); ptr = module_alloc(size); if (ptr) { + bpf_fill_ill_insns(ptr, size); set_vm_flush_reset_perms(ptr); set_memory_ro((unsigned long)ptr, size / PAGE_SIZE); set_memory_x((unsigned long)ptr, size / PAGE_SIZE); @@ -923,7 +925,7 @@ static void *bpf_prog_pack_alloc(u32 size) goto found_free_area; } - pack = alloc_new_pack(); + pack = alloc_new_pack(bpf_fill_ill_insns); if (!pack) goto out; @@ -1102,7 +1104,7 @@ bpf_jit_binary_pack_alloc(unsigned int proglen, u8 **image_ptr, if (bpf_jit_charge_modmem(size)) return NULL; - ro_header = bpf_prog_pack_alloc(size); + ro_header = bpf_prog_pack_alloc(size, bpf_fill_ill_insns); if (!ro_header) { bpf_jit_uncharge_modmem(size); return NULL; -- 2.30.2