LCOV - code coverage report
Current view: top level - kernel/time - tick-broadcast.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 43 373 11.5 %
Date: 2021-04-22 12:43:58 Functions: 7 38 18.4 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * This file contains functions which emulate a local clock-event
       4             :  * device via a broadcast event source.
       5             :  *
       6             :  * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
       7             :  * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
       8             :  * Copyright(C) 2006-2007, Timesys Corp., Thomas Gleixner
       9             :  */
      10             : #include <linux/cpu.h>
      11             : #include <linux/err.h>
      12             : #include <linux/hrtimer.h>
      13             : #include <linux/interrupt.h>
      14             : #include <linux/percpu.h>
      15             : #include <linux/profile.h>
      16             : #include <linux/sched.h>
      17             : #include <linux/smp.h>
      18             : #include <linux/module.h>
      19             : 
      20             : #include "tick-internal.h"
      21             : 
      22             : /*
      23             :  * Broadcast support for broken x86 hardware, where the local apic
      24             :  * timer stops in C3 state.
      25             :  */
      26             : 
      27             : static struct tick_device tick_broadcast_device;
      28             : static cpumask_var_t tick_broadcast_mask __cpumask_var_read_mostly;
      29             : static cpumask_var_t tick_broadcast_on __cpumask_var_read_mostly;
      30             : static cpumask_var_t tmpmask __cpumask_var_read_mostly;
      31             : static int tick_broadcast_forced;
      32             : 
      33             : static __cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(tick_broadcast_lock);
      34             : 
      35             : #ifdef CONFIG_TICK_ONESHOT
      36             : static void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
      37             : static void tick_broadcast_clear_oneshot(int cpu);
      38             : static void tick_resume_broadcast_oneshot(struct clock_event_device *bc);
      39             : # ifdef CONFIG_HOTPLUG_CPU
      40             : static void tick_broadcast_oneshot_offline(unsigned int cpu);
      41             : # endif
      42             : #else
      43             : static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) { BUG(); }
      44             : static inline void tick_broadcast_clear_oneshot(int cpu) { }
      45             : static inline void tick_resume_broadcast_oneshot(struct clock_event_device *bc) { }
      46             : # ifdef CONFIG_HOTPLUG_CPU
      47             : static inline void tick_broadcast_oneshot_offline(unsigned int cpu) { }
      48             : # endif
      49             : #endif
      50             : 
      51             : /*
      52             :  * Debugging: see timer_list.c
      53             :  */
      54           0 : struct tick_device *tick_get_broadcast_device(void)
      55             : {
      56           0 :         return &tick_broadcast_device;
      57             : }
      58             : 
      59           0 : struct cpumask *tick_get_broadcast_mask(void)
      60             : {
      61           0 :         return tick_broadcast_mask;
      62             : }
      63             : 
      64             : /*
      65             :  * Start the device in periodic mode
      66             :  */
      67           0 : static void tick_broadcast_start_periodic(struct clock_event_device *bc)
      68             : {
      69           0 :         if (bc)
      70           0 :                 tick_setup_periodic(bc, 1);
      71           0 : }
      72             : 
      73             : /*
      74             :  * Check, if the device can be utilized as broadcast device:
      75             :  */
      76           0 : static bool tick_check_broadcast_device(struct clock_event_device *curdev,
      77             :                                         struct clock_event_device *newdev)
      78             : {
      79           0 :         if ((newdev->features & CLOCK_EVT_FEAT_DUMMY) ||
      80           0 :             (newdev->features & CLOCK_EVT_FEAT_PERCPU) ||
      81             :             (newdev->features & CLOCK_EVT_FEAT_C3STOP))
      82             :                 return false;
      83             : 
      84           0 :         if (tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT &&
      85           0 :             !(newdev->features & CLOCK_EVT_FEAT_ONESHOT))
      86             :                 return false;
      87             : 
      88           0 :         return !curdev || newdev->rating > curdev->rating;
      89             : }
      90             : 
      91             : /*
      92             :  * Conditionally install/replace broadcast device
      93             :  */
      94           0 : void tick_install_broadcast_device(struct clock_event_device *dev)
      95             : {
      96           0 :         struct clock_event_device *cur = tick_broadcast_device.evtdev;
      97             : 
      98           0 :         if (!tick_check_broadcast_device(cur, dev))
      99             :                 return;
     100             : 
     101           0 :         if (!try_module_get(dev->owner))
     102             :                 return;
     103             : 
     104           0 :         clockevents_exchange_device(cur, dev);
     105           0 :         if (cur)
     106           0 :                 cur->event_handler = clockevents_handle_noop;
     107           0 :         tick_broadcast_device.evtdev = dev;
     108           0 :         if (!cpumask_empty(tick_broadcast_mask))
     109           0 :                 tick_broadcast_start_periodic(dev);
     110             :         /*
     111             :          * Inform all cpus about this. We might be in a situation
     112             :          * where we did not switch to oneshot mode because the per cpu
     113             :          * devices are affected by CLOCK_EVT_FEAT_C3STOP and the lack
     114             :          * of a oneshot capable broadcast device. Without that
     115             :          * notification the systems stays stuck in periodic mode
     116             :          * forever.
     117             :          */
     118           0 :         if (dev->features & CLOCK_EVT_FEAT_ONESHOT)
     119           0 :                 tick_clock_notify();
     120             : }
     121             : 
     122             : /*
     123             :  * Check, if the device is the broadcast device
     124             :  */
     125           4 : int tick_is_broadcast_device(struct clock_event_device *dev)
     126             : {
     127           4 :         return (dev && tick_broadcast_device.evtdev == dev);
     128             : }
     129             : 
     130           0 : int tick_broadcast_update_freq(struct clock_event_device *dev, u32 freq)
     131             : {
     132           0 :         int ret = -ENODEV;
     133             : 
     134           0 :         if (tick_is_broadcast_device(dev)) {
     135           0 :                 raw_spin_lock(&tick_broadcast_lock);
     136           0 :                 ret = __clockevents_update_freq(dev, freq);
     137           0 :                 raw_spin_unlock(&tick_broadcast_lock);
     138             :         }
     139           0 :         return ret;
     140             : }
     141             : 
     142             : 
     143           0 : static void err_broadcast(const struct cpumask *mask)
     144             : {
     145           0 :         pr_crit_once("Failed to broadcast timer tick. Some CPUs may be unresponsive.\n");
     146           0 : }
     147             : 
     148           0 : static void tick_device_setup_broadcast_func(struct clock_event_device *dev)
     149             : {
     150           0 :         if (!dev->broadcast)
     151           0 :                 dev->broadcast = tick_broadcast;
     152           0 :         if (!dev->broadcast) {
     153           0 :                 pr_warn_once("%s depends on broadcast, but no broadcast function available\n",
     154             :                              dev->name);
     155           0 :                 dev->broadcast = err_broadcast;
     156             :         }
     157           0 : }
     158             : 
     159             : /*
     160             :  * Check, if the device is disfunctional and a place holder, which
     161             :  * needs to be handled by the broadcast device.
     162             :  */
     163           4 : int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu)
     164             : {
     165           4 :         struct clock_event_device *bc = tick_broadcast_device.evtdev;
     166           4 :         unsigned long flags;
     167           4 :         int ret = 0;
     168             : 
     169           4 :         raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
     170             : 
     171             :         /*
     172             :          * Devices might be registered with both periodic and oneshot
     173             :          * mode disabled. This signals, that the device needs to be
     174             :          * operated from the broadcast device and is a placeholder for
     175             :          * the cpu local device.
     176             :          */
     177           4 :         if (!tick_device_is_functional(dev)) {
     178           0 :                 dev->event_handler = tick_handle_periodic;
     179           0 :                 tick_device_setup_broadcast_func(dev);
     180           0 :                 cpumask_set_cpu(cpu, tick_broadcast_mask);
     181           0 :                 if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
     182           0 :                         tick_broadcast_start_periodic(bc);
     183             :                 else
     184           0 :                         tick_broadcast_setup_oneshot(bc);
     185             :                 ret = 1;
     186             :         } else {
     187             :                 /*
     188             :                  * Clear the broadcast bit for this cpu if the
     189             :                  * device is not power state affected.
     190             :                  */
     191           4 :                 if (!(dev->features & CLOCK_EVT_FEAT_C3STOP))
     192           4 :                         cpumask_clear_cpu(cpu, tick_broadcast_mask);
     193             :                 else
     194           0 :                         tick_device_setup_broadcast_func(dev);
     195             : 
     196             :                 /*
     197             :                  * Clear the broadcast bit if the CPU is not in
     198             :                  * periodic broadcast on state.
     199             :                  */
     200           4 :                 if (!cpumask_test_cpu(cpu, tick_broadcast_on))
     201           4 :                         cpumask_clear_cpu(cpu, tick_broadcast_mask);
     202             : 
     203           4 :                 switch (tick_broadcast_device.mode) {
     204           0 :                 case TICKDEV_MODE_ONESHOT:
     205             :                         /*
     206             :                          * If the system is in oneshot mode we can
     207             :                          * unconditionally clear the oneshot mask bit,
     208             :                          * because the CPU is running and therefore
     209             :                          * not in an idle state which causes the power
     210             :                          * state affected device to stop. Let the
     211             :                          * caller initialize the device.
     212             :                          */
     213           0 :                         tick_broadcast_clear_oneshot(cpu);
     214           0 :                         ret = 0;
     215           0 :                         break;
     216             : 
     217             :                 case TICKDEV_MODE_PERIODIC:
     218             :                         /*
     219             :                          * If the system is in periodic mode, check
     220             :                          * whether the broadcast device can be
     221             :                          * switched off now.
     222             :                          */
     223           4 :                         if (cpumask_empty(tick_broadcast_mask) && bc)
     224           0 :                                 clockevents_shutdown(bc);
     225             :                         /*
     226             :                          * If we kept the cpu in the broadcast mask,
     227             :                          * tell the caller to leave the per cpu device
     228             :                          * in shutdown state. The periodic interrupt
     229             :                          * is delivered by the broadcast device, if
     230             :                          * the broadcast device exists and is not
     231             :                          * hrtimer based.
     232             :                          */
     233           4 :                         if (bc && !(bc->features & CLOCK_EVT_FEAT_HRTIMER))
     234           0 :                                 ret = cpumask_test_cpu(cpu, tick_broadcast_mask);
     235             :                         break;
     236             :                 default:
     237             :                         break;
     238             :                 }
     239             :         }
     240           4 :         raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
     241           4 :         return ret;
     242             : }
     243             : 
     244             : #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
     245           0 : int tick_receive_broadcast(void)
     246             : {
     247           0 :         struct tick_device *td = this_cpu_ptr(&tick_cpu_device);
     248           0 :         struct clock_event_device *evt = td->evtdev;
     249             : 
     250           0 :         if (!evt)
     251             :                 return -ENODEV;
     252             : 
     253           0 :         if (!evt->event_handler)
     254             :                 return -EINVAL;
     255             : 
     256           0 :         evt->event_handler(evt);
     257           0 :         return 0;
     258             : }
     259             : #endif
     260             : 
     261             : /*
     262             :  * Broadcast the event to the cpus, which are set in the mask (mangled).
     263             :  */
     264           0 : static bool tick_do_broadcast(struct cpumask *mask)
     265             : {
     266           0 :         int cpu = smp_processor_id();
     267           0 :         struct tick_device *td;
     268           0 :         bool local = false;
     269             : 
     270             :         /*
     271             :          * Check, if the current cpu is in the mask
     272             :          */
     273           0 :         if (cpumask_test_cpu(cpu, mask)) {
     274           0 :                 struct clock_event_device *bc = tick_broadcast_device.evtdev;
     275             : 
     276           0 :                 cpumask_clear_cpu(cpu, mask);
     277             :                 /*
     278             :                  * We only run the local handler, if the broadcast
     279             :                  * device is not hrtimer based. Otherwise we run into
     280             :                  * a hrtimer recursion.
     281             :                  *
     282             :                  * local timer_interrupt()
     283             :                  *   local_handler()
     284             :                  *     expire_hrtimers()
     285             :                  *       bc_handler()
     286             :                  *         local_handler()
     287             :                  *           expire_hrtimers()
     288             :                  */
     289           0 :                 local = !(bc->features & CLOCK_EVT_FEAT_HRTIMER);
     290             :         }
     291             : 
     292           0 :         if (!cpumask_empty(mask)) {
     293             :                 /*
     294             :                  * It might be necessary to actually check whether the devices
     295             :                  * have different broadcast functions. For now, just use the
     296             :                  * one of the first device. This works as long as we have this
     297             :                  * misfeature only on x86 (lapic)
     298             :                  */
     299           0 :                 td = &per_cpu(tick_cpu_device, cpumask_first(mask));
     300           0 :                 td->evtdev->broadcast(mask);
     301             :         }
     302           0 :         return local;
     303             : }
     304             : 
     305             : /*
     306             :  * Periodic broadcast:
     307             :  * - invoke the broadcast handlers
     308             :  */
     309           0 : static bool tick_do_periodic_broadcast(void)
     310             : {
     311           0 :         cpumask_and(tmpmask, cpu_online_mask, tick_broadcast_mask);
     312           0 :         return tick_do_broadcast(tmpmask);
     313             : }
     314             : 
     315             : /*
     316             :  * Event handler for periodic broadcast ticks
     317             :  */
     318           0 : static void tick_handle_periodic_broadcast(struct clock_event_device *dev)
     319             : {
     320           0 :         struct tick_device *td = this_cpu_ptr(&tick_cpu_device);
     321           0 :         bool bc_local;
     322             : 
     323           0 :         raw_spin_lock(&tick_broadcast_lock);
     324             : 
     325             :         /* Handle spurious interrupts gracefully */
     326           0 :         if (clockevent_state_shutdown(tick_broadcast_device.evtdev)) {
     327           0 :                 raw_spin_unlock(&tick_broadcast_lock);
     328           0 :                 return;
     329             :         }
     330             : 
     331           0 :         bc_local = tick_do_periodic_broadcast();
     332             : 
     333           0 :         if (clockevent_state_oneshot(dev)) {
     334           0 :                 ktime_t next = ktime_add_ns(dev->next_event, TICK_NSEC);
     335             : 
     336           0 :                 clockevents_program_event(dev, next, true);
     337             :         }
     338           0 :         raw_spin_unlock(&tick_broadcast_lock);
     339             : 
     340             :         /*
     341             :          * We run the handler of the local cpu after dropping
     342             :          * tick_broadcast_lock because the handler might deadlock when
     343             :          * trying to switch to oneshot mode.
     344             :          */
     345           0 :         if (bc_local)
     346           0 :                 td->evtdev->event_handler(td->evtdev);
     347             : }
     348             : 
     349             : /**
     350             :  * tick_broadcast_control - Enable/disable or force broadcast mode
     351             :  * @mode:       The selected broadcast mode
     352             :  *
     353             :  * Called when the system enters a state where affected tick devices
     354             :  * might stop. Note: TICK_BROADCAST_FORCE cannot be undone.
     355             :  */
     356           0 : void tick_broadcast_control(enum tick_broadcast_mode mode)
     357             : {
     358           0 :         struct clock_event_device *bc, *dev;
     359           0 :         struct tick_device *td;
     360           0 :         int cpu, bc_stopped;
     361           0 :         unsigned long flags;
     362             : 
     363             :         /* Protects also the local clockevent device. */
     364           0 :         raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
     365           0 :         td = this_cpu_ptr(&tick_cpu_device);
     366           0 :         dev = td->evtdev;
     367             : 
     368             :         /*
     369             :          * Is the device not affected by the powerstate ?
     370             :          */
     371           0 :         if (!dev || !(dev->features & CLOCK_EVT_FEAT_C3STOP))
     372           0 :                 goto out;
     373             : 
     374           0 :         if (!tick_device_is_functional(dev))
     375           0 :                 goto out;
     376             : 
     377           0 :         cpu = smp_processor_id();
     378           0 :         bc = tick_broadcast_device.evtdev;
     379           0 :         bc_stopped = cpumask_empty(tick_broadcast_mask);
     380             : 
     381           0 :         switch (mode) {
     382           0 :         case TICK_BROADCAST_FORCE:
     383           0 :                 tick_broadcast_forced = 1;
     384           0 :                 fallthrough;
     385           0 :         case TICK_BROADCAST_ON:
     386           0 :                 cpumask_set_cpu(cpu, tick_broadcast_on);
     387           0 :                 if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_mask)) {
     388             :                         /*
     389             :                          * Only shutdown the cpu local device, if:
     390             :                          *
     391             :                          * - the broadcast device exists
     392             :                          * - the broadcast device is not a hrtimer based one
     393             :                          * - the broadcast device is in periodic mode to
     394             :                          *   avoid a hickup during switch to oneshot mode
     395             :                          */
     396           0 :                         if (bc && !(bc->features & CLOCK_EVT_FEAT_HRTIMER) &&
     397           0 :                             tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
     398           0 :                                 clockevents_shutdown(dev);
     399             :                 }
     400             :                 break;
     401             : 
     402           0 :         case TICK_BROADCAST_OFF:
     403           0 :                 if (tick_broadcast_forced)
     404             :                         break;
     405           0 :                 cpumask_clear_cpu(cpu, tick_broadcast_on);
     406           0 :                 if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_mask)) {
     407           0 :                         if (tick_broadcast_device.mode ==
     408             :                             TICKDEV_MODE_PERIODIC)
     409           0 :                                 tick_setup_periodic(dev, 0);
     410             :                 }
     411             :                 break;
     412             :         }
     413             : 
     414           0 :         if (bc) {
     415           0 :                 if (cpumask_empty(tick_broadcast_mask)) {
     416           0 :                         if (!bc_stopped)
     417           0 :                                 clockevents_shutdown(bc);
     418           0 :                 } else if (bc_stopped) {
     419           0 :                         if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
     420           0 :                                 tick_broadcast_start_periodic(bc);
     421             :                         else
     422           0 :                                 tick_broadcast_setup_oneshot(bc);
     423             :                 }
     424             :         }
     425           0 : out:
     426           0 :         raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
     427           0 : }
     428             : EXPORT_SYMBOL_GPL(tick_broadcast_control);
     429             : 
     430             : /*
     431             :  * Set the periodic handler depending on broadcast on/off
     432             :  */
     433           4 : void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast)
     434             : {
     435           4 :         if (!broadcast)
     436           4 :                 dev->event_handler = tick_handle_periodic;
     437             :         else
     438           0 :                 dev->event_handler = tick_handle_periodic_broadcast;
     439           4 : }
     440             : 
     441             : #ifdef CONFIG_HOTPLUG_CPU
     442           0 : static void tick_shutdown_broadcast(void)
     443             : {
     444           0 :         struct clock_event_device *bc = tick_broadcast_device.evtdev;
     445             : 
     446           0 :         if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC) {
     447           0 :                 if (bc && cpumask_empty(tick_broadcast_mask))
     448           0 :                         clockevents_shutdown(bc);
     449             :         }
     450           0 : }
     451             : 
     452             : /*
     453             :  * Remove a CPU from broadcasting
     454             :  */
     455           0 : void tick_broadcast_offline(unsigned int cpu)
     456             : {
     457           0 :         raw_spin_lock(&tick_broadcast_lock);
     458           0 :         cpumask_clear_cpu(cpu, tick_broadcast_mask);
     459           0 :         cpumask_clear_cpu(cpu, tick_broadcast_on);
     460           0 :         tick_broadcast_oneshot_offline(cpu);
     461           0 :         tick_shutdown_broadcast();
     462           0 :         raw_spin_unlock(&tick_broadcast_lock);
     463           0 : }
     464             : 
     465             : #endif
     466             : 
     467           0 : void tick_suspend_broadcast(void)
     468             : {
     469           0 :         struct clock_event_device *bc;
     470           0 :         unsigned long flags;
     471             : 
     472           0 :         raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
     473             : 
     474           0 :         bc = tick_broadcast_device.evtdev;
     475           0 :         if (bc)
     476           0 :                 clockevents_shutdown(bc);
     477             : 
     478           0 :         raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
     479           0 : }
     480             : 
     481             : /*
     482             :  * This is called from tick_resume_local() on a resuming CPU. That's
     483             :  * called from the core resume function, tick_unfreeze() and the magic XEN
     484             :  * resume hackery.
     485             :  *
     486             :  * In none of these cases the broadcast device mode can change and the
     487             :  * bit of the resuming CPU in the broadcast mask is safe as well.
     488             :  */
     489           0 : bool tick_resume_check_broadcast(void)
     490             : {
     491           0 :         if (tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT)
     492             :                 return false;
     493             :         else
     494           0 :                 return cpumask_test_cpu(smp_processor_id(), tick_broadcast_mask);
     495             : }
     496             : 
     497           0 : void tick_resume_broadcast(void)
     498             : {
     499           0 :         struct clock_event_device *bc;
     500           0 :         unsigned long flags;
     501             : 
     502           0 :         raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
     503             : 
     504           0 :         bc = tick_broadcast_device.evtdev;
     505             : 
     506           0 :         if (bc) {
     507           0 :                 clockevents_tick_resume(bc);
     508             : 
     509           0 :                 switch (tick_broadcast_device.mode) {
     510             :                 case TICKDEV_MODE_PERIODIC:
     511           0 :                         if (!cpumask_empty(tick_broadcast_mask))
     512           0 :                                 tick_broadcast_start_periodic(bc);
     513             :                         break;
     514             :                 case TICKDEV_MODE_ONESHOT:
     515           0 :                         if (!cpumask_empty(tick_broadcast_mask))
     516           0 :                                 tick_resume_broadcast_oneshot(bc);
     517             :                         break;
     518             :                 }
     519           0 :         }
     520           0 :         raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
     521           0 : }
     522             : 
     523             : #ifdef CONFIG_TICK_ONESHOT
     524             : 
     525             : static cpumask_var_t tick_broadcast_oneshot_mask __cpumask_var_read_mostly;
     526             : static cpumask_var_t tick_broadcast_pending_mask __cpumask_var_read_mostly;
     527             : static cpumask_var_t tick_broadcast_force_mask __cpumask_var_read_mostly;
     528             : 
     529             : /*
     530             :  * Exposed for debugging: see timer_list.c
     531             :  */
     532           0 : struct cpumask *tick_get_broadcast_oneshot_mask(void)
     533             : {
     534           0 :         return tick_broadcast_oneshot_mask;
     535             : }
     536             : 
     537             : /*
     538             :  * Called before going idle with interrupts disabled. Checks whether a
     539             :  * broadcast event from the other core is about to happen. We detected
     540             :  * that in tick_broadcast_oneshot_control(). The callsite can use this
     541             :  * to avoid a deep idle transition as we are about to get the
     542             :  * broadcast IPI right away.
     543             :  */
     544       18528 : int tick_check_broadcast_expired(void)
     545             : {
     546       18528 :         return cpumask_test_cpu(smp_processor_id(), tick_broadcast_force_mask);
     547             : }
     548             : 
     549             : /*
     550             :  * Set broadcast interrupt affinity
     551             :  */
     552           0 : static void tick_broadcast_set_affinity(struct clock_event_device *bc,
     553             :                                         const struct cpumask *cpumask)
     554             : {
     555           0 :         if (!(bc->features & CLOCK_EVT_FEAT_DYNIRQ))
     556             :                 return;
     557             : 
     558           0 :         if (cpumask_equal(bc->cpumask, cpumask))
     559             :                 return;
     560             : 
     561           0 :         bc->cpumask = cpumask;
     562           0 :         irq_set_affinity(bc->irq, bc->cpumask);
     563             : }
     564             : 
     565           0 : static void tick_broadcast_set_event(struct clock_event_device *bc, int cpu,
     566             :                                      ktime_t expires)
     567             : {
     568           0 :         if (!clockevent_state_oneshot(bc))
     569           0 :                 clockevents_switch_state(bc, CLOCK_EVT_STATE_ONESHOT);
     570             : 
     571           0 :         clockevents_program_event(bc, expires, 1);
     572           0 :         tick_broadcast_set_affinity(bc, cpumask_of(cpu));
     573           0 : }
     574             : 
     575           0 : static void tick_resume_broadcast_oneshot(struct clock_event_device *bc)
     576             : {
     577           0 :         clockevents_switch_state(bc, CLOCK_EVT_STATE_ONESHOT);
     578           0 : }
     579             : 
     580             : /*
     581             :  * Called from irq_enter() when idle was interrupted to reenable the
     582             :  * per cpu device.
     583             :  */
     584       16994 : void tick_check_oneshot_broadcast_this_cpu(void)
     585             : {
     586       16994 :         if (cpumask_test_cpu(smp_processor_id(), tick_broadcast_oneshot_mask)) {
     587           0 :                 struct tick_device *td = this_cpu_ptr(&tick_cpu_device);
     588             : 
     589             :                 /*
     590             :                  * We might be in the middle of switching over from
     591             :                  * periodic to oneshot. If the CPU has not yet
     592             :                  * switched over, leave the device alone.
     593             :                  */
     594           0 :                 if (td->mode == TICKDEV_MODE_ONESHOT) {
     595           0 :                         clockevents_switch_state(td->evtdev,
     596             :                                               CLOCK_EVT_STATE_ONESHOT);
     597             :                 }
     598             :         }
     599       17099 : }
     600             : 
     601             : /*
     602             :  * Handle oneshot mode broadcasting
     603             :  */
     604           0 : static void tick_handle_oneshot_broadcast(struct clock_event_device *dev)
     605             : {
     606           0 :         struct tick_device *td;
     607           0 :         ktime_t now, next_event;
     608           0 :         int cpu, next_cpu = 0;
     609           0 :         bool bc_local;
     610             : 
     611           0 :         raw_spin_lock(&tick_broadcast_lock);
     612           0 :         dev->next_event = KTIME_MAX;
     613           0 :         next_event = KTIME_MAX;
     614           0 :         cpumask_clear(tmpmask);
     615           0 :         now = ktime_get();
     616             :         /* Find all expired events */
     617           0 :         for_each_cpu(cpu, tick_broadcast_oneshot_mask) {
     618             :                 /*
     619             :                  * Required for !SMP because for_each_cpu() reports
     620             :                  * unconditionally CPU0 as set on UP kernels.
     621             :                  */
     622           0 :                 if (!IS_ENABLED(CONFIG_SMP) &&
     623             :                     cpumask_empty(tick_broadcast_oneshot_mask))
     624             :                         break;
     625             : 
     626           0 :                 td = &per_cpu(tick_cpu_device, cpu);
     627           0 :                 if (td->evtdev->next_event <= now) {
     628           0 :                         cpumask_set_cpu(cpu, tmpmask);
     629             :                         /*
     630             :                          * Mark the remote cpu in the pending mask, so
     631             :                          * it can avoid reprogramming the cpu local
     632             :                          * timer in tick_broadcast_oneshot_control().
     633             :                          */
     634           0 :                         cpumask_set_cpu(cpu, tick_broadcast_pending_mask);
     635           0 :                 } else if (td->evtdev->next_event < next_event) {
     636           0 :                         next_event = td->evtdev->next_event;
     637           0 :                         next_cpu = cpu;
     638             :                 }
     639             :         }
     640             : 
     641             :         /*
     642             :          * Remove the current cpu from the pending mask. The event is
     643             :          * delivered immediately in tick_do_broadcast() !
     644             :          */
     645           0 :         cpumask_clear_cpu(smp_processor_id(), tick_broadcast_pending_mask);
     646             : 
     647             :         /* Take care of enforced broadcast requests */
     648           0 :         cpumask_or(tmpmask, tmpmask, tick_broadcast_force_mask);
     649           0 :         cpumask_clear(tick_broadcast_force_mask);
     650             : 
     651             :         /*
     652             :          * Sanity check. Catch the case where we try to broadcast to
     653             :          * offline cpus.
     654             :          */
     655           0 :         if (WARN_ON_ONCE(!cpumask_subset(tmpmask, cpu_online_mask)))
     656           0 :                 cpumask_and(tmpmask, tmpmask, cpu_online_mask);
     657             : 
     658             :         /*
     659             :          * Wakeup the cpus which have an expired event.
     660             :          */
     661           0 :         bc_local = tick_do_broadcast(tmpmask);
     662             : 
     663             :         /*
     664             :          * Two reasons for reprogram:
     665             :          *
     666             :          * - The global event did not expire any CPU local
     667             :          * events. This happens in dyntick mode, as the maximum PIT
     668             :          * delta is quite small.
     669             :          *
     670             :          * - There are pending events on sleeping CPUs which were not
     671             :          * in the event mask
     672             :          */
     673           0 :         if (next_event != KTIME_MAX)
     674           0 :                 tick_broadcast_set_event(dev, next_cpu, next_event);
     675             : 
     676           0 :         raw_spin_unlock(&tick_broadcast_lock);
     677             : 
     678           0 :         if (bc_local) {
     679           0 :                 td = this_cpu_ptr(&tick_cpu_device);
     680           0 :                 td->evtdev->event_handler(td->evtdev);
     681             :         }
     682           0 : }
     683             : 
     684           0 : static int broadcast_needs_cpu(struct clock_event_device *bc, int cpu)
     685             : {
     686           0 :         if (!(bc->features & CLOCK_EVT_FEAT_HRTIMER))
     687             :                 return 0;
     688           0 :         if (bc->next_event == KTIME_MAX)
     689             :                 return 0;
     690           0 :         return bc->bound_on == cpu ? -EBUSY : 0;
     691             : }
     692             : 
     693           0 : static void broadcast_shutdown_local(struct clock_event_device *bc,
     694             :                                      struct clock_event_device *dev)
     695             : {
     696             :         /*
     697             :          * For hrtimer based broadcasting we cannot shutdown the cpu
     698             :          * local device if our own event is the first one to expire or
     699             :          * if we own the broadcast timer.
     700             :          */
     701           0 :         if (bc->features & CLOCK_EVT_FEAT_HRTIMER) {
     702           0 :                 if (broadcast_needs_cpu(bc, smp_processor_id()))
     703             :                         return;
     704           0 :                 if (dev->next_event < bc->next_event)
     705             :                         return;
     706             :         }
     707           0 :         clockevents_switch_state(dev, CLOCK_EVT_STATE_SHUTDOWN);
     708             : }
     709             : 
     710           0 : int __tick_broadcast_oneshot_control(enum tick_broadcast_state state)
     711             : {
     712           0 :         struct clock_event_device *bc, *dev;
     713           0 :         int cpu, ret = 0;
     714           0 :         ktime_t now;
     715             : 
     716             :         /*
     717             :          * If there is no broadcast device, tell the caller not to go
     718             :          * into deep idle.
     719             :          */
     720           0 :         if (!tick_broadcast_device.evtdev)
     721             :                 return -EBUSY;
     722             : 
     723           0 :         dev = this_cpu_ptr(&tick_cpu_device)->evtdev;
     724             : 
     725           0 :         raw_spin_lock(&tick_broadcast_lock);
     726           0 :         bc = tick_broadcast_device.evtdev;
     727           0 :         cpu = smp_processor_id();
     728             : 
     729           0 :         if (state == TICK_BROADCAST_ENTER) {
     730             :                 /*
     731             :                  * If the current CPU owns the hrtimer broadcast
     732             :                  * mechanism, it cannot go deep idle and we do not add
     733             :                  * the CPU to the broadcast mask. We don't have to go
     734             :                  * through the EXIT path as the local timer is not
     735             :                  * shutdown.
     736             :                  */
     737           0 :                 ret = broadcast_needs_cpu(bc, cpu);
     738           0 :                 if (ret)
     739           0 :                         goto out;
     740             : 
     741             :                 /*
     742             :                  * If the broadcast device is in periodic mode, we
     743             :                  * return.
     744             :                  */
     745           0 :                 if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC) {
     746             :                         /* If it is a hrtimer based broadcast, return busy */
     747           0 :                         if (bc->features & CLOCK_EVT_FEAT_HRTIMER)
     748           0 :                                 ret = -EBUSY;
     749           0 :                         goto out;
     750             :                 }
     751             : 
     752           0 :                 if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_oneshot_mask)) {
     753           0 :                         WARN_ON_ONCE(cpumask_test_cpu(cpu, tick_broadcast_pending_mask));
     754             : 
     755             :                         /* Conditionally shut down the local timer. */
     756           0 :                         broadcast_shutdown_local(bc, dev);
     757             : 
     758             :                         /*
     759             :                          * We only reprogram the broadcast timer if we
     760             :                          * did not mark ourself in the force mask and
     761             :                          * if the cpu local event is earlier than the
     762             :                          * broadcast event. If the current CPU is in
     763             :                          * the force mask, then we are going to be
     764             :                          * woken by the IPI right away; we return
     765             :                          * busy, so the CPU does not try to go deep
     766             :                          * idle.
     767             :                          */
     768           0 :                         if (cpumask_test_cpu(cpu, tick_broadcast_force_mask)) {
     769             :                                 ret = -EBUSY;
     770           0 :                         } else if (dev->next_event < bc->next_event) {
     771           0 :                                 tick_broadcast_set_event(bc, cpu, dev->next_event);
     772             :                                 /*
     773             :                                  * In case of hrtimer broadcasts the
     774             :                                  * programming might have moved the
     775             :                                  * timer to this cpu. If yes, remove
     776             :                                  * us from the broadcast mask and
     777             :                                  * return busy.
     778             :                                  */
     779           0 :                                 ret = broadcast_needs_cpu(bc, cpu);
     780           0 :                                 if (ret) {
     781           0 :                                         cpumask_clear_cpu(cpu,
     782             :                                                 tick_broadcast_oneshot_mask);
     783             :                                 }
     784             :                         }
     785             :                 }
     786             :         } else {
     787           0 :                 if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) {
     788           0 :                         clockevents_switch_state(dev, CLOCK_EVT_STATE_ONESHOT);
     789             :                         /*
     790             :                          * The cpu which was handling the broadcast
     791             :                          * timer marked this cpu in the broadcast
     792             :                          * pending mask and fired the broadcast
     793             :                          * IPI. So we are going to handle the expired
     794             :                          * event anyway via the broadcast IPI
     795             :                          * handler. No need to reprogram the timer
     796             :                          * with an already expired event.
     797             :                          */
     798           0 :                         if (cpumask_test_and_clear_cpu(cpu,
     799             :                                        tick_broadcast_pending_mask))
     800           0 :                                 goto out;
     801             : 
     802             :                         /*
     803             :                          * Bail out if there is no next event.
     804             :                          */
     805           0 :                         if (dev->next_event == KTIME_MAX)
     806           0 :                                 goto out;
     807             :                         /*
     808             :                          * If the pending bit is not set, then we are
     809             :                          * either the CPU handling the broadcast
     810             :                          * interrupt or we got woken by something else.
     811             :                          *
     812             :                          * We are no longer in the broadcast mask, so
     813             :                          * if the cpu local expiry time is already
     814             :                          * reached, we would reprogram the cpu local
     815             :                          * timer with an already expired event.
     816             :                          *
     817             :                          * This can lead to a ping-pong when we return
     818             :                          * to idle and therefore rearm the broadcast
     819             :                          * timer before the cpu local timer was able
     820             :                          * to fire. This happens because the forced
     821             :                          * reprogramming makes sure that the event
     822             :                          * will happen in the future and depending on
     823             :                          * the min_delta setting this might be far
     824             :                          * enough out that the ping-pong starts.
     825             :                          *
     826             :                          * If the cpu local next_event has expired
     827             :                          * then we know that the broadcast timer
     828             :                          * next_event has expired as well and
     829             :                          * broadcast is about to be handled. So we
     830             :                          * avoid reprogramming and enforce that the
     831             :                          * broadcast handler, which did not run yet,
     832             :                          * will invoke the cpu local handler.
     833             :                          *
     834             :                          * We cannot call the handler directly from
     835             :                          * here, because we might be in a NOHZ phase
     836             :                          * and we did not go through the irq_enter()
     837             :                          * nohz fixups.
     838             :                          */
     839           0 :                         now = ktime_get();
     840           0 :                         if (dev->next_event <= now) {
     841           0 :                                 cpumask_set_cpu(cpu, tick_broadcast_force_mask);
     842           0 :                                 goto out;
     843             :                         }
     844             :                         /*
     845             :                          * We got woken by something else. Reprogram
     846             :                          * the cpu local timer device.
     847             :                          */
     848           0 :                         tick_program_event(dev->next_event, 1);
     849             :                 }
     850             :         }
     851           0 : out:
     852           0 :         raw_spin_unlock(&tick_broadcast_lock);
     853           0 :         return ret;
     854             : }
     855             : 
     856             : /*
     857             :  * Reset the one shot broadcast for a cpu
     858             :  *
     859             :  * Called with tick_broadcast_lock held
     860             :  */
     861           0 : static void tick_broadcast_clear_oneshot(int cpu)
     862             : {
     863           0 :         cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask);
     864           0 :         cpumask_clear_cpu(cpu, tick_broadcast_pending_mask);
     865           0 : }
     866             : 
     867           0 : static void tick_broadcast_init_next_event(struct cpumask *mask,
     868             :                                            ktime_t expires)
     869             : {
     870           0 :         struct tick_device *td;
     871           0 :         int cpu;
     872             : 
     873           0 :         for_each_cpu(cpu, mask) {
     874           0 :                 td = &per_cpu(tick_cpu_device, cpu);
     875           0 :                 if (td->evtdev)
     876           0 :                         td->evtdev->next_event = expires;
     877             :         }
     878           0 : }
     879             : 
     880           0 : static inline ktime_t tick_get_next_period(void)
     881             : {
     882           0 :         ktime_t next;
     883             : 
     884             :         /*
     885             :          * Protect against concurrent updates (store /load tearing on
     886             :          * 32bit). It does not matter if the time is already in the
     887             :          * past. The broadcast device which is about to be programmed will
     888             :          * fire in any case.
     889             :          */
     890           0 :         raw_spin_lock(&jiffies_lock);
     891           0 :         next = tick_next_period;
     892           0 :         raw_spin_unlock(&jiffies_lock);
     893           0 :         return next;
     894             : }
     895             : 
     896             : /**
     897             :  * tick_broadcast_setup_oneshot - setup the broadcast device
     898             :  */
     899           0 : static void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
     900             : {
     901           0 :         int cpu = smp_processor_id();
     902             : 
     903           0 :         if (!bc)
     904             :                 return;
     905             : 
     906             :         /* Set it up only once ! */
     907           0 :         if (bc->event_handler != tick_handle_oneshot_broadcast) {
     908           0 :                 int was_periodic = clockevent_state_periodic(bc);
     909             : 
     910           0 :                 bc->event_handler = tick_handle_oneshot_broadcast;
     911             : 
     912             :                 /*
     913             :                  * We must be careful here. There might be other CPUs
     914             :                  * waiting for periodic broadcast. We need to set the
     915             :                  * oneshot_mask bits for those and program the
     916             :                  * broadcast device to fire.
     917             :                  */
     918           0 :                 cpumask_copy(tmpmask, tick_broadcast_mask);
     919           0 :                 cpumask_clear_cpu(cpu, tmpmask);
     920           0 :                 cpumask_or(tick_broadcast_oneshot_mask,
     921             :                            tick_broadcast_oneshot_mask, tmpmask);
     922             : 
     923           0 :                 if (was_periodic && !cpumask_empty(tmpmask)) {
     924           0 :                         ktime_t nextevt = tick_get_next_period();
     925             : 
     926           0 :                         clockevents_switch_state(bc, CLOCK_EVT_STATE_ONESHOT);
     927           0 :                         tick_broadcast_init_next_event(tmpmask, nextevt);
     928           0 :                         tick_broadcast_set_event(bc, cpu, nextevt);
     929             :                 } else
     930           0 :                         bc->next_event = KTIME_MAX;
     931             :         } else {
     932             :                 /*
     933             :                  * The first cpu which switches to oneshot mode sets
     934             :                  * the bit for all other cpus which are in the general
     935             :                  * (periodic) broadcast mask. So the bit is set and
     936             :                  * would prevent the first broadcast enter after this
     937             :                  * to program the bc device.
     938             :                  */
     939           0 :                 tick_broadcast_clear_oneshot(cpu);
     940             :         }
     941             : }
     942             : 
     943             : /*
     944             :  * Select oneshot operating mode for the broadcast device
     945             :  */
     946           4 : void tick_broadcast_switch_to_oneshot(void)
     947             : {
     948           4 :         struct clock_event_device *bc;
     949           4 :         unsigned long flags;
     950             : 
     951           4 :         raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
     952             : 
     953           4 :         tick_broadcast_device.mode = TICKDEV_MODE_ONESHOT;
     954           4 :         bc = tick_broadcast_device.evtdev;
     955           4 :         if (bc)
     956           0 :                 tick_broadcast_setup_oneshot(bc);
     957             : 
     958           4 :         raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
     959           4 : }
     960             : 
     961             : #ifdef CONFIG_HOTPLUG_CPU
     962           0 : void hotplug_cpu__broadcast_tick_pull(int deadcpu)
     963             : {
     964           0 :         struct clock_event_device *bc;
     965           0 :         unsigned long flags;
     966             : 
     967           0 :         raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
     968           0 :         bc = tick_broadcast_device.evtdev;
     969             : 
     970           0 :         if (bc && broadcast_needs_cpu(bc, deadcpu)) {
     971             :                 /* This moves the broadcast assignment to this CPU: */
     972           0 :                 clockevents_program_event(bc, bc->next_event, 1);
     973             :         }
     974           0 :         raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
     975           0 : }
     976             : 
     977             : /*
     978             :  * Remove a dying CPU from broadcasting
     979             :  */
     980           0 : static void tick_broadcast_oneshot_offline(unsigned int cpu)
     981             : {
     982             :         /*
     983             :          * Clear the broadcast masks for the dead cpu, but do not stop
     984             :          * the broadcast device!
     985             :          */
     986           0 :         cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask);
     987           0 :         cpumask_clear_cpu(cpu, tick_broadcast_pending_mask);
     988           0 :         cpumask_clear_cpu(cpu, tick_broadcast_force_mask);
     989           0 : }
     990             : #endif
     991             : 
     992             : /*
     993             :  * Check, whether the broadcast device is in one shot mode
     994             :  */
     995           0 : int tick_broadcast_oneshot_active(void)
     996             : {
     997           0 :         return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT;
     998             : }
     999             : 
    1000             : /*
    1001             :  * Check whether the broadcast device supports oneshot.
    1002             :  */
    1003           0 : bool tick_broadcast_oneshot_available(void)
    1004             : {
    1005           0 :         struct clock_event_device *bc = tick_broadcast_device.evtdev;
    1006             : 
    1007           0 :         return bc ? bc->features & CLOCK_EVT_FEAT_ONESHOT : false;
    1008             : }
    1009             : 
    1010             : #else
    1011             : int __tick_broadcast_oneshot_control(enum tick_broadcast_state state)
    1012             : {
    1013             :         struct clock_event_device *bc = tick_broadcast_device.evtdev;
    1014             : 
    1015             :         if (!bc || (bc->features & CLOCK_EVT_FEAT_HRTIMER))
    1016             :                 return -EBUSY;
    1017             : 
    1018             :         return 0;
    1019             : }
    1020             : #endif
    1021             : 
    1022           1 : void __init tick_broadcast_init(void)
    1023             : {
    1024           1 :         zalloc_cpumask_var(&tick_broadcast_mask, GFP_NOWAIT);
    1025           1 :         zalloc_cpumask_var(&tick_broadcast_on, GFP_NOWAIT);
    1026           1 :         zalloc_cpumask_var(&tmpmask, GFP_NOWAIT);
    1027             : #ifdef CONFIG_TICK_ONESHOT
    1028           1 :         zalloc_cpumask_var(&tick_broadcast_oneshot_mask, GFP_NOWAIT);
    1029           1 :         zalloc_cpumask_var(&tick_broadcast_pending_mask, GFP_NOWAIT);
    1030           1 :         zalloc_cpumask_var(&tick_broadcast_force_mask, GFP_NOWAIT);
    1031             : #endif
    1032           1 : }

Generated by: LCOV version 1.14