All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: kbuild-all@lists.01.org, linux-kernel@vger.kernel.org
Subject: [tglx-devel:hrtimer 8/12] kernel/time/hrtimer.c:1232:44: warning: suggest parentheses around comparison in operand of '|'
Date: Mon, 20 Sep 2021 07:30:01 +0800	[thread overview]
Message-ID: <202109200750.J1UMAIFx-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 5390 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git hrtimer
head:   16c372aeaca31d5d9d998466e75e845a2926685f
commit: 6161421a8190f07b3c0a52c0b62c8b3f51de6ddf [8/12] hrtimer: Avoid reprogramming when callback is running
config: um-x86_64_defconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git/commit/?id=6161421a8190f07b3c0a52c0b62c8b3f51de6ddf
        git remote add tglx-devel https://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git
        git fetch --no-tags tglx-devel hrtimer
        git checkout 6161421a8190f07b3c0a52c0b62c8b3f51de6ddf
        # save the attached .config to linux build tree
        make W=1 ARCH=um SUBARCH=x86_64

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

All warnings (new ones prefixed by >>):

   kernel/time/hrtimer.c:120:21: warning: initialized field overwritten [-Woverride-init]
     120 |  [CLOCK_REALTIME] = HRTIMER_BASE_REALTIME,
         |                     ^~~~~~~~~~~~~~~~~~~~~
   kernel/time/hrtimer.c:120:21: note: (near initialization for 'hrtimer_clock_to_base_table[0]')
   kernel/time/hrtimer.c:121:22: warning: initialized field overwritten [-Woverride-init]
     121 |  [CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC,
         |                      ^~~~~~~~~~~~~~~~~~~~~~
   kernel/time/hrtimer.c:121:22: note: (near initialization for 'hrtimer_clock_to_base_table[1]')
   kernel/time/hrtimer.c:122:21: warning: initialized field overwritten [-Woverride-init]
     122 |  [CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME,
         |                     ^~~~~~~~~~~~~~~~~~~~~
   kernel/time/hrtimer.c:122:21: note: (near initialization for 'hrtimer_clock_to_base_table[7]')
   kernel/time/hrtimer.c:123:17: warning: initialized field overwritten [-Woverride-init]
     123 |  [CLOCK_TAI]  = HRTIMER_BASE_TAI,
         |                 ^~~~~~~~~~~~~~~~
   kernel/time/hrtimer.c:123:17: note: (near initialization for 'hrtimer_clock_to_base_table[11]')
   kernel/time/hrtimer.c: In function '__hrtimer_start_range_ns':
>> kernel/time/hrtimer.c:1232:44: warning: suggest parentheses around comparison in operand of '|' [-Wparentheses]
    1232 |  force_local &= base->cpu_base->next_timer == timer | in_callback;
         |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
   kernel/time/hrtimer.c: In function '__run_hrtimer':
   kernel/time/hrtimer.c:1652:7: warning: variable 'expires_in_hardirq' set but not used [-Wunused-but-set-variable]
    1652 |  bool expires_in_hardirq;
         |       ^~~~~~~~~~~~~~~~~~


vim +1232 kernel/time/hrtimer.c

  1211	
  1212	static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
  1213					    u64 delta_ns, const enum hrtimer_mode mode,
  1214					    struct hrtimer_clock_base *base)
  1215	{
  1216		struct hrtimer_clock_base *new_base;
  1217		bool in_callback, force_local, first;
  1218	
  1219		/*
  1220		 * If the timer is on the local cpu base and is the first expiring
  1221		 * timer then this might end up reprogramming the hardware twice
  1222		 * (on removal and on enqueue). To avoid that by prevent the
  1223		 * reprogram on removal, keep the timer local to the current CPU
  1224		 * and enforce reprogramming after it is queued no matter whether
  1225		 * it is the new first expiring timer again or not.
  1226		 *
  1227		 * Also avoid reprogramming if the timer callback is currently
  1228		 * running.
  1229		 */
  1230		in_callback = base->running == timer;
  1231		force_local = base->cpu_base == this_cpu_ptr(&hrtimer_bases);
> 1232		force_local &= base->cpu_base->next_timer == timer | in_callback;
  1233	
  1234		/*
  1235		 * Remove an active timer from the queue. In case it is not queued
  1236		 * on the current CPU, make sure that remove_hrtimer() updates the
  1237		 * remote data correctly.
  1238		 *
  1239		 * If it's on the current CPU and the first expiring timer, then
  1240		 * skip reprogramming, keep the timer local and enforce
  1241		 * reprogramming later if it was the first expiring timer.  This
  1242		 * avoids programming the underlying clock event twice (once at
  1243		 * removal and once after enqueue).
  1244		 */
  1245		remove_hrtimer(timer, base, true, force_local);
  1246	
  1247		if (mode & HRTIMER_MODE_REL)
  1248			tim = ktime_add_safe(tim, base->get_time());
  1249	
  1250		tim = hrtimer_update_lowres(timer, tim, mode);
  1251	
  1252		hrtimer_set_expires_range_ns(timer, tim, delta_ns);
  1253	
  1254		/* Switch the timer base, if necessary: */
  1255		if (!force_local) {
  1256			new_base = switch_hrtimer_base(timer, base,
  1257						       mode & HRTIMER_MODE_PINNED);
  1258		} else {
  1259			new_base = base;
  1260		}
  1261	
  1262		first = enqueue_hrtimer(timer, new_base, mode);
  1263		if (!force_local || in_callback)
  1264			return first;
  1265	
  1266		/*
  1267		 * Timer was forced to stay on the current CPU to avoid
  1268		 * reprogramming on removal and enqueue. Force reprogram the
  1269		 * hardware by evaluating the new first expiring timer.
  1270		 */
  1271		hrtimer_force_reprogram(new_base->cpu_base, 1);
  1272		return 0;
  1273	}
  1274	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 9645 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [tglx-devel:hrtimer 8/12] kernel/time/hrtimer.c:1232:44: warning: suggest parentheses around comparison in operand of '|'
Date: Mon, 20 Sep 2021 07:30:01 +0800	[thread overview]
Message-ID: <202109200750.J1UMAIFx-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 5506 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git hrtimer
head:   16c372aeaca31d5d9d998466e75e845a2926685f
commit: 6161421a8190f07b3c0a52c0b62c8b3f51de6ddf [8/12] hrtimer: Avoid reprogramming when callback is running
config: um-x86_64_defconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git/commit/?id=6161421a8190f07b3c0a52c0b62c8b3f51de6ddf
        git remote add tglx-devel https://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git
        git fetch --no-tags tglx-devel hrtimer
        git checkout 6161421a8190f07b3c0a52c0b62c8b3f51de6ddf
        # save the attached .config to linux build tree
        make W=1 ARCH=um SUBARCH=x86_64

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

All warnings (new ones prefixed by >>):

   kernel/time/hrtimer.c:120:21: warning: initialized field overwritten [-Woverride-init]
     120 |  [CLOCK_REALTIME] = HRTIMER_BASE_REALTIME,
         |                     ^~~~~~~~~~~~~~~~~~~~~
   kernel/time/hrtimer.c:120:21: note: (near initialization for 'hrtimer_clock_to_base_table[0]')
   kernel/time/hrtimer.c:121:22: warning: initialized field overwritten [-Woverride-init]
     121 |  [CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC,
         |                      ^~~~~~~~~~~~~~~~~~~~~~
   kernel/time/hrtimer.c:121:22: note: (near initialization for 'hrtimer_clock_to_base_table[1]')
   kernel/time/hrtimer.c:122:21: warning: initialized field overwritten [-Woverride-init]
     122 |  [CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME,
         |                     ^~~~~~~~~~~~~~~~~~~~~
   kernel/time/hrtimer.c:122:21: note: (near initialization for 'hrtimer_clock_to_base_table[7]')
   kernel/time/hrtimer.c:123:17: warning: initialized field overwritten [-Woverride-init]
     123 |  [CLOCK_TAI]  = HRTIMER_BASE_TAI,
         |                 ^~~~~~~~~~~~~~~~
   kernel/time/hrtimer.c:123:17: note: (near initialization for 'hrtimer_clock_to_base_table[11]')
   kernel/time/hrtimer.c: In function '__hrtimer_start_range_ns':
>> kernel/time/hrtimer.c:1232:44: warning: suggest parentheses around comparison in operand of '|' [-Wparentheses]
    1232 |  force_local &= base->cpu_base->next_timer == timer | in_callback;
         |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
   kernel/time/hrtimer.c: In function '__run_hrtimer':
   kernel/time/hrtimer.c:1652:7: warning: variable 'expires_in_hardirq' set but not used [-Wunused-but-set-variable]
    1652 |  bool expires_in_hardirq;
         |       ^~~~~~~~~~~~~~~~~~


vim +1232 kernel/time/hrtimer.c

  1211	
  1212	static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
  1213					    u64 delta_ns, const enum hrtimer_mode mode,
  1214					    struct hrtimer_clock_base *base)
  1215	{
  1216		struct hrtimer_clock_base *new_base;
  1217		bool in_callback, force_local, first;
  1218	
  1219		/*
  1220		 * If the timer is on the local cpu base and is the first expiring
  1221		 * timer then this might end up reprogramming the hardware twice
  1222		 * (on removal and on enqueue). To avoid that by prevent the
  1223		 * reprogram on removal, keep the timer local to the current CPU
  1224		 * and enforce reprogramming after it is queued no matter whether
  1225		 * it is the new first expiring timer again or not.
  1226		 *
  1227		 * Also avoid reprogramming if the timer callback is currently
  1228		 * running.
  1229		 */
  1230		in_callback = base->running == timer;
  1231		force_local = base->cpu_base == this_cpu_ptr(&hrtimer_bases);
> 1232		force_local &= base->cpu_base->next_timer == timer | in_callback;
  1233	
  1234		/*
  1235		 * Remove an active timer from the queue. In case it is not queued
  1236		 * on the current CPU, make sure that remove_hrtimer() updates the
  1237		 * remote data correctly.
  1238		 *
  1239		 * If it's on the current CPU and the first expiring timer, then
  1240		 * skip reprogramming, keep the timer local and enforce
  1241		 * reprogramming later if it was the first expiring timer.  This
  1242		 * avoids programming the underlying clock event twice (once at
  1243		 * removal and once after enqueue).
  1244		 */
  1245		remove_hrtimer(timer, base, true, force_local);
  1246	
  1247		if (mode & HRTIMER_MODE_REL)
  1248			tim = ktime_add_safe(tim, base->get_time());
  1249	
  1250		tim = hrtimer_update_lowres(timer, tim, mode);
  1251	
  1252		hrtimer_set_expires_range_ns(timer, tim, delta_ns);
  1253	
  1254		/* Switch the timer base, if necessary: */
  1255		if (!force_local) {
  1256			new_base = switch_hrtimer_base(timer, base,
  1257						       mode & HRTIMER_MODE_PINNED);
  1258		} else {
  1259			new_base = base;
  1260		}
  1261	
  1262		first = enqueue_hrtimer(timer, new_base, mode);
  1263		if (!force_local || in_callback)
  1264			return first;
  1265	
  1266		/*
  1267		 * Timer was forced to stay on the current CPU to avoid
  1268		 * reprogramming on removal and enqueue. Force reprogram the
  1269		 * hardware by evaluating the new first expiring timer.
  1270		 */
  1271		hrtimer_force_reprogram(new_base->cpu_base, 1);
  1272		return 0;
  1273	}
  1274	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 9645 bytes --]

             reply	other threads:[~2021-09-19 23:30 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-19 23:30 kernel test robot [this message]
2021-09-19 23:30 ` [tglx-devel:hrtimer 8/12] kernel/time/hrtimer.c:1232:44: warning: suggest parentheses around comparison in operand of '|' kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202109200750.J1UMAIFx-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=kbuild-all@lists.01.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.