linux/arch/s390/oprofile/hwsampler.c
<<
>>
Prefs
   1/*
   2 * Copyright IBM Corp. 2010
   3 * Author: Heinz Graalfs <graalfs@de.ibm.com>
   4 */
   5
   6#include <linux/kernel_stat.h>
   7#include <linux/kernel.h>
   8#include <linux/module.h>
   9#include <linux/smp.h>
  10#include <linux/errno.h>
  11#include <linux/workqueue.h>
  12#include <linux/interrupt.h>
  13#include <linux/notifier.h>
  14#include <linux/cpu.h>
  15#include <linux/semaphore.h>
  16#include <linux/oom.h>
  17#include <linux/oprofile.h>
  18
  19#include <asm/facility.h>
  20#include <asm/cpu_mf.h>
  21#include <asm/irq.h>
  22
  23#include "hwsampler.h"
  24#include "op_counter.h"
  25
  26#define MAX_NUM_SDB 511
  27#define MIN_NUM_SDB 1
  28
  29DECLARE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer);
  30
  31struct hws_execute_parms {
  32        void *buffer;
  33        signed int rc;
  34};
  35
  36DEFINE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer);
  37EXPORT_PER_CPU_SYMBOL(sampler_cpu_buffer);
  38
  39static DEFINE_MUTEX(hws_sem);
  40static DEFINE_MUTEX(hws_sem_oom);
  41
  42static unsigned char hws_flush_all;
  43static unsigned int hws_oom;
  44static unsigned int hws_alert;
  45static struct workqueue_struct *hws_wq;
  46
  47static unsigned int hws_state;
  48enum {
  49        HWS_INIT = 1,
  50        HWS_DEALLOCATED,
  51        HWS_STOPPED,
  52        HWS_STARTED,
  53        HWS_STOPPING };
  54
  55/* set to 1 if called by kernel during memory allocation */
  56static unsigned char oom_killer_was_active;
  57/* size of SDBT and SDB as of allocate API */
  58static unsigned long num_sdbt = 100;
  59static unsigned long num_sdb = 511;
  60/* sampling interval (machine cycles) */
  61static unsigned long interval;
  62
  63static unsigned long min_sampler_rate;
  64static unsigned long max_sampler_rate;
  65
  66static void execute_qsi(void *parms)
  67{
  68        struct hws_execute_parms *ep = parms;
  69
  70        ep->rc = qsi(ep->buffer);
  71}
  72
  73static void execute_ssctl(void *parms)
  74{
  75        struct hws_execute_parms *ep = parms;
  76
  77        ep->rc = lsctl(ep->buffer);
  78}
  79
  80static int smp_ctl_ssctl_stop(int cpu)
  81{
  82        int rc;
  83        struct hws_execute_parms ep;
  84        struct hws_cpu_buffer *cb;
  85
  86        cb = &per_cpu(sampler_cpu_buffer, cpu);
  87
  88        cb->ssctl.es = 0;
  89        cb->ssctl.cs = 0;
  90
  91        ep.buffer = &cb->ssctl;
  92        smp_call_function_single(cpu, execute_ssctl, &ep, 1);
  93        rc = ep.rc;
  94        if (rc) {
  95                printk(KERN_ERR "hwsampler: CPU %d CPUMF SSCTL failed.\n", cpu);
  96                dump_stack();
  97        }
  98
  99        ep.buffer = &cb->qsi;
 100        smp_call_function_single(cpu, execute_qsi, &ep, 1);
 101
 102        if (cb->qsi.es || cb->qsi.cs) {
 103                printk(KERN_EMERG "CPUMF sampling did not stop properly.\n");
 104                dump_stack();
 105        }
 106
 107        return rc;
 108}
 109
 110static int smp_ctl_ssctl_deactivate(int cpu)
 111{
 112        int rc;
 113        struct hws_execute_parms ep;
 114        struct hws_cpu_buffer *cb;
 115
 116        cb = &per_cpu(sampler_cpu_buffer, cpu);
 117
 118        cb->ssctl.es = 1;
 119        cb->ssctl.cs = 0;
 120
 121        ep.buffer = &cb->ssctl;
 122        smp_call_function_single(cpu, execute_ssctl, &ep, 1);
 123        rc = ep.rc;
 124        if (rc)
 125                printk(KERN_ERR "hwsampler: CPU %d CPUMF SSCTL failed.\n", cpu);
 126
 127        ep.buffer = &cb->qsi;
 128        smp_call_function_single(cpu, execute_qsi, &ep, 1);
 129
 130        if (cb->qsi.cs)
 131                printk(KERN_EMERG "CPUMF sampling was not set inactive.\n");
 132
 133        return rc;
 134}
 135
 136static int smp_ctl_ssctl_enable_activate(int cpu, unsigned long interval)
 137{
 138        int rc;
 139        struct hws_execute_parms ep;
 140        struct hws_cpu_buffer *cb;
 141
 142        cb = &per_cpu(sampler_cpu_buffer, cpu);
 143
 144        cb->ssctl.h = 1;
 145        cb->ssctl.tear = cb->first_sdbt;
 146        cb->ssctl.dear = *(unsigned long *) cb->first_sdbt;
 147        cb->ssctl.interval = interval;
 148        cb->ssctl.es = 1;
 149        cb->ssctl.cs = 1;
 150
 151        ep.buffer = &cb->ssctl;
 152        smp_call_function_single(cpu, execute_ssctl, &ep, 1);
 153        rc = ep.rc;
 154        if (rc)
 155                printk(KERN_ERR "hwsampler: CPU %d CPUMF SSCTL failed.\n", cpu);
 156
 157        ep.buffer = &cb->qsi;
 158        smp_call_function_single(cpu, execute_qsi, &ep, 1);
 159        if (ep.rc)
 160                printk(KERN_ERR "hwsampler: CPU %d CPUMF QSI failed.\n", cpu);
 161
 162        return rc;
 163}
 164
 165static int smp_ctl_qsi(int cpu)
 166{
 167        struct hws_execute_parms ep;
 168        struct hws_cpu_buffer *cb;
 169
 170        cb = &per_cpu(sampler_cpu_buffer, cpu);
 171
 172        ep.buffer = &cb->qsi;
 173        smp_call_function_single(cpu, execute_qsi, &ep, 1);
 174
 175        return ep.rc;
 176}
 177
 178static void hws_ext_handler(struct ext_code ext_code,
 179                            unsigned int param32, unsigned long param64)
 180{
 181        struct hws_cpu_buffer *cb = this_cpu_ptr(&sampler_cpu_buffer);
 182
 183        if (!(param32 & CPU_MF_INT_SF_MASK))
 184                return;
 185
 186        if (!hws_alert)
 187                return;
 188
 189        inc_irq_stat(IRQEXT_CMS);
 190        atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);
 191
 192        if (hws_wq)
 193                queue_work(hws_wq, &cb->worker);
 194}
 195
 196static void worker(struct work_struct *work);
 197
 198static void add_samples_to_oprofile(unsigned cpu, unsigned long *,
 199                                unsigned long *dear);
 200
 201static void init_all_cpu_buffers(void)
 202{
 203        int cpu;
 204        struct hws_cpu_buffer *cb;
 205
 206        for_each_online_cpu(cpu) {
 207                cb = &per_cpu(sampler_cpu_buffer, cpu);
 208                memset(cb, 0, sizeof(struct hws_cpu_buffer));
 209        }
 210}
 211
 212static void prepare_cpu_buffers(void)
 213{
 214        struct hws_cpu_buffer *cb;
 215        int cpu;
 216
 217        for_each_online_cpu(cpu) {
 218                cb = &per_cpu(sampler_cpu_buffer, cpu);
 219                atomic_set(&cb->ext_params, 0);
 220                cb->worker_entry = 0;
 221                cb->sample_overflow = 0;
 222                cb->req_alert = 0;
 223                cb->incorrect_sdbt_entry = 0;
 224                cb->invalid_entry_address = 0;
 225                cb->loss_of_sample_data = 0;
 226                cb->sample_auth_change_alert = 0;
 227                cb->finish = 0;
 228                cb->oom = 0;
 229                cb->stop_mode = 0;
 230        }
 231}
 232
 233/*
 234 * allocate_sdbt() - allocate sampler memory
 235 * @cpu: the cpu for which sampler memory is allocated
 236 *
 237 * A 4K page is allocated for each requested SDBT.
 238 * A maximum of 511 4K pages are allocated for the SDBs in each of the SDBTs.
 239 * Set ALERT_REQ mask in each SDBs trailer.
 240 * Returns zero if successful, <0 otherwise.
 241 */
 242static int allocate_sdbt(int cpu)
 243{
 244        int j, k, rc;
 245        unsigned long *sdbt;
 246        unsigned long  sdb;
 247        unsigned long *tail;
 248        unsigned long *trailer;
 249        struct hws_cpu_buffer *cb;
 250
 251        cb = &per_cpu(sampler_cpu_buffer, cpu);
 252
 253        if (cb->first_sdbt)
 254                return -EINVAL;
 255
 256        sdbt = NULL;
 257        tail = sdbt;
 258
 259        for (j = 0; j < num_sdbt; j++) {
 260                sdbt = (unsigned long *)get_zeroed_page(GFP_KERNEL);
 261
 262                mutex_lock(&hws_sem_oom);
 263                /* OOM killer might have been activated */
 264                barrier();
 265                if (oom_killer_was_active || !sdbt) {
 266                        if (sdbt)
 267                                free_page((unsigned long)sdbt);
 268
 269                        goto allocate_sdbt_error;
 270                }
 271                if (cb->first_sdbt == 0)
 272                        cb->first_sdbt = (unsigned long)sdbt;
 273
 274                /* link current page to tail of chain */
 275                if (tail)
 276                        *tail = (unsigned long)(void *)sdbt + 1;
 277
 278                mutex_unlock(&hws_sem_oom);
 279
 280                for (k = 0; k < num_sdb; k++) {
 281                        /* get and set SDB page */
 282                        sdb = get_zeroed_page(GFP_KERNEL);
 283
 284                        mutex_lock(&hws_sem_oom);
 285                        /* OOM killer might have been activated */
 286                        barrier();
 287                        if (oom_killer_was_active || !sdb) {
 288                                if (sdb)
 289                                        free_page(sdb);
 290
 291                                goto allocate_sdbt_error;
 292                        }
 293                        *sdbt = sdb;
 294                        trailer = trailer_entry_ptr(*sdbt);
 295                        *trailer = SDB_TE_ALERT_REQ_MASK;
 296                        sdbt++;
 297                        mutex_unlock(&hws_sem_oom);
 298                }
 299                tail = sdbt;
 300        }
 301        mutex_lock(&hws_sem_oom);
 302        if (oom_killer_was_active)
 303                goto allocate_sdbt_error;
 304
 305        rc = 0;
 306        if (tail)
 307                *tail = (unsigned long)
 308                        ((void *)cb->first_sdbt) + 1;
 309
 310allocate_sdbt_exit:
 311        mutex_unlock(&hws_sem_oom);
 312        return rc;
 313
 314allocate_sdbt_error:
 315        rc = -ENOMEM;
 316        goto allocate_sdbt_exit;
 317}
 318
 319/*
 320 * deallocate_sdbt() - deallocate all sampler memory
 321 *
 322 * For each online CPU all SDBT trees are deallocated.
 323 * Returns the number of freed pages.
 324 */
 325static int deallocate_sdbt(void)
 326{
 327        int cpu;
 328        int counter;
 329
 330        counter = 0;
 331
 332        for_each_online_cpu(cpu) {
 333                unsigned long start;
 334                unsigned long sdbt;
 335                unsigned long *curr;
 336                struct hws_cpu_buffer *cb;
 337
 338                cb = &per_cpu(sampler_cpu_buffer, cpu);
 339
 340                if (!cb->first_sdbt)
 341                        continue;
 342
 343                sdbt = cb->first_sdbt;
 344                curr = (unsigned long *) sdbt;
 345                start = sdbt;
 346
 347                /* we'll free the SDBT after all SDBs are processed... */
 348                while (1) {
 349                        if (!*curr || !sdbt)
 350                                break;
 351
 352                        /* watch for link entry reset if found */
 353                        if (is_link_entry(curr)) {
 354                                curr = get_next_sdbt(curr);
 355                                if (sdbt)
 356                                        free_page(sdbt);
 357
 358                                /* we are done if we reach the start */
 359                                if ((unsigned long) curr == start)
 360                                        break;
 361                                else
 362                                        sdbt = (unsigned long) curr;
 363                        } else {
 364                                /* process SDB pointer */
 365                                if (*curr) {
 366                                        free_page(*curr);
 367                                        curr++;
 368                                }
 369                        }
 370                        counter++;
 371                }
 372                cb->first_sdbt = 0;
 373        }
 374        return counter;
 375}
 376
 377static int start_sampling(int cpu)
 378{
 379        int rc;
 380        struct hws_cpu_buffer *cb;
 381
 382        cb = &per_cpu(sampler_cpu_buffer, cpu);
 383        rc = smp_ctl_ssctl_enable_activate(cpu, interval);
 384        if (rc) {
 385                printk(KERN_INFO "hwsampler: CPU %d ssctl failed.\n", cpu);
 386                goto start_exit;
 387        }
 388
 389        rc = -EINVAL;
 390        if (!cb->qsi.es) {
 391                printk(KERN_INFO "hwsampler: CPU %d ssctl not enabled.\n", cpu);
 392                goto start_exit;
 393        }
 394
 395        if (!cb->qsi.cs) {
 396                printk(KERN_INFO "hwsampler: CPU %d ssctl not active.\n", cpu);
 397                goto start_exit;
 398        }
 399
 400        printk(KERN_INFO
 401                "hwsampler: CPU %d, CPUMF Sampling started, interval %lu.\n",
 402                cpu, interval);
 403
 404        rc = 0;
 405
 406start_exit:
 407        return rc;
 408}
 409
 410static int stop_sampling(int cpu)
 411{
 412        unsigned long v;
 413        int rc;
 414        struct hws_cpu_buffer *cb;
 415
 416        rc = smp_ctl_qsi(cpu);
 417        WARN_ON(rc);
 418
 419        cb = &per_cpu(sampler_cpu_buffer, cpu);
 420        if (!rc && !cb->qsi.es)
 421                printk(KERN_INFO "hwsampler: CPU %d, already stopped.\n", cpu);
 422
 423        rc = smp_ctl_ssctl_stop(cpu);
 424        if (rc) {
 425                printk(KERN_INFO "hwsampler: CPU %d, ssctl stop error %d.\n",
 426                                cpu, rc);
 427                goto stop_exit;
 428        }
 429
 430        printk(KERN_INFO "hwsampler: CPU %d, CPUMF Sampling stopped.\n", cpu);
 431
 432stop_exit:
 433        v = cb->req_alert;
 434        if (v)
 435                printk(KERN_ERR "hwsampler: CPU %d CPUMF Request alert,"
 436                                " count=%lu.\n", cpu, v);
 437
 438        v = cb->loss_of_sample_data;
 439        if (v)
 440                printk(KERN_ERR "hwsampler: CPU %d CPUMF Loss of sample data,"
 441                                " count=%lu.\n", cpu, v);
 442
 443        v = cb->invalid_entry_address;
 444        if (v)
 445                printk(KERN_ERR "hwsampler: CPU %d CPUMF Invalid entry address,"
 446                                " count=%lu.\n", cpu, v);
 447
 448        v = cb->incorrect_sdbt_entry;
 449        if (v)
 450                printk(KERN_ERR
 451                                "hwsampler: CPU %d CPUMF Incorrect SDBT address,"
 452                                " count=%lu.\n", cpu, v);
 453
 454        v = cb->sample_auth_change_alert;
 455        if (v)
 456                printk(KERN_ERR
 457                                "hwsampler: CPU %d CPUMF Sample authorization change,"
 458                                " count=%lu.\n", cpu, v);
 459
 460        return rc;
 461}
 462
 463static int check_hardware_prerequisites(void)
 464{
 465        if (!test_facility(68))
 466                return -EOPNOTSUPP;
 467        return 0;
 468}
 469/*
 470 * hws_oom_callback() - the OOM callback function
 471 *
 472 * In case the callback is invoked during memory allocation for the
 473 *  hw sampler, all obtained memory is deallocated and a flag is set
 474 *  so main sampler memory allocation can exit with a failure code.
 475 * In case the callback is invoked during sampling the hw sampler
 476 *  is deactivated for all CPUs.
 477 */
 478static int hws_oom_callback(struct notifier_block *nfb,
 479        unsigned long dummy, void *parm)
 480{
 481        unsigned long *freed;
 482        int cpu;
 483        struct hws_cpu_buffer *cb;
 484
 485        freed = parm;
 486
 487        mutex_lock(&hws_sem_oom);
 488
 489        if (hws_state == HWS_DEALLOCATED) {
 490                /* during memory allocation */
 491                if (oom_killer_was_active == 0) {
 492                        oom_killer_was_active = 1;
 493                        *freed += deallocate_sdbt();
 494                }
 495        } else {
 496                int i;
 497                cpu = get_cpu();
 498                cb = &per_cpu(sampler_cpu_buffer, cpu);
 499
 500                if (!cb->oom) {
 501                        for_each_online_cpu(i) {
 502                                smp_ctl_ssctl_deactivate(i);
 503                                cb->oom = 1;
 504                        }
 505                        cb->finish = 1;
 506
 507                        printk(KERN_INFO
 508                                "hwsampler: CPU %d, OOM notify during CPUMF Sampling.\n",
 509                                cpu);
 510                }
 511        }
 512
 513        mutex_unlock(&hws_sem_oom);
 514
 515        return NOTIFY_OK;
 516}
 517
 518static struct notifier_block hws_oom_notifier = {
 519        .notifier_call = hws_oom_callback
 520};
 521
 522static int hws_cpu_callback(struct notifier_block *nfb,
 523        unsigned long action, void *hcpu)
 524{
 525        /* We do not have sampler space available for all possible CPUs.
 526           All CPUs should be online when hw sampling is activated. */
 527        return (hws_state <= HWS_DEALLOCATED) ? NOTIFY_OK : NOTIFY_BAD;
 528}
 529
 530static struct notifier_block hws_cpu_notifier = {
 531        .notifier_call = hws_cpu_callback
 532};
 533
 534/**
 535 * hwsampler_deactivate() - set hardware sampling temporarily inactive
 536 * @cpu:  specifies the CPU to be set inactive.
 537 *
 538 * Returns 0 on success, !0 on failure.
 539 */
 540int hwsampler_deactivate(unsigned int cpu)
 541{
 542        /*
 543         * Deactivate hw sampling temporarily and flush the buffer
 544         * by pushing all the pending samples to oprofile buffer.
 545         *
 546         * This function can be called under one of the following conditions:
 547         *     Memory unmap, task is exiting.
 548         */
 549        int rc;
 550        struct hws_cpu_buffer *cb;
 551
 552        rc = 0;
 553        mutex_lock(&hws_sem);
 554
 555        cb = &per_cpu(sampler_cpu_buffer, cpu);
 556        if (hws_state == HWS_STARTED) {
 557                rc = smp_ctl_qsi(cpu);
 558                WARN_ON(rc);
 559                if (cb->qsi.cs) {
 560                        rc = smp_ctl_ssctl_deactivate(cpu);
 561                        if (rc) {
 562                                printk(KERN_INFO
 563                                "hwsampler: CPU %d, CPUMF Deactivation failed.\n", cpu);
 564                                cb->finish = 1;
 565                                hws_state = HWS_STOPPING;
 566                        } else  {
 567                                hws_flush_all = 1;
 568                                /* Add work to queue to read pending samples.*/
 569                                queue_work_on(cpu, hws_wq, &cb->worker);
 570                        }
 571                }
 572        }
 573        mutex_unlock(&hws_sem);
 574
 575        if (hws_wq)
 576                flush_workqueue(hws_wq);
 577
 578        return rc;
 579}
 580
 581/**
 582 * hwsampler_activate() - activate/resume hardware sampling which was deactivated
 583 * @cpu:  specifies the CPU to be set active.
 584 *
 585 * Returns 0 on success, !0 on failure.
 586 */
 587int hwsampler_activate(unsigned int cpu)
 588{
 589        /*
 590         * Re-activate hw sampling. This should be called in pair with
 591         * hwsampler_deactivate().
 592         */
 593        int rc;
 594        struct hws_cpu_buffer *cb;
 595
 596        rc = 0;
 597        mutex_lock(&hws_sem);
 598
 599        cb = &per_cpu(sampler_cpu_buffer, cpu);
 600        if (hws_state == HWS_STARTED) {
 601                rc = smp_ctl_qsi(cpu);
 602                WARN_ON(rc);
 603                if (!cb->qsi.cs) {
 604                        hws_flush_all = 0;
 605                        rc = smp_ctl_ssctl_enable_activate(cpu, interval);
 606                        if (rc) {
 607                                printk(KERN_ERR
 608                                "CPU %d, CPUMF activate sampling failed.\n",
 609                                         cpu);
 610                        }
 611                }
 612        }
 613
 614        mutex_unlock(&hws_sem);
 615
 616        return rc;
 617}
 618
 619static int check_qsi_on_setup(void)
 620{
 621        int rc;
 622        unsigned int cpu;
 623        struct hws_cpu_buffer *cb;
 624
 625        for_each_online_cpu(cpu) {
 626                cb = &per_cpu(sampler_cpu_buffer, cpu);
 627                rc = smp_ctl_qsi(cpu);
 628                WARN_ON(rc);
 629                if (rc)
 630                        return -EOPNOTSUPP;
 631
 632                if (!cb->qsi.as) {
 633                        printk(KERN_INFO "hwsampler: CPUMF sampling is not authorized.\n");
 634                        return -EINVAL;
 635                }
 636
 637                if (cb->qsi.es) {
 638                        printk(KERN_WARNING "hwsampler: CPUMF is still enabled.\n");
 639                        rc = smp_ctl_ssctl_stop(cpu);
 640                        if (rc)
 641                                return -EINVAL;
 642
 643                        printk(KERN_INFO
 644                                "CPU %d, CPUMF Sampling stopped now.\n", cpu);
 645                }
 646        }
 647        return 0;
 648}
 649
 650static int check_qsi_on_start(void)
 651{
 652        unsigned int cpu;
 653        int rc;
 654        struct hws_cpu_buffer *cb;
 655
 656        for_each_online_cpu(cpu) {
 657                cb = &per_cpu(sampler_cpu_buffer, cpu);
 658                rc = smp_ctl_qsi(cpu);
 659                WARN_ON(rc);
 660
 661                if (!cb->qsi.as)
 662                        return -EINVAL;
 663
 664                if (cb->qsi.es)
 665                        return -EINVAL;
 666
 667                if (cb->qsi.cs)
 668                        return -EINVAL;
 669        }
 670        return 0;
 671}
 672
 673static void worker_on_start(unsigned int cpu)
 674{
 675        struct hws_cpu_buffer *cb;
 676
 677        cb = &per_cpu(sampler_cpu_buffer, cpu);
 678        cb->worker_entry = cb->first_sdbt;
 679}
 680
 681static int worker_check_error(unsigned int cpu, int ext_params)
 682{
 683        int rc;
 684        unsigned long *sdbt;
 685        struct hws_cpu_buffer *cb;
 686
 687        rc = 0;
 688        cb = &per_cpu(sampler_cpu_buffer, cpu);
 689        sdbt = (unsigned long *) cb->worker_entry;
 690
 691        if (!sdbt || !*sdbt)
 692                return -EINVAL;
 693
 694        if (ext_params & CPU_MF_INT_SF_PRA)
 695                cb->req_alert++;
 696
 697        if (ext_params & CPU_MF_INT_SF_LSDA)
 698                cb->loss_of_sample_data++;
 699
 700        if (ext_params & CPU_MF_INT_SF_IAE) {
 701                cb->invalid_entry_address++;
 702                rc = -EINVAL;
 703        }
 704
 705        if (ext_params & CPU_MF_INT_SF_ISE) {
 706                cb->incorrect_sdbt_entry++;
 707                rc = -EINVAL;
 708        }
 709
 710        if (ext_params & CPU_MF_INT_SF_SACA) {
 711                cb->sample_auth_change_alert++;
 712                rc = -EINVAL;
 713        }
 714
 715        return rc;
 716}
 717
 718static void worker_on_finish(unsigned int cpu)
 719{
 720        int rc, i;
 721        struct hws_cpu_buffer *cb;
 722
 723        cb = &per_cpu(sampler_cpu_buffer, cpu);
 724
 725        if (cb->finish) {
 726                rc = smp_ctl_qsi(cpu);
 727                WARN_ON(rc);
 728                if (cb->qsi.es) {
 729                        printk(KERN_INFO
 730                                "hwsampler: CPU %d, CPUMF Stop/Deactivate sampling.\n",
 731                                cpu);
 732                        rc = smp_ctl_ssctl_stop(cpu);
 733                        if (rc)
 734                                printk(KERN_INFO
 735                                        "hwsampler: CPU %d, CPUMF Deactivation failed.\n",
 736                                        cpu);
 737
 738                        for_each_online_cpu(i) {
 739                                if (i == cpu)
 740                                        continue;
 741                                if (!cb->finish) {
 742                                        cb->finish = 1;
 743                                        queue_work_on(i, hws_wq,
 744                                                &cb->worker);
 745                                }
 746                        }
 747                }
 748        }
 749}
 750
 751static void worker_on_interrupt(unsigned int cpu)
 752{
 753        unsigned long *sdbt;
 754        unsigned char done;
 755        struct hws_cpu_buffer *cb;
 756
 757        cb = &per_cpu(sampler_cpu_buffer, cpu);
 758
 759        sdbt = (unsigned long *) cb->worker_entry;
 760
 761        done = 0;
 762        /* do not proceed if stop was entered,
 763         * forget the buffers not yet processed */
 764        while (!done && !cb->stop_mode) {
 765                unsigned long *trailer;
 766                struct hws_trailer_entry *te;
 767                unsigned long *dear = 0;
 768
 769                trailer = trailer_entry_ptr(*sdbt);
 770                /* leave loop if no more work to do */
 771                if (!(*trailer & SDB_TE_BUFFER_FULL_MASK)) {
 772                        done = 1;
 773                        if (!hws_flush_all)
 774                                continue;
 775                }
 776
 777                te = (struct hws_trailer_entry *)trailer;
 778                cb->sample_overflow += te->overflow;
 779
 780                add_samples_to_oprofile(cpu, sdbt, dear);
 781
 782                /* reset trailer */
 783                xchg((unsigned char *) te, 0x40);
 784
 785                /* advance to next sdb slot in current sdbt */
 786                sdbt++;
 787                /* in case link bit is set use address w/o link bit */
 788                if (is_link_entry(sdbt))
 789                        sdbt = get_next_sdbt(sdbt);
 790
 791                cb->worker_entry = (unsigned long)sdbt;
 792        }
 793}
 794
 795static void add_samples_to_oprofile(unsigned int cpu, unsigned long *sdbt,
 796                unsigned long *dear)
 797{
 798        struct hws_basic_entry *sample_data_ptr;
 799        unsigned long *trailer;
 800
 801        trailer = trailer_entry_ptr(*sdbt);
 802        if (dear) {
 803                if (dear > trailer)
 804                        return;
 805                trailer = dear;
 806        }
 807
 808        sample_data_ptr = (struct hws_basic_entry *)(*sdbt);
 809
 810        while ((unsigned long *)sample_data_ptr < trailer) {
 811                struct pt_regs *regs = NULL;
 812                struct task_struct *tsk = NULL;
 813
 814                /*
 815                 * Check sampling mode, 1 indicates basic (=customer) sampling
 816                 * mode.
 817                 */
 818                if (sample_data_ptr->def != 1) {
 819                        /* sample slot is not yet written */
 820                        break;
 821                } else {
 822                        /* make sure we don't use it twice,
 823                         * the next time the sampler will set it again */
 824                        sample_data_ptr->def = 0;
 825                }
 826
 827                /* Get pt_regs. */
 828                if (sample_data_ptr->P == 1) {
 829                        /* userspace sample */
 830                        unsigned int pid = sample_data_ptr->prim_asn;
 831                        if (!counter_config.user)
 832                                goto skip_sample;
 833                        rcu_read_lock();
 834                        tsk = pid_task(find_vpid(pid), PIDTYPE_PID);
 835                        if (tsk)
 836                                regs = task_pt_regs(tsk);
 837                        rcu_read_unlock();
 838                } else {
 839                        /* kernelspace sample */
 840                        if (!counter_config.kernel)
 841                                goto skip_sample;
 842                        regs = task_pt_regs(current);
 843                }
 844
 845                mutex_lock(&hws_sem);
 846                oprofile_add_ext_hw_sample(sample_data_ptr->ia, regs, 0,
 847                                !sample_data_ptr->P, tsk);
 848                mutex_unlock(&hws_sem);
 849        skip_sample:
 850                sample_data_ptr++;
 851        }
 852}
 853
 854static void worker(struct work_struct *work)
 855{
 856        unsigned int cpu;
 857        int ext_params;
 858        struct hws_cpu_buffer *cb;
 859
 860        cb = container_of(work, struct hws_cpu_buffer, worker);
 861        cpu = smp_processor_id();
 862        ext_params = atomic_xchg(&cb->ext_params, 0);
 863
 864        if (!cb->worker_entry)
 865                worker_on_start(cpu);
 866
 867        if (worker_check_error(cpu, ext_params))
 868                return;
 869
 870        if (!cb->finish)
 871                worker_on_interrupt(cpu);
 872
 873        if (cb->finish)
 874                worker_on_finish(cpu);
 875}
 876
 877/**
 878 * hwsampler_allocate() - allocate memory for the hardware sampler
 879 * @sdbt:  number of SDBTs per online CPU (must be > 0)
 880 * @sdb:   number of SDBs per SDBT (minimum 1, maximum 511)
 881 *
 882 * Returns 0 on success, !0 on failure.
 883 */
 884int hwsampler_allocate(unsigned long sdbt, unsigned long sdb)
 885{
 886        int cpu, rc;
 887        mutex_lock(&hws_sem);
 888
 889        rc = -EINVAL;
 890        if (hws_state != HWS_DEALLOCATED)
 891                goto allocate_exit;
 892
 893        if (sdbt < 1)
 894                goto allocate_exit;
 895
 896        if (sdb > MAX_NUM_SDB || sdb < MIN_NUM_SDB)
 897                goto allocate_exit;
 898
 899        num_sdbt = sdbt;
 900        num_sdb = sdb;
 901
 902        oom_killer_was_active = 0;
 903        register_oom_notifier(&hws_oom_notifier);
 904
 905        for_each_online_cpu(cpu) {
 906                if (allocate_sdbt(cpu)) {
 907                        unregister_oom_notifier(&hws_oom_notifier);
 908                        goto allocate_error;
 909                }
 910        }
 911        unregister_oom_notifier(&hws_oom_notifier);
 912        if (oom_killer_was_active)
 913                goto allocate_error;
 914
 915        hws_state = HWS_STOPPED;
 916        rc = 0;
 917
 918allocate_exit:
 919        mutex_unlock(&hws_sem);
 920        return rc;
 921
 922allocate_error:
 923        rc = -ENOMEM;
 924        printk(KERN_ERR "hwsampler: CPUMF Memory allocation failed.\n");
 925        goto allocate_exit;
 926}
 927
 928/**
 929 * hwsampler_deallocate() - deallocate hardware sampler memory
 930 *
 931 * Returns 0 on success, !0 on failure.
 932 */
 933int hwsampler_deallocate(void)
 934{
 935        int rc;
 936
 937        mutex_lock(&hws_sem);
 938
 939        rc = -EINVAL;
 940        if (hws_state != HWS_STOPPED)
 941                goto deallocate_exit;
 942
 943        irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
 944        hws_alert = 0;
 945        deallocate_sdbt();
 946
 947        hws_state = HWS_DEALLOCATED;
 948        rc = 0;
 949
 950deallocate_exit:
 951        mutex_unlock(&hws_sem);
 952
 953        return rc;
 954}
 955
 956unsigned long hwsampler_query_min_interval(void)
 957{
 958        return min_sampler_rate;
 959}
 960
 961unsigned long hwsampler_query_max_interval(void)
 962{
 963        return max_sampler_rate;
 964}
 965
 966unsigned long hwsampler_get_sample_overflow_count(unsigned int cpu)
 967{
 968        struct hws_cpu_buffer *cb;
 969
 970        cb = &per_cpu(sampler_cpu_buffer, cpu);
 971
 972        return cb->sample_overflow;
 973}
 974
 975int hwsampler_setup(void)
 976{
 977        int rc;
 978        int cpu;
 979        struct hws_cpu_buffer *cb;
 980
 981        mutex_lock(&hws_sem);
 982
 983        rc = -EINVAL;
 984        if (hws_state)
 985                goto setup_exit;
 986
 987        hws_state = HWS_INIT;
 988
 989        init_all_cpu_buffers();
 990
 991        rc = check_hardware_prerequisites();
 992        if (rc)
 993                goto setup_exit;
 994
 995        rc = check_qsi_on_setup();
 996        if (rc)
 997                goto setup_exit;
 998
 999        rc = -EINVAL;
1000        hws_wq = create_workqueue("hwsampler");
1001        if (!hws_wq)
1002                goto setup_exit;
1003
1004        register_cpu_notifier(&hws_cpu_notifier);
1005
1006        for_each_online_cpu(cpu) {
1007                cb = &per_cpu(sampler_cpu_buffer, cpu);
1008                INIT_WORK(&cb->worker, worker);
1009                rc = smp_ctl_qsi(cpu);
1010                WARN_ON(rc);
1011                if (min_sampler_rate != cb->qsi.min_sampl_rate) {
1012                        if (min_sampler_rate) {
1013                                printk(KERN_WARNING
1014                                        "hwsampler: different min sampler rate values.\n");
1015                                if (min_sampler_rate < cb->qsi.min_sampl_rate)
1016                                        min_sampler_rate =
1017                                                cb->qsi.min_sampl_rate;
1018                        } else
1019                                min_sampler_rate = cb->qsi.min_sampl_rate;
1020                }
1021                if (max_sampler_rate != cb->qsi.max_sampl_rate) {
1022                        if (max_sampler_rate) {
1023                                printk(KERN_WARNING
1024                                        "hwsampler: different max sampler rate values.\n");
1025                                if (max_sampler_rate > cb->qsi.max_sampl_rate)
1026                                        max_sampler_rate =
1027                                                cb->qsi.max_sampl_rate;
1028                        } else
1029                                max_sampler_rate = cb->qsi.max_sampl_rate;
1030                }
1031        }
1032        register_external_irq(EXT_IRQ_MEASURE_ALERT, hws_ext_handler);
1033
1034        hws_state = HWS_DEALLOCATED;
1035        rc = 0;
1036
1037setup_exit:
1038        mutex_unlock(&hws_sem);
1039        return rc;
1040}
1041
1042int hwsampler_shutdown(void)
1043{
1044        int rc;
1045
1046        mutex_lock(&hws_sem);
1047
1048        rc = -EINVAL;
1049        if (hws_state == HWS_DEALLOCATED || hws_state == HWS_STOPPED) {
1050                mutex_unlock(&hws_sem);
1051
1052                if (hws_wq)
1053                        flush_workqueue(hws_wq);
1054
1055                mutex_lock(&hws_sem);
1056
1057                if (hws_state == HWS_STOPPED) {
1058                        irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
1059                        hws_alert = 0;
1060                        deallocate_sdbt();
1061                }
1062                if (hws_wq) {
1063                        destroy_workqueue(hws_wq);
1064                        hws_wq = NULL;
1065                }
1066
1067                unregister_external_irq(EXT_IRQ_MEASURE_ALERT, hws_ext_handler);
1068                hws_state = HWS_INIT;
1069                rc = 0;
1070        }
1071        mutex_unlock(&hws_sem);
1072
1073        unregister_cpu_notifier(&hws_cpu_notifier);
1074
1075        return rc;
1076}
1077
1078/**
1079 * hwsampler_start_all() - start hardware sampling on all online CPUs
1080 * @rate:  specifies the used interval when samples are taken
1081 *
1082 * Returns 0 on success, !0 on failure.
1083 */
1084int hwsampler_start_all(unsigned long rate)
1085{
1086        int rc, cpu;
1087
1088        mutex_lock(&hws_sem);
1089
1090        hws_oom = 0;
1091
1092        rc = -EINVAL;
1093        if (hws_state != HWS_STOPPED)
1094                goto start_all_exit;
1095
1096        interval = rate;
1097
1098        /* fail if rate is not valid */
1099        if (interval < min_sampler_rate || interval > max_sampler_rate)
1100                goto start_all_exit;
1101
1102        rc = check_qsi_on_start();
1103        if (rc)
1104                goto start_all_exit;
1105
1106        prepare_cpu_buffers();
1107
1108        for_each_online_cpu(cpu) {
1109                rc = start_sampling(cpu);
1110                if (rc)
1111                        break;
1112        }
1113        if (rc) {
1114                for_each_online_cpu(cpu) {
1115                        stop_sampling(cpu);
1116                }
1117                goto start_all_exit;
1118        }
1119        hws_state = HWS_STARTED;
1120        rc = 0;
1121
1122start_all_exit:
1123        mutex_unlock(&hws_sem);
1124
1125        if (rc)
1126                return rc;
1127
1128        register_oom_notifier(&hws_oom_notifier);
1129        hws_oom = 1;
1130        hws_flush_all = 0;
1131        /* now let them in, 1407 CPUMF external interrupts */
1132        hws_alert = 1;
1133        irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT);
1134
1135        return 0;
1136}
1137
1138/**
1139 * hwsampler_stop_all() - stop hardware sampling on all online CPUs
1140 *
1141 * Returns 0 on success, !0 on failure.
1142 */
1143int hwsampler_stop_all(void)
1144{
1145        int tmp_rc, rc, cpu;
1146        struct hws_cpu_buffer *cb;
1147
1148        mutex_lock(&hws_sem);
1149
1150        rc = 0;
1151        if (hws_state == HWS_INIT) {
1152                mutex_unlock(&hws_sem);
1153                return 0;
1154        }
1155        hws_state = HWS_STOPPING;
1156        mutex_unlock(&hws_sem);
1157
1158        for_each_online_cpu(cpu) {
1159                cb = &per_cpu(sampler_cpu_buffer, cpu);
1160                cb->stop_mode = 1;
1161                tmp_rc = stop_sampling(cpu);
1162                if (tmp_rc)
1163                        rc = tmp_rc;
1164        }
1165
1166        if (hws_wq)
1167                flush_workqueue(hws_wq);
1168
1169        mutex_lock(&hws_sem);
1170        if (hws_oom) {
1171                unregister_oom_notifier(&hws_oom_notifier);
1172                hws_oom = 0;
1173        }
1174        hws_state = HWS_STOPPED;
1175        mutex_unlock(&hws_sem);
1176
1177        return rc;
1178}
1179