Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp1932238rwb; Thu, 29 Sep 2022 04:14:36 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7eqSValeYBZ3dAhD1Nn8rEiyOErQuLeidoZ70BUUoxHMP1VKd8UNzZ8q0Ie91fLCTfWnoj X-Received: by 2002:a17:907:1c12:b0:783:a788:9bbc with SMTP id nc18-20020a1709071c1200b00783a7889bbcmr2271033ejc.497.1664450075976; Thu, 29 Sep 2022 04:14:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664450075; cv=none; d=google.com; s=arc-20160816; b=IgRng7NkwP/AnjW8KWfLuTduxFQPxfPg4Pry2ril54bhTQ5K2aWfTV95qZUWtQKOoP c4DujIJH5OY6c1s65fR3QRQkK4LxTZ/SYMDX2kYxUKKaB837LkH4OKiiO1PC/O7vf39U Q2vv/U0Jc0GKWRJP4S1wcQppib05uzafaj/mouMCYeIpGjiqDCVybd9tH9zp7RNvRzEN 8p6sUefn8e1KUqjwHeyrwaaV6y97EOPxQdJL7x8mq8+J7lpJzkCIgqhwFeXT8goL5wPj zjjNp7orh01Mkyi4YXaL9m5QkXCA5gX43gzvruJKiZ73TkAXuXIK9SshiSb9uG2mQfIg juMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature:dkim-filter; bh=mWyDCK4sgwNQboz2oMaLFnl6zMEOPYFWjgXwMVYGH4A=; b=bCi0ppCpSlbgWNx3035cFPE8Qct5aqV1MrejUEFudkvWKVbfP1wZrOwlu7Zayr4tSS Sj7Wi4DckMBSHIzRwT1CbRzhUbg8lJFfr8DASKa61n0rZ2w1DjppUxFxXCpdBq8uMaj9 dfCd/QbDo0HXqGfYvQ7/fZdVESB7JB+SL//NnaHjYpRZ9DJpGPhPvNNI72qLqqdbVm1N +BOUOOQ+RzDyC+HqG5R6Ord0VqUcLeug2Xj1yF+SM3Ki0DxyCrG1Vg7xrmwg/4lR9mEB TK13SSpyk/95jfTbKnis6FjMyIOt7hLKDfCEiInDamI1LgluPpwajdR7UBz9Xn5IM3Rx 8Yrg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b="SQq1j/TG"; 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=linux.microsoft.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b7-20020a056402084700b0044eba28fe51si10239623edz.279.2022.09.29.04.14.07; Thu, 29 Sep 2022 04:14:35 -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; dkim=pass header.i=@linux.microsoft.com header.s=default header.b="SQq1j/TG"; 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=linux.microsoft.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235086AbiI2KY4 (ORCPT + 99 others); Thu, 29 Sep 2022 06:24:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34658 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235152AbiI2KYv (ORCPT ); Thu, 29 Sep 2022 06:24:51 -0400 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 6CA882ED4C for ; Thu, 29 Sep 2022 03:24:50 -0700 (PDT) Received: by linux.microsoft.com (Postfix, from userid 1134) id 2FB1520DEE80; Thu, 29 Sep 2022 03:24:50 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 2FB1520DEE80 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1664447090; bh=mWyDCK4sgwNQboz2oMaLFnl6zMEOPYFWjgXwMVYGH4A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SQq1j/TGTKNgftQPa/1lLz0CNf/6/sX0IV2JrXrkdUMoWX606HHPBjS81p0mfbKep upjEu4ANjuEYEUCBjwzHlL+jOkTnOSMWKPAvyvayrJi7zqDg18lEDsjUMzmcUXbNhQ w6DEZD2Z7EVjcKAlrXhoL1fcp+uo7bR2HGogVATw= From: Shradha Gupta To: Andrew Morton , linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Shradha Gupta , Michael Kelley Subject: [PATCH 1/2] mm/page_reporting: Add checks for page_reporting_order param value Date: Thu, 29 Sep 2022 03:24:40 -0700 Message-Id: <1664447081-14744-2-git-send-email-shradhagupta@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1664447081-14744-1-git-send-email-shradhagupta@linux.microsoft.com> References: <1664447081-14744-1-git-send-email-shradhagupta@linux.microsoft.com> X-Spam-Status: No, score=-19.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_MED, SPF_HELO_PASS,SPF_PASS,USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_WL autolearn=ham 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 Current code allows the page_reporting_order parameter to be changed via sysfs to any integer value. The new value is used immediately in page reporting code with no validation, which could cause incorrect behavior. Fix this by adding validation of the new value. Export this parameter for use in the driver that is calling the page_reporting_register(). This is needed by drivers like hv_balloon to know the order of the pages reported. Traditionally the values provided in the kernel boot line or subsequently changed via sysfs take priority therefore, if page_reporting_order parameter's value is set, it takes precedence over the value passed while registering with the driver. Signed-off-by: Shradha Gupta --- mm/page_reporting.c | 50 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/mm/page_reporting.c b/mm/page_reporting.c index 382958eef8a9..29d67c824fd2 100644 --- a/mm/page_reporting.c +++ b/mm/page_reporting.c @@ -11,10 +11,42 @@ #include "page_reporting.h" #include "internal.h" -unsigned int page_reporting_order = MAX_ORDER; -module_param(page_reporting_order, uint, 0644); +/* Initialize to an unsupported value */ +unsigned int page_reporting_order = -1; + +int page_order_update_notify(const char *val, const struct kernel_param *kp) +{ + /* + * If param is set beyond this limit, order is set to default + * pageblock_order value + */ + return param_set_uint_minmax(val, kp, 0, MAX_ORDER-1); +} + +const struct kernel_param_ops page_reporting_param_ops = { + .set = &page_order_update_notify, + /* + * For the get op, use param_get_int instead of param_get_uint. + * This is to make sure that when unset the initialized value of + * -1 is shown correctly + */ + .get = ¶m_get_int, +}; + +module_param_cb(page_reporting_order, &page_reporting_param_ops, + &page_reporting_order, 0644); MODULE_PARM_DESC(page_reporting_order, "Set page reporting order"); +/* + * This symbol is also a kernel parameter. Export the page_reporting_order + * symbol so that other drivers can access it to control order values without + * having to introduce another configurable parameter. Only one driver can + * register with the page_reporting driver for the service, so we have just + * one control parameter for the use case(which can be accessed in both + * drivers) + */ +EXPORT_SYMBOL_GPL(page_reporting_order); + #define PAGE_REPORTING_DELAY (2 * HZ) static struct page_reporting_dev_info __rcu *pr_dev_info __read_mostly; @@ -330,10 +362,18 @@ int page_reporting_register(struct page_reporting_dev_info *prdev) } /* - * Update the page reporting order if it's specified by driver. - * Otherwise, it falls back to @pageblock_order. + * If the page_reporting_order value is not set, we check if + * an order is provided from the driver that is performing the + * registration. If that is not provided either, we default to + * pageblock_order. */ - page_reporting_order = prdev->order ? : pageblock_order; + + if (page_reporting_order == -1) { + if (prdev->order > 0 && prdev->order <= MAX_ORDER) + page_reporting_order = prdev->order; + else + page_reporting_order = pageblock_order; + } /* initialize state and work structures */ atomic_set(&prdev->state, PAGE_REPORTING_IDLE); -- 2.37.2