linux/kernel/time/tick-broadcast.c
<<
>>
Prefs
   1/*
   2 * linux/kernel/time/tick-broadcast.c
   3 *
   4 * This file contains functions which emulate a local clock-event
   5 * device via a broadcast event source.
   6 *
   7 * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
   8 * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
   9 * Copyright(C) 2006-2007, Timesys Corp., Thomas Gleixner
  10 *
  11 * This code is licenced under the GPL version 2. For details see
  12 * kernel-base/COPYING.
  13 */
  14#include <linux/cpu.h>
  15#include <linux/err.h>
  16#include <linux/hrtimer.h>
  17#include <linux/interrupt.h>
  18#include <linux/percpu.h>
  19#include <linux/profile.h>
  20#include <linux/sched.h>
  21#include <linux/tick.h>
  22
  23#include "tick-internal.h"
  24
  25/*
  26 * Broadcast support for broken x86 hardware, where the local apic
  27 * timer stops in C3 state.
  28 */
  29
  30static struct tick_device tick_broadcast_device;
  31/* FIXME: Use cpumask_var_t. */
  32static DECLARE_BITMAP(tick_broadcast_mask, NR_CPUS);
  33static DECLARE_BITMAP(tmpmask, NR_CPUS);
  34static DEFINE_SPINLOCK(tick_broadcast_lock);
  35static int tick_broadcast_force;
  36
  37#ifdef CONFIG_TICK_ONESHOT
  38static void tick_broadcast_clear_oneshot(int cpu);
  39#else
  40static inline void tick_broadcast_clear_oneshot(int cpu) { }
  41#endif
  42
  43/*
  44 * Debugging: see timer_list.c
  45 */
  46struct tick_device *tick_get_broadcast_device(void)
  47{
  48        return &tick_broadcast_device;
  49}
  50
  51struct cpumask *tick_get_broadcast_mask(void)
  52{
  53        return to_cpumask(tick_broadcast_mask);
  54}
  55
  56/*
  57 * Start the device in periodic mode
  58 */
  59static void tick_broadcast_start_periodic(struct clock_event_device *bc)
  60{
  61        if (bc)
  62                tick_setup_periodic(bc, 1);
  63}
  64
  65/*
  66 * Check, if the device can be utilized as broadcast device:
  67 */
  68int tick_check_broadcast_device(struct clock_event_device *dev)
  69{
  70        if ((tick_broadcast_device.evtdev &&
  71             tick_broadcast_device.evtdev->rating >= dev->rating) ||
  72             (dev->features & CLOCK_EVT_FEAT_C3STOP))
  73                return 0;
  74
  75        clockevents_exchange_device(NULL, dev);
  76        tick_broadcast_device.evtdev = dev;
  77        if (!cpumask_empty(tick_get_broadcast_mask()))
  78                tick_broadcast_start_periodic(dev);
  79        return 1;
  80}
  81
  82/*
  83 * Check, if the device is the broadcast device
  84 */
  85int tick_is_broadcast_device(struct clock_event_device *dev)
  86{
  87        return (dev && tick_broadcast_device.evtdev == dev);
  88}
  89
  90/*
  91 * Check, if the device is disfunctional and a place holder, which
  92 * needs to be handled by the broadcast device.
  93 */
  94int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu)
  95{
  96        unsigned long flags;
  97        int ret = 0;
  98
  99        spin_lock_irqsave(&tick_broadcast_lock, flags);
 100
 101        /*
 102         * Devices might be registered with both periodic and oneshot
 103         * mode disabled. This signals, that the device needs to be
 104         * operated from the broadcast device and is a placeholder for
 105         * the cpu local device.
 106         */
 107        if (!tick_device_is_functional(dev)) {
 108                dev->event_handler = tick_handle_periodic;
 109                cpumask_set_cpu(cpu, tick_get_broadcast_mask());
 110                tick_broadcast_start_periodic(tick_broadcast_device.evtdev);
 111                ret = 1;
 112        } else {
 113                /*
 114                 * When the new device is not affected by the stop
 115                 * feature and the cpu is marked in the broadcast mask
 116                 * then clear the broadcast bit.
 117                 */
 118                if (!(dev->features & CLOCK_EVT_FEAT_C3STOP)) {
 119                        int cpu = smp_processor_id();
 120
 121                        cpumask_clear_cpu(cpu, tick_get_broadcast_mask());
 122                        tick_broadcast_clear_oneshot(cpu);
 123                }
 124        }
 125        spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 126        return ret;
 127}
 128
 129/*
 130 * Broadcast the event to the cpus, which are set in the mask (mangled).
 131 */
 132static void tick_do_broadcast(struct cpumask *mask)
 133{
 134        int cpu = smp_processor_id();
 135        struct tick_device *td;
 136
 137        /*
 138         * Check, if the current cpu is in the mask
 139         */
 140        if (cpumask_test_cpu(cpu, mask)) {
 141                cpumask_clear_cpu(cpu, mask);
 142                td = &per_cpu(tick_cpu_device, cpu);
 143                td->evtdev->event_handler(td->evtdev);
 144        }
 145
 146        if (!cpumask_empty(mask)) {
 147                /*
 148                 * It might be necessary to actually check whether the devices
 149                 * have different broadcast functions. For now, just use the
 150                 * one of the first device. This works as long as we have this
 151                 * misfeature only on x86 (lapic)
 152                 */
 153                td = &per_cpu(tick_cpu_device, cpumask_first(mask));
 154                td->evtdev->broadcast(mask);
 155        }
 156}
 157
 158/*
 159 * Periodic broadcast:
 160 * - invoke the broadcast handlers
 161 */
 162static void tick_do_periodic_broadcast(void)
 163{
 164        spin_lock(&tick_broadcast_lock);
 165
 166        cpumask_and(to_cpumask(tmpmask),
 167                    cpu_online_mask, tick_get_broadcast_mask());
 168        tick_do_broadcast(to_cpumask(tmpmask));
 169
 170        spin_unlock(&tick_broadcast_lock);
 171}
 172
 173/*
 174 * Event handler for periodic broadcast ticks
 175 */
 176static void tick_handle_periodic_broadcast(struct clock_event_device *dev)
 177{
 178        ktime_t next;
 179
 180        tick_do_periodic_broadcast();
 181
 182        /*
 183         * The device is in periodic mode. No reprogramming necessary:
 184         */
 185        if (dev->mode == CLOCK_EVT_MODE_PERIODIC)
 186                return;
 187
 188        /*
 189         * Setup the next period for devices, which do not have
 190         * periodic mode. We read dev->next_event first and add to it
 191         * when the event alrady expired. clockevents_program_event()
 192         * sets dev->next_event only when the event is really
 193         * programmed to the device.
 194         */
 195        for (next = dev->next_event; ;) {
 196                next = ktime_add(next, tick_period);
 197
 198                if (!clockevents_program_event(dev, next, ktime_get()))
 199                        return;
 200                tick_do_periodic_broadcast();
 201        }
 202}
 203
 204/*
 205 * Powerstate information: The system enters/leaves a state, where
 206 * affected devices might stop
 207 */
 208static void tick_do_broadcast_on_off(unsigned long *reason)
 209{
 210        struct clock_event_device *bc, *dev;
 211        struct tick_device *td;
 212        unsigned long flags;
 213        int cpu, bc_stopped;
 214
 215        spin_lock_irqsave(&tick_broadcast_lock, flags);
 216
 217        cpu = smp_processor_id();
 218        td = &per_cpu(tick_cpu_device, cpu);
 219        dev = td->evtdev;
 220        bc = tick_broadcast_device.evtdev;
 221
 222        /*
 223         * Is the device not affected by the powerstate ?
 224         */
 225        if (!dev || !(dev->features & CLOCK_EVT_FEAT_C3STOP))
 226                goto out;
 227
 228        if (!tick_device_is_functional(dev))
 229                goto out;
 230
 231        bc_stopped = cpumask_empty(tick_get_broadcast_mask());
 232
 233        switch (*reason) {
 234        case CLOCK_EVT_NOTIFY_BROADCAST_ON:
 235        case CLOCK_EVT_NOTIFY_BROADCAST_FORCE:
 236                if (!cpumask_test_cpu(cpu, tick_get_broadcast_mask())) {
 237                        cpumask_set_cpu(cpu, tick_get_broadcast_mask());
 238                        if (tick_broadcast_device.mode ==
 239                            TICKDEV_MODE_PERIODIC)
 240                                clockevents_shutdown(dev);
 241                }
 242                if (*reason == CLOCK_EVT_NOTIFY_BROADCAST_FORCE)
 243                        tick_broadcast_force = 1;
 244                break;
 245        case CLOCK_EVT_NOTIFY_BROADCAST_OFF:
 246                if (!tick_broadcast_force &&
 247                    cpumask_test_cpu(cpu, tick_get_broadcast_mask())) {
 248                        cpumask_clear_cpu(cpu, tick_get_broadcast_mask());
 249                        if (tick_broadcast_device.mode ==
 250                            TICKDEV_MODE_PERIODIC)
 251                                tick_setup_periodic(dev, 0);
 252                }
 253                break;
 254        }
 255
 256        if (cpumask_empty(tick_get_broadcast_mask())) {
 257                if (!bc_stopped)
 258                        clockevents_shutdown(bc);
 259        } else if (bc_stopped) {
 260                if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
 261                        tick_broadcast_start_periodic(bc);
 262                else
 263                        tick_broadcast_setup_oneshot(bc);
 264        }
 265out:
 266        spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 267}
 268
 269/*
 270 * Powerstate information: The system enters/leaves a state, where
 271 * affected devices might stop.
 272 */
 273void tick_broadcast_on_off(unsigned long reason, int *oncpu)
 274{
 275        if (!cpumask_test_cpu(*oncpu, cpu_online_mask))
 276                printk(KERN_ERR "tick-broadcast: ignoring broadcast for "
 277                       "offline CPU #%d\n", *oncpu);
 278        else
 279                tick_do_broadcast_on_off(&reason);
 280}
 281
 282/*
 283 * Set the periodic handler depending on broadcast on/off
 284 */
 285void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast)
 286{
 287        if (!broadcast)
 288                dev->event_handler = tick_handle_periodic;
 289        else
 290                dev->event_handler = tick_handle_periodic_broadcast;
 291}
 292
 293/*
 294 * Remove a CPU from broadcasting
 295 */
 296void tick_shutdown_broadcast(unsigned int *cpup)
 297{
 298        struct clock_event_device *bc;
 299        unsigned long flags;
 300        unsigned int cpu = *cpup;
 301
 302        spin_lock_irqsave(&tick_broadcast_lock, flags);
 303
 304        bc = tick_broadcast_device.evtdev;
 305        cpumask_clear_cpu(cpu, tick_get_broadcast_mask());
 306
 307        if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC) {
 308                if (bc && cpumask_empty(tick_get_broadcast_mask()))
 309                        clockevents_shutdown(bc);
 310        }
 311
 312        spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 313}
 314
 315void tick_suspend_broadcast(void)
 316{
 317        struct clock_event_device *bc;
 318        unsigned long flags;
 319
 320        spin_lock_irqsave(&tick_broadcast_lock, flags);
 321
 322        bc = tick_broadcast_device.evtdev;
 323        if (bc)
 324                clockevents_shutdown(bc);
 325
 326        spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 327}
 328
 329int tick_resume_broadcast(void)
 330{
 331        struct clock_event_device *bc;
 332        unsigned long flags;
 333        int broadcast = 0;
 334
 335        spin_lock_irqsave(&tick_broadcast_lock, flags);
 336
 337        bc = tick_broadcast_device.evtdev;
 338
 339        if (bc) {
 340                clockevents_set_mode(bc, CLOCK_EVT_MODE_RESUME);
 341
 342                switch (tick_broadcast_device.mode) {
 343                case TICKDEV_MODE_PERIODIC:
 344                        if (!cpumask_empty(tick_get_broadcast_mask()))
 345                                tick_broadcast_start_periodic(bc);
 346                        broadcast = cpumask_test_cpu(smp_processor_id(),
 347                                                     tick_get_broadcast_mask());
 348                        break;
 349                case TICKDEV_MODE_ONESHOT:
 350                        broadcast = tick_resume_broadcast_oneshot(bc);
 351                        break;
 352                }
 353        }
 354        spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 355
 356        return broadcast;
 357}
 358
 359
 360#ifdef CONFIG_TICK_ONESHOT
 361
 362/* FIXME: use cpumask_var_t. */
 363static DECLARE_BITMAP(tick_broadcast_oneshot_mask, NR_CPUS);
 364
 365/*
 366 * Exposed for debugging: see timer_list.c
 367 */
 368struct cpumask *tick_get_broadcast_oneshot_mask(void)
 369{
 370        return to_cpumask(tick_broadcast_oneshot_mask);
 371}
 372
 373static int tick_broadcast_set_event(ktime_t expires, int force)
 374{
 375        struct clock_event_device *bc = tick_broadcast_device.evtdev;
 376
 377        return tick_dev_program_event(bc, expires, force);
 378}
 379
 380int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
 381{
 382        clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
 383        return 0;
 384}
 385
 386/*
 387 * Called from irq_enter() when idle was interrupted to reenable the
 388 * per cpu device.
 389 */
 390void tick_check_oneshot_broadcast(int cpu)
 391{
 392        if (cpumask_test_cpu(cpu, to_cpumask(tick_broadcast_oneshot_mask))) {
 393                struct tick_device *td = &per_cpu(tick_cpu_device, cpu);
 394
 395                clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_ONESHOT);
 396        }
 397}
 398
 399/*
 400 * Handle oneshot mode broadcasting
 401 */
 402static void tick_handle_oneshot_broadcast(struct clock_event_device *dev)
 403{
 404        struct tick_device *td;
 405        ktime_t now, next_event;
 406        int cpu;
 407
 408        spin_lock(&tick_broadcast_lock);
 409again:
 410        dev->next_event.tv64 = KTIME_MAX;
 411        next_event.tv64 = KTIME_MAX;
 412        cpumask_clear(to_cpumask(tmpmask));
 413        now = ktime_get();
 414        /* Find all expired events */
 415        for_each_cpu(cpu, tick_get_broadcast_oneshot_mask()) {
 416                td = &per_cpu(tick_cpu_device, cpu);
 417                if (td->evtdev->next_event.tv64 <= now.tv64)
 418                        cpumask_set_cpu(cpu, to_cpumask(tmpmask));
 419                else if (td->evtdev->next_event.tv64 < next_event.tv64)
 420                        next_event.tv64 = td->evtdev->next_event.tv64;
 421        }
 422
 423        /*
 424         * Wakeup the cpus which have an expired event.
 425         */
 426        tick_do_broadcast(to_cpumask(tmpmask));
 427
 428        /*
 429         * Two reasons for reprogram:
 430         *
 431         * - The global event did not expire any CPU local
 432         * events. This happens in dyntick mode, as the maximum PIT
 433         * delta is quite small.
 434         *
 435         * - There are pending events on sleeping CPUs which were not
 436         * in the event mask
 437         */
 438        if (next_event.tv64 != KTIME_MAX) {
 439                /*
 440                 * Rearm the broadcast device. If event expired,
 441                 * repeat the above
 442                 */
 443                if (tick_broadcast_set_event(next_event, 0))
 444                        goto again;
 445        }
 446        spin_unlock(&tick_broadcast_lock);
 447}
 448
 449/*
 450 * Powerstate information: The system enters/leaves a state, where
 451 * affected devices might stop
 452 */
 453void tick_broadcast_oneshot_control(unsigned long reason)
 454{
 455        struct clock_event_device *bc, *dev;
 456        struct tick_device *td;
 457        unsigned long flags;
 458        int cpu;
 459
 460        spin_lock_irqsave(&tick_broadcast_lock, flags);
 461
 462        /*
 463         * Periodic mode does not care about the enter/exit of power
 464         * states
 465         */
 466        if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
 467                goto out;
 468
 469        bc = tick_broadcast_device.evtdev;
 470        cpu = smp_processor_id();
 471        td = &per_cpu(tick_cpu_device, cpu);
 472        dev = td->evtdev;
 473
 474        if (!(dev->features & CLOCK_EVT_FEAT_C3STOP))
 475                goto out;
 476
 477        if (reason == CLOCK_EVT_NOTIFY_BROADCAST_ENTER) {
 478                if (!cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) {
 479                        cpumask_set_cpu(cpu, tick_get_broadcast_oneshot_mask());
 480                        clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN);
 481                        if (dev->next_event.tv64 < bc->next_event.tv64)
 482                                tick_broadcast_set_event(dev->next_event, 1);
 483                }
 484        } else {
 485                if (cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) {
 486                        cpumask_clear_cpu(cpu,
 487                                          tick_get_broadcast_oneshot_mask());
 488                        clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
 489                        if (dev->next_event.tv64 != KTIME_MAX)
 490                                tick_program_event(dev->next_event, 1);
 491                }
 492        }
 493
 494out:
 495        spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 496}
 497
 498/*
 499 * Reset the one shot broadcast for a cpu
 500 *
 501 * Called with tick_broadcast_lock held
 502 */
 503static void tick_broadcast_clear_oneshot(int cpu)
 504{
 505        cpumask_clear_cpu(cpu, tick_get_broadcast_oneshot_mask());
 506}
 507
 508static void tick_broadcast_init_next_event(struct cpumask *mask,
 509                                           ktime_t expires)
 510{
 511        struct tick_device *td;
 512        int cpu;
 513
 514        for_each_cpu(cpu, mask) {
 515                td = &per_cpu(tick_cpu_device, cpu);
 516                if (td->evtdev)
 517                        td->evtdev->next_event = expires;
 518        }
 519}
 520
 521/**
 522 * tick_broadcast_setup_oneshot - setup the broadcast device
 523 */
 524void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
 525{
 526        /* Set it up only once ! */
 527        if (bc->event_handler != tick_handle_oneshot_broadcast) {
 528                int was_periodic = bc->mode == CLOCK_EVT_MODE_PERIODIC;
 529                int cpu = smp_processor_id();
 530
 531                bc->event_handler = tick_handle_oneshot_broadcast;
 532                clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
 533
 534                /* Take the do_timer update */
 535                tick_do_timer_cpu = cpu;
 536
 537                /*
 538                 * We must be careful here. There might be other CPUs
 539                 * waiting for periodic broadcast. We need to set the
 540                 * oneshot_mask bits for those and program the
 541                 * broadcast device to fire.
 542                 */
 543                cpumask_copy(to_cpumask(tmpmask), tick_get_broadcast_mask());
 544                cpumask_clear_cpu(cpu, to_cpumask(tmpmask));
 545                cpumask_or(tick_get_broadcast_oneshot_mask(),
 546                           tick_get_broadcast_oneshot_mask(),
 547                           to_cpumask(tmpmask));
 548
 549                if (was_periodic && !cpumask_empty(to_cpumask(tmpmask))) {
 550                        tick_broadcast_init_next_event(to_cpumask(tmpmask),
 551                                                       tick_next_period);
 552                        tick_broadcast_set_event(tick_next_period, 1);
 553                } else
 554                        bc->next_event.tv64 = KTIME_MAX;
 555        }
 556}
 557
 558/*
 559 * Select oneshot operating mode for the broadcast device
 560 */
 561void tick_broadcast_switch_to_oneshot(void)
 562{
 563        struct clock_event_device *bc;
 564        unsigned long flags;
 565
 566        spin_lock_irqsave(&tick_broadcast_lock, flags);
 567
 568        tick_broadcast_device.mode = TICKDEV_MODE_ONESHOT;
 569        bc = tick_broadcast_device.evtdev;
 570        if (bc)
 571                tick_broadcast_setup_oneshot(bc);
 572        spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 573}
 574
 575
 576/*
 577 * Remove a dead CPU from broadcasting
 578 */
 579void tick_shutdown_broadcast_oneshot(unsigned int *cpup)
 580{
 581        unsigned long flags;
 582        unsigned int cpu = *cpup;
 583
 584        spin_lock_irqsave(&tick_broadcast_lock, flags);
 585
 586        /*
 587         * Clear the broadcast mask flag for the dead cpu, but do not
 588         * stop the broadcast device!
 589         */
 590        cpumask_clear_cpu(cpu, tick_get_broadcast_oneshot_mask());
 591
 592        spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 593}
 594
 595/*
 596 * Check, whether the broadcast device is in one shot mode
 597 */
 598int tick_broadcast_oneshot_active(void)
 599{
 600        return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT;
 601}
 602
 603#endif
 604