Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4573869imu; Tue, 15 Jan 2019 02:19:15 -0800 (PST) X-Google-Smtp-Source: ALg8bN7xR4saNZF1gEePguK1dgF5EzMxf1Zlu9CWRjSY7HDBbvwq1SUknw5rlJsz/9km8bNMrZQv X-Received: by 2002:a63:88c7:: with SMTP id l190mr3160090pgd.110.1547547555730; Tue, 15 Jan 2019 02:19:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547547555; cv=none; d=google.com; s=arc-20160816; b=GKtuU4YjoJ9Eo/FdU+yabA+9dBmtRkYtezndzn2kYFERAMBG0PXAYYsFvNj2xUB1jH 3evL0xtHlYL9DBsV4a0atRznFwiUtOu1P4hL1TTb6qLkVIORdWs/2bHyM2BUFZ71mCjZ h901fmF0Wt/wB1EfrB0pUOiOTPUbIC/4kbuFgWFKHS2hWMJC/E7UFimL5L9GP/LTs3Fi bk/jD42H6QfTLTiM8LxgKZlhG74MHt3iTrwXoTlNJSCUOEe1M64vMGkzyFpGjou1Ef6E X8KglT/4WTnLpB5gCneIEbFCyZXn0kiWuVBePWk4fteMOQyCNbA8y95oa4/UU/d41B85 24QA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=72YU9OU64sAlkdjZjMT0i/XNGN95J9tG+G9q83bVed4=; b=I55e6L2z9afxThApc3WDhElU1Sm2YGBdwOWq686hcdexPBaPjI/zyDGHs1bebFyl68 GSpSsBb5Saex9mUJsCN8xdfIvyBLRMSvruCNHpPkfJWsrefzyG3KJc9+TTzeeQ4i8lWs VyM1XOtpDurmhCrmzXFZHTPRtP9P3vRASXuLT/9XSHV4E8iC6KoNxJZDWOyyhUh6YJu1 GKhDSLMm4WYR6J/g199IkjTdUx2UNofIxZ/AFcZpDlJmgFM9huAwusZ3VuF446p8/rkq 5uU7EA3yJCeCVVPtKE7luQhbwfoiW9R4guS3n9Djqn6cBTh14289hsv6buFJSUIzed5r WS0A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j29si2996844pga.550.2019.01.15.02.19.00; Tue, 15 Jan 2019 02:19:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728699AbfAOKPc (ORCPT + 99 others); Tue, 15 Jan 2019 05:15:32 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:46790 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727238AbfAOKPb (ORCPT ); Tue, 15 Jan 2019 05:15:31 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 0FB381596; Tue, 15 Jan 2019 02:15:30 -0800 (PST) Received: from e110439-lin.cambridge.arm.com (e110439-lin.cambridge.arm.com [10.1.194.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id ED5D43F70D; Tue, 15 Jan 2019 02:15:26 -0800 (PST) From: Patrick Bellasi To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-api@vger.kernel.org Cc: Ingo Molnar , Peter Zijlstra , Tejun Heo , "Rafael J . Wysocki" , Vincent Guittot , Viresh Kumar , Paul Turner , Quentin Perret , Dietmar Eggemann , Morten Rasmussen , Juri Lelli , Todd Kjos , Joel Fernandes , Steve Muckle , Suren Baghdasaryan Subject: [PATCH v6 01/16] sched/core: Allow sched_setattr() to use the current policy Date: Tue, 15 Jan 2019 10:14:58 +0000 Message-Id: <20190115101513.2822-2-patrick.bellasi@arm.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190115101513.2822-1-patrick.bellasi@arm.com> References: <20190115101513.2822-1-patrick.bellasi@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The sched_setattr() syscall mandates that a policy is always specified. This requires to always know which policy a task will have when attributes are configured and it makes it impossible to add more generic task attributes valid across different scheduling policies. Reading the policy before setting generic tasks attributes is racy since we cannot be sure it is not changed concurrently. Introduce the required support to change generic task attributes without affecting the current task policy. This is done by adding an attribute flag (SCHED_FLAG_KEEP_POLICY) to enforce the usage of the current policy. This is done by extending to the sched_setattr() non-POSIX syscall with the SETPARAM_POLICY policy already used by the sched_setparam() POSIX syscall. Signed-off-by: Patrick Bellasi Cc: Ingo Molnar Cc: Peter Zijlstra --- Changes in v6: Message-ID: <20181107135801.GE9761@hirez.programming.kicks-ass.net> - rename SCHED_FLAG_TUNE_POLICY in SCHED_FLAG_KEEP_POLICY - moved at the beginning of the series --- include/uapi/linux/sched.h | 6 +++++- kernel/sched/core.c | 11 ++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/sched.h b/include/uapi/linux/sched.h index 22627f80063e..43832a87016a 100644 --- a/include/uapi/linux/sched.h +++ b/include/uapi/linux/sched.h @@ -40,6 +40,8 @@ /* SCHED_ISO: reserved but not implemented yet */ #define SCHED_IDLE 5 #define SCHED_DEADLINE 6 +/* Must be the last entry: used to sanity check attr.policy values */ +#define SCHED_POLICY_MAX 7 /* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */ #define SCHED_RESET_ON_FORK 0x40000000 @@ -50,9 +52,11 @@ #define SCHED_FLAG_RESET_ON_FORK 0x01 #define SCHED_FLAG_RECLAIM 0x02 #define SCHED_FLAG_DL_OVERRUN 0x04 +#define SCHED_FLAG_KEEP_POLICY 0x08 #define SCHED_FLAG_ALL (SCHED_FLAG_RESET_ON_FORK | \ SCHED_FLAG_RECLAIM | \ - SCHED_FLAG_DL_OVERRUN) + SCHED_FLAG_DL_OVERRUN | \ + SCHED_FLAG_KEEP_POLICY) #endif /* _UAPI_LINUX_SCHED_H */ diff --git a/kernel/sched/core.c b/kernel/sched/core.c index a674c7db2f29..a68763a4ccae 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4560,8 +4560,17 @@ SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr, if (retval) return retval; - if ((int)attr.sched_policy < 0) + /* + * A valid policy is always required from userspace, unless + * SCHED_FLAG_KEEP_POLICY is set and the current policy + * is enforced for this call. + */ + if (attr.sched_policy >= SCHED_POLICY_MAX && + !(attr.sched_flags & SCHED_FLAG_KEEP_POLICY)) { return -EINVAL; + } + if (attr.sched_flags & SCHED_FLAG_KEEP_POLICY) + attr.sched_policy = SETPARAM_POLICY; rcu_read_lock(); retval = -ESRCH; -- 2.19.2