Commit Message
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
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)
@@ -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;
@@ -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;
@@ -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;
}