sched: Make const-safe

Message ID 20221209160431.1948817-1-willy@infradead.org
State New
Headers
Series sched: Make const-safe |

Commit Message

Matthew Wilcox Dec. 9, 2022, 4:04 p.m. UTC
  With a modified container_of() that preserves constness, the compiler
finds some variables which should have been const and some functions
which should have had their arguments marked as const.  No change to
generated code.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 kernel/sched/core.c  |  8 +++++---
 kernel/sched/fair.c  | 16 +++++++++-------
 kernel/sched/sched.h | 11 ++++++-----
 3 files changed, 20 insertions(+), 15 deletions(-)
  

Comments

kernel test robot Dec. 9, 2022, 9:23 p.m. UTC | #1
Hi Matthew,

I love your patch! Perhaps something to improve:

[auto build test WARNING on tip/sched/core]
[also build test WARNING on tip/master tip/auto-latest linus/master v6.1-rc8 next-20221208]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Matthew-Wilcox-Oracle/sched-Make-const-safe/20221210-000625
patch link:    https://lore.kernel.org/r/20221209160431.1948817-1-willy%40infradead.org
patch subject: [PATCH] sched: Make const-safe
config: s390-randconfig-r044-20221209
compiler: s390-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/de0d96906898ccc52f76c2794ccdfbbcf94c9fe0
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Matthew-Wilcox-Oracle/sched-Make-const-safe/20221210-000625
        git checkout de0d96906898ccc52f76c2794ccdfbbcf94c9fe0
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   kernel/sched/fair.c:5925:6: warning: no previous prototype for 'init_cfs_bandwidth' [-Wmissing-prototypes]
    5925 | void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
         |      ^~~~~~~~~~~~~~~~~~
   kernel/sched/fair.c: In function 'se_fi_update':
>> kernel/sched/fair.c:11723:51: warning: passing argument 1 of 'cfs_rq_of' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
   11723 |                 struct cfs_rq *cfs_rq = cfs_rq_of(se);
         |                                                   ^~
   In file included from kernel/sched/fair.c:55:
   kernel/sched/sched.h:1442:61: note: expected 'struct sched_entity *' but argument is of type 'const struct sched_entity *'
    1442 | static inline struct cfs_rq *cfs_rq_of(struct sched_entity *se)
         |                                        ~~~~~~~~~~~~~~~~~~~~~^~
   kernel/sched/fair.c: At top level:
   kernel/sched/fair.c:11735:6: warning: no previous prototype for 'task_vruntime_update' [-Wmissing-prototypes]
   11735 | void task_vruntime_update(struct rq *rq, struct task_struct *p, bool in_fi)
         |      ^~~~~~~~~~~~~~~~~~~~
   kernel/sched/fair.c:12345:6: warning: no previous prototype for 'free_fair_sched_group' [-Wmissing-prototypes]
   12345 | void free_fair_sched_group(struct task_group *tg) { }
         |      ^~~~~~~~~~~~~~~~~~~~~
   kernel/sched/fair.c:12347:5: warning: no previous prototype for 'alloc_fair_sched_group' [-Wmissing-prototypes]
   12347 | int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
         |     ^~~~~~~~~~~~~~~~~~~~~~
   kernel/sched/fair.c:12352:6: warning: no previous prototype for 'online_fair_sched_group' [-Wmissing-prototypes]
   12352 | void online_fair_sched_group(struct task_group *tg) { }
         |      ^~~~~~~~~~~~~~~~~~~~~~~
   kernel/sched/fair.c:12354:6: warning: no previous prototype for 'unregister_fair_sched_group' [-Wmissing-prototypes]
   12354 | void unregister_fair_sched_group(struct task_group *tg) { }
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~


vim +11723 kernel/sched/fair.c

c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11715) 
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11716) /*
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11717)  * se_fi_update - Update the cfs_rq->min_vruntime_fi in a CFS hierarchy if needed.
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11718)  */
de0d96906898cc Matthew Wilcox (Oracle  2022-12-09  11719) static void se_fi_update(const struct sched_entity *se, unsigned int fi_seq,
de0d96906898cc Matthew Wilcox (Oracle  2022-12-09  11720) 			 bool forceidle)
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11721) {
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11722) 	for_each_sched_entity(se) {
c6047c2e3af68d Joel Fernandes (Google  2020-11-17 @11723) 		struct cfs_rq *cfs_rq = cfs_rq_of(se);
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11724) 
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11725) 		if (forceidle) {
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11726) 			if (cfs_rq->forceidle_seq == fi_seq)
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11727) 				break;
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11728) 			cfs_rq->forceidle_seq = fi_seq;
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11729) 		}
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11730) 
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11731) 		cfs_rq->min_vruntime_fi = cfs_rq->min_vruntime;
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11732) 	}
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11733) }
c6047c2e3af68d Joel Fernandes (Google  2020-11-17  11734)
  

Patch

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 25b582b6ee5f..853188cb6c84 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -152,7 +152,7 @@  __read_mostly int scheduler_running;
 DEFINE_STATIC_KEY_FALSE(__sched_core_enabled);
 
 /* kernel prio, less is more */
-static inline int __task_prio(struct task_struct *p)
+static inline int __task_prio(const struct task_struct *p)
 {
 	if (p->sched_class == &stop_sched_class) /* trumps deadline */
 		return -2;
@@ -174,7 +174,8 @@  static inline int __task_prio(struct task_struct *p)
  */
 
 /* real prio, less is less */
-static inline bool prio_less(struct task_struct *a, struct task_struct *b, bool in_fi)
+static inline bool prio_less(const struct task_struct *a,
+			     const struct task_struct *b, bool in_fi)
 {
 
 	int pa = __task_prio(a), pb = __task_prio(b);
@@ -194,7 +195,8 @@  static inline bool prio_less(struct task_struct *a, struct task_struct *b, bool
 	return false;
 }
 
-static inline bool __sched_core_less(struct task_struct *a, struct task_struct *b)
+static inline bool __sched_core_less(const struct task_struct *a,
+				     const struct task_struct *b)
 {
 	if (a->core_cookie < b->core_cookie)
 		return true;
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c36aa54ae071..855470310903 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -468,7 +468,7 @@  is_same_group(struct sched_entity *se, struct sched_entity *pse)
 	return NULL;
 }
 
-static inline struct sched_entity *parent_entity(struct sched_entity *se)
+static inline struct sched_entity *parent_entity(const struct sched_entity *se)
 {
 	return se->parent;
 }
@@ -595,8 +595,8 @@  static inline u64 min_vruntime(u64 min_vruntime, u64 vruntime)
 	return min_vruntime;
 }
 
-static inline bool entity_before(struct sched_entity *a,
-				struct sched_entity *b)
+static inline bool entity_before(const struct sched_entity *a,
+				 const struct sched_entity *b)
 {
 	return (s64)(a->vruntime - b->vruntime) < 0;
 }
@@ -11728,7 +11728,8 @@  static inline void task_tick_core(struct rq *rq, struct task_struct *curr)
 /*
  * se_fi_update - Update the cfs_rq->min_vruntime_fi in a CFS hierarchy if needed.
  */
-static void se_fi_update(struct sched_entity *se, unsigned int fi_seq, bool forceidle)
+static void se_fi_update(const struct sched_entity *se, unsigned int fi_seq,
+			 bool forceidle)
 {
 	for_each_sched_entity(se) {
 		struct cfs_rq *cfs_rq = cfs_rq_of(se);
@@ -11753,11 +11754,12 @@  void task_vruntime_update(struct rq *rq, struct task_struct *p, bool in_fi)
 	se_fi_update(se, rq->core->core_forceidle_seq, in_fi);
 }
 
-bool cfs_prio_less(struct task_struct *a, struct task_struct *b, bool in_fi)
+bool cfs_prio_less(const struct task_struct *a, const struct task_struct *b,
+			bool in_fi)
 {
 	struct rq *rq = task_rq(a);
-	struct sched_entity *sea = &a->se;
-	struct sched_entity *seb = &b->se;
+	const struct sched_entity *sea = &a->se;
+	const struct sched_entity *seb = &b->se;
 	struct cfs_rq *cfs_rqa;
 	struct cfs_rq *cfs_rqb;
 	s64 delta;
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 771f8ddb7053..aa729d54cf94 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -248,7 +248,7 @@  static inline void update_avg(u64 *avg, u64 sample)
 
 #define SCHED_DL_FLAGS (SCHED_FLAG_RECLAIM | SCHED_FLAG_DL_OVERRUN | SCHED_FLAG_SUGOV)
 
-static inline bool dl_entity_is_special(struct sched_dl_entity *dl_se)
+static inline bool dl_entity_is_special(const struct sched_dl_entity *dl_se)
 {
 #ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL
 	return unlikely(dl_se->flags & SCHED_FLAG_SUGOV);
@@ -260,8 +260,8 @@  static inline bool dl_entity_is_special(struct sched_dl_entity *dl_se)
 /*
  * Tells if entity @a should preempt entity @b.
  */
-static inline bool
-dl_entity_preempt(struct sched_dl_entity *a, struct sched_dl_entity *b)
+static inline bool dl_entity_preempt(const struct sched_dl_entity *a,
+				     const struct sched_dl_entity *b)
 {
 	return dl_entity_is_special(a) ||
 	       dl_time_before(a->deadline, b->deadline);
@@ -1236,7 +1236,8 @@  static inline raw_spinlock_t *__rq_lockp(struct rq *rq)
 	return &rq->__lock;
 }
 
-bool cfs_prio_less(struct task_struct *a, struct task_struct *b, bool fi);
+bool cfs_prio_less(const struct task_struct *a, const struct task_struct *b,
+			bool fi);
 
 /*
  * Helpers to check if the CPU's core cookie matches with the task's cookie
@@ -1415,7 +1416,7 @@  static inline struct cfs_rq *task_cfs_rq(struct task_struct *p)
 }
 
 /* runqueue on which this entity is (to be) queued */
-static inline struct cfs_rq *cfs_rq_of(struct sched_entity *se)
+static inline struct cfs_rq *cfs_rq_of(const struct sched_entity *se)
 {
 	return se->cfs_rq;
 }