~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to arch/arm/kernel/perf_event.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno
  • Date: 2011-06-07 12:14:05 UTC
  • mfrom: (43.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20110607121405-i3h1rd7nrnd2b73h
Tags: 2.6.39-2
[ Ben Hutchings ]
* [x86] Enable BACKLIGHT_APPLE, replacing BACKLIGHT_MBP_NVIDIA
  (Closes: #627492)
* cgroups: Disable memory resource controller by default. Allow it
  to be enabled using kernel parameter 'cgroup_enable=memory'.
* rt2800usb: Enable support for more USB devices including
  Linksys WUSB600N (Closes: #596626) (this change was accidentally
  omitted from 2.6.39-1)
* [x86] Remove Celeron from list of processors supporting PAE. Most
  'Celeron M' models do not.
* Update debconf template translations:
  - Swedish (Martin Bagge) (Closes: #628932)
  - French (David Prévot) (Closes: #628191)
* aufs: Update for 2.6.39 (Closes: #627837)
* Add stable 2.6.39.1, including:
  - ext4: dont set PageUptodate in ext4_end_bio()
  - pata_cmd64x: fix boot crash on parisc (Closes: #622997, #622745)
  - ext3: Fix fs corruption when make_indexed_dir() fails
  - netfilter: nf_ct_sip: validate Content-Length in TCP SIP messages
  - sctp: fix race between sctp_bind_addr_free() and
    sctp_bind_addr_conflict()
  - sctp: fix memory leak of the ASCONF queue when free asoc
  - md/bitmap: fix saving of events_cleared and other state
  - cdc_acm: Fix oops when Droids MuIn LCD is connected
  - cx88: Fix conversion from BKL to fine-grained locks (Closes: #619827)
  - keys: Set cred->user_ns in key_replace_session_keyring (CVE-2011-2184)
  - tmpfs: fix race between truncate and writepage
  - nfs41: Correct offset for LAYOUTCOMMIT
  - xen/mmu: fix a race window causing leave_mm BUG()
  - ext4: fix possible use-after-free in ext4_remove_li_request()
  For the complete list of changes, see:
   http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.39.1
* Bump ABI to 2
* netfilter: Enable IP_SET, IP_SET_BITMAP_IP, IP_SET_BITMAP_IPMAC,
  IP_SET_BITMAP_PORT, IP_SET_HASH_IP, IP_SET_HASH_IPPORT,
  IP_SET_HASH_IPPORTIP, IP_SET_HASH_IPPORTNET, IP_SET_HASH_NET,
  IP_SET_HASH_NETPORT, IP_SET_LIST_SET, NETFILTER_XT_SET as modules
  (Closes: #629401)

[ Aurelien Jarno ]
* [mipsel/loongson-2f] Disable_SCSI_LPFC to workaround GCC ICE.

Show diffs side-by-side

added added

removed removed

Lines of Context:
79
79
        void            (*write_counter)(int idx, u32 val);
80
80
        void            (*start)(void);
81
81
        void            (*stop)(void);
 
82
        void            (*reset)(void *);
82
83
        const unsigned  (*cache_map)[PERF_COUNT_HW_CACHE_MAX]
83
84
                                    [PERF_COUNT_HW_CACHE_OP_MAX]
84
85
                                    [PERF_COUNT_HW_CACHE_RESULT_MAX];
204
205
static u64
205
206
armpmu_event_update(struct perf_event *event,
206
207
                    struct hw_perf_event *hwc,
207
 
                    int idx)
 
208
                    int idx, int overflow)
208
209
{
209
 
        int shift = 64 - 32;
210
 
        s64 prev_raw_count, new_raw_count;
211
 
        u64 delta;
 
210
        u64 delta, prev_raw_count, new_raw_count;
212
211
 
213
212
again:
214
213
        prev_raw_count = local64_read(&hwc->prev_count);
218
217
                             new_raw_count) != prev_raw_count)
219
218
                goto again;
220
219
 
221
 
        delta = (new_raw_count << shift) - (prev_raw_count << shift);
222
 
        delta >>= shift;
 
220
        new_raw_count &= armpmu->max_period;
 
221
        prev_raw_count &= armpmu->max_period;
 
222
 
 
223
        if (overflow)
 
224
                delta = armpmu->max_period - prev_raw_count + new_raw_count + 1;
 
225
        else
 
226
                delta = new_raw_count - prev_raw_count;
223
227
 
224
228
        local64_add(delta, &event->count);
225
229
        local64_sub(delta, &hwc->period_left);
236
240
        if (hwc->idx < 0)
237
241
                return;
238
242
 
239
 
        armpmu_event_update(event, hwc, hwc->idx);
 
243
        armpmu_event_update(event, hwc, hwc->idx, 0);
240
244
}
241
245
 
242
246
static void
254
258
        if (!(hwc->state & PERF_HES_STOPPED)) {
255
259
                armpmu->disable(hwc, hwc->idx);
256
260
                barrier(); /* why? */
257
 
                armpmu_event_update(event, hwc, hwc->idx);
 
261
                armpmu_event_update(event, hwc, hwc->idx, 0);
258
262
                hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
259
263
        }
260
264
}
377
381
        return 0;
378
382
}
379
383
 
 
384
static irqreturn_t armpmu_platform_irq(int irq, void *dev)
 
385
{
 
386
        struct arm_pmu_platdata *plat = dev_get_platdata(&pmu_device->dev);
 
387
 
 
388
        return plat->handle_irq(irq, dev, armpmu->handle_irq);
 
389
}
 
390
 
380
391
static int
381
392
armpmu_reserve_hardware(void)
382
393
{
 
394
        struct arm_pmu_platdata *plat;
 
395
        irq_handler_t handle_irq;
383
396
        int i, err = -ENODEV, irq;
384
397
 
385
398
        pmu_device = reserve_pmu(ARM_PMU_DEVICE_CPU);
390
403
 
391
404
        init_pmu(ARM_PMU_DEVICE_CPU);
392
405
 
 
406
        plat = dev_get_platdata(&pmu_device->dev);
 
407
        if (plat && plat->handle_irq)
 
408
                handle_irq = armpmu_platform_irq;
 
409
        else
 
410
                handle_irq = armpmu->handle_irq;
 
411
 
393
412
        if (pmu_device->num_resources < 1) {
394
413
                pr_err("no irqs for PMUs defined\n");
395
414
                return -ENODEV;
400
419
                if (irq < 0)
401
420
                        continue;
402
421
 
403
 
                err = request_irq(irq, armpmu->handle_irq,
 
422
                err = request_irq(irq, handle_irq,
404
423
                                  IRQF_DISABLED | IRQF_NOBALANCING,
405
424
                                  "armpmu", NULL);
406
425
                if (err) {
609
628
#include "perf_event_v6.c"
610
629
#include "perf_event_v7.c"
611
630
 
 
631
/*
 
632
 * Ensure the PMU has sane values out of reset.
 
633
 * This requires SMP to be available, so exists as a separate initcall.
 
634
 */
 
635
static int __init
 
636
armpmu_reset(void)
 
637
{
 
638
        if (armpmu && armpmu->reset)
 
639
                return on_each_cpu(armpmu->reset, NULL, 1);
 
640
        return 0;
 
641
}
 
642
arch_initcall(armpmu_reset);
 
643
 
612
644
static int __init
613
645
init_hw_perf_events(void)
614
646
{
714
746
 
715
747
        tail = (struct frame_tail __user *)regs->ARM_fp - 1;
716
748
 
717
 
        while (tail && !((unsigned long)tail & 0x3))
 
749
        while ((entry->nr < PERF_MAX_STACK_DEPTH) &&
 
750
               tail && !((unsigned long)tail & 0x3))
718
751
                tail = user_backtrace(tail, entry);
719
752
}
720
753