LCOV - code coverage report
Current view: top level - kernel/events - ring_buffer.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 103 0.0 %
Date: 2014-02-18 Functions: 0 10 0.0 %
Branches: 0 172 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Performance events ring-buffer code:
       3                 :            :  *
       4                 :            :  *  Copyright (C) 2008 Thomas Gleixner <tglx@linutronix.de>
       5                 :            :  *  Copyright (C) 2008-2011 Red Hat, Inc., Ingo Molnar
       6                 :            :  *  Copyright (C) 2008-2011 Red Hat, Inc., Peter Zijlstra <pzijlstr@redhat.com>
       7                 :            :  *  Copyright  ©  2009 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
       8                 :            :  *
       9                 :            :  * For licensing details see kernel-base/COPYING
      10                 :            :  */
      11                 :            : 
      12                 :            : #include <linux/perf_event.h>
      13                 :            : #include <linux/vmalloc.h>
      14                 :            : #include <linux/slab.h>
      15                 :            : #include <linux/circ_buf.h>
      16                 :            : 
      17                 :            : #include "internal.h"
      18                 :            : 
      19                 :            : static void perf_output_wakeup(struct perf_output_handle *handle)
      20                 :            : {
      21                 :          0 :         atomic_set(&handle->rb->poll, POLL_IN);
      22                 :            : 
      23                 :          0 :         handle->event->pending_wakeup = 1;
      24                 :          0 :         irq_work_queue(&handle->event->pending);
      25                 :            : }
      26                 :            : 
      27                 :            : /*
      28                 :            :  * We need to ensure a later event_id doesn't publish a head when a former
      29                 :            :  * event isn't done writing. However since we need to deal with NMIs we
      30                 :            :  * cannot fully serialize things.
      31                 :            :  *
      32                 :            :  * We only publish the head (and generate a wakeup) when the outer-most
      33                 :            :  * event completes.
      34                 :            :  */
      35                 :            : static void perf_output_get_handle(struct perf_output_handle *handle)
      36                 :            : {
      37                 :            :         struct ring_buffer *rb = handle->rb;
      38                 :            : 
      39                 :          0 :         preempt_disable();
      40                 :          0 :         local_inc(&rb->nest);
      41                 :          0 :         handle->wakeup = local_read(&rb->wakeup);
      42                 :            : }
      43                 :            : 
      44                 :          0 : static void perf_output_put_handle(struct perf_output_handle *handle)
      45                 :            : {
      46                 :          0 :         struct ring_buffer *rb = handle->rb;
      47                 :            :         unsigned long head;
      48                 :            : 
      49                 :            : again:
      50                 :          0 :         head = local_read(&rb->head);
      51                 :            : 
      52                 :            :         /*
      53                 :            :          * IRQ/NMI can happen here, which means we can miss a head update.
      54                 :            :          */
      55                 :            : 
      56         [ #  # ]:          0 :         if (!local_dec_and_test(&rb->nest))
      57                 :            :                 goto out;
      58                 :            : 
      59                 :            :         /*
      60                 :            :          * Since the mmap() consumer (userspace) can run on a different CPU:
      61                 :            :          *
      62                 :            :          *   kernel                             user
      63                 :            :          *
      64                 :            :          *   READ ->data_tail                        READ ->data_head
      65                 :            :          *   smp_mb()   (A)                     smp_rmb()       (C)
      66                 :            :          *   WRITE $data                        READ $data
      67                 :            :          *   smp_wmb()  (B)                     smp_mb()        (D)
      68                 :            :          *   STORE ->data_head                       WRITE ->data_tail
      69                 :            :          *
      70                 :            :          * Where A pairs with D, and B pairs with C.
      71                 :            :          *
      72                 :            :          * I don't think A needs to be a full barrier because we won't in fact
      73                 :            :          * write data until we see the store from userspace. So we simply don't
      74                 :            :          * issue the data WRITE until we observe it. Be conservative for now.
      75                 :            :          *
      76                 :            :          * OTOH, D needs to be a full barrier since it separates the data READ
      77                 :            :          * from the tail WRITE.
      78                 :            :          *
      79                 :            :          * For B a WMB is sufficient since it separates two WRITEs, and for C
      80                 :            :          * an RMB is sufficient since it separates two READs.
      81                 :            :          *
      82                 :            :          * See perf_output_begin().
      83                 :            :          */
      84                 :          0 :         smp_wmb();
      85                 :          0 :         rb->user_page->data_head = head;
      86                 :            : 
      87                 :            :         /*
      88                 :            :          * Now check if we missed an update -- rely on previous implied
      89                 :            :          * compiler barriers to force a re-read.
      90                 :            :          */
      91         [ #  # ]:          0 :         if (unlikely(head != local_read(&rb->head))) {
      92                 :            :                 local_inc(&rb->nest);
      93                 :            :                 goto again;
      94                 :            :         }
      95                 :            : 
      96         [ #  # ]:          0 :         if (handle->wakeup != local_read(&rb->wakeup))
      97                 :            :                 perf_output_wakeup(handle);
      98                 :            : 
      99                 :            : out:
     100                 :          0 :         preempt_enable();
     101                 :          0 : }
     102                 :            : 
     103                 :          0 : int perf_output_begin(struct perf_output_handle *handle,
     104                 :            :                       struct perf_event *event, unsigned int size)
     105                 :            : {
     106                 :          0 :         struct ring_buffer *rb;
     107                 :            :         unsigned long tail, offset, head;
     108                 :            :         int have_lost, page_shift;
     109                 :            :         struct {
     110                 :            :                 struct perf_event_header header;
     111                 :            :                 u64                      id;
     112                 :            :                 u64                      lost;
     113                 :            :         } lost_event;
     114                 :            : 
     115                 :            :         rcu_read_lock();
     116                 :            :         /*
     117                 :            :          * For inherited events we send all the output towards the parent.
     118                 :            :          */
     119         [ #  # ]:          0 :         if (event->parent)
     120                 :            :                 event = event->parent;
     121                 :            : 
     122                 :          0 :         rb = rcu_dereference(event->rb);
     123         [ #  # ]:          0 :         if (unlikely(!rb))
     124                 :            :                 goto out;
     125                 :            : 
     126         [ #  # ]:          0 :         if (unlikely(!rb->nr_pages))
     127                 :            :                 goto out;
     128                 :            : 
     129                 :          0 :         handle->rb    = rb;
     130                 :          0 :         handle->event = event;
     131                 :            : 
     132                 :            :         have_lost = local_read(&rb->lost);
     133         [ #  # ]:          0 :         if (unlikely(have_lost)) {
     134                 :          0 :                 size += sizeof(lost_event);
     135         [ #  # ]:          0 :                 if (event->attr.sample_id_all)
     136                 :          0 :                         size += event->id_header_size;
     137                 :            :         }
     138                 :            : 
     139                 :            :         perf_output_get_handle(handle);
     140                 :            : 
     141                 :            :         do {
     142                 :          0 :                 tail = ACCESS_ONCE(rb->user_page->data_tail);
     143                 :          0 :                 offset = head = local_read(&rb->head);
     144 [ #  # ][ #  # ]:          0 :                 if (!rb->overwrite &&
     145                 :          0 :                     unlikely(CIRC_SPACE(head, tail, perf_data_size(rb)) < size))
     146                 :            :                         goto fail;
     147                 :          0 :                 head += size;
     148         [ #  # ]:          0 :         } while (local_cmpxchg(&rb->head, offset, head) != offset);
     149                 :            : 
     150                 :            :         /*
     151                 :            :          * Separate the userpage->tail read from the data stores below.
     152                 :            :          * Matches the MB userspace SHOULD issue after reading the data
     153                 :            :          * and before storing the new tail position.
     154                 :            :          *
     155                 :            :          * See perf_output_put_handle().
     156                 :            :          */
     157                 :          0 :         smp_mb();
     158                 :            : 
     159         [ #  # ]:          0 :         if (unlikely(head - local_read(&rb->wakeup) > rb->watermark))
     160                 :          0 :                 local_add(rb->watermark, &rb->wakeup);
     161                 :            : 
     162                 :          0 :         page_shift = PAGE_SHIFT + page_order(rb);
     163                 :            : 
     164                 :          0 :         handle->page = (offset >> page_shift) & (rb->nr_pages - 1);
     165                 :          0 :         offset &= (1UL << page_shift) - 1;
     166                 :          0 :         handle->addr = rb->data_pages[handle->page] + offset;
     167                 :          0 :         handle->size = (1UL << page_shift) - offset;
     168                 :            : 
     169         [ #  # ]:          0 :         if (unlikely(have_lost)) {
     170                 :            :                 struct perf_sample_data sample_data;
     171                 :            : 
     172                 :          0 :                 lost_event.header.size = sizeof(lost_event);
     173                 :          0 :                 lost_event.header.type = PERF_RECORD_LOST;
     174                 :          0 :                 lost_event.header.misc = 0;
     175                 :          0 :                 lost_event.id          = event->id;
     176                 :          0 :                 lost_event.lost        = local_xchg(&rb->lost, 0);
     177                 :            : 
     178                 :          0 :                 perf_event_header__init_id(&lost_event.header,
     179                 :            :                                            &sample_data, event);
     180                 :          0 :                 perf_output_put(handle, lost_event);
     181                 :          0 :                 perf_event__output_id_sample(event, handle, &sample_data);
     182                 :            :         }
     183                 :            : 
     184                 :            :         return 0;
     185                 :            : 
     186                 :            : fail:
     187                 :          0 :         local_inc(&rb->lost);
     188                 :          0 :         perf_output_put_handle(handle);
     189                 :            : out:
     190                 :            :         rcu_read_unlock();
     191                 :            : 
     192                 :          0 :         return -ENOSPC;
     193                 :            : }
     194                 :            : 
     195                 :          0 : unsigned int perf_output_copy(struct perf_output_handle *handle,
     196                 :            :                       const void *buf, unsigned int len)
     197                 :            : {
     198                 :          0 :         return __output_copy(handle, buf, len);
     199                 :            : }
     200                 :            : 
     201                 :          0 : unsigned int perf_output_skip(struct perf_output_handle *handle,
     202                 :            :                               unsigned int len)
     203                 :            : {
     204                 :          0 :         return __output_skip(handle, NULL, len);
     205                 :            : }
     206                 :            : 
     207                 :          0 : void perf_output_end(struct perf_output_handle *handle)
     208                 :            : {
     209                 :          0 :         perf_output_put_handle(handle);
     210                 :            :         rcu_read_unlock();
     211                 :          0 : }
     212                 :            : 
     213                 :            : static void
     214                 :          0 : ring_buffer_init(struct ring_buffer *rb, long watermark, int flags)
     215                 :            : {
     216                 :            :         long max_size = perf_data_size(rb);
     217                 :            : 
     218         [ #  # ]:          0 :         if (watermark)
     219                 :          0 :                 rb->watermark = min(max_size, watermark);
     220                 :            : 
     221         [ #  # ]:          0 :         if (!rb->watermark)
     222                 :          0 :                 rb->watermark = max_size / 2;
     223                 :            : 
     224         [ #  # ]:          0 :         if (flags & RING_BUFFER_WRITABLE)
     225                 :          0 :                 rb->overwrite = 0;
     226                 :            :         else
     227                 :          0 :                 rb->overwrite = 1;
     228                 :            : 
     229                 :          0 :         atomic_set(&rb->refcount, 1);
     230                 :            : 
     231                 :          0 :         INIT_LIST_HEAD(&rb->event_list);
     232                 :          0 :         spin_lock_init(&rb->event_lock);
     233                 :          0 : }
     234                 :            : 
     235                 :            : #ifndef CONFIG_PERF_USE_VMALLOC
     236                 :            : 
     237                 :            : /*
     238                 :            :  * Back perf_mmap() with regular GFP_KERNEL-0 pages.
     239                 :            :  */
     240                 :            : 
     241                 :            : struct page *
     242                 :            : perf_mmap_to_page(struct ring_buffer *rb, unsigned long pgoff)
     243                 :            : {
     244                 :            :         if (pgoff > rb->nr_pages)
     245                 :            :                 return NULL;
     246                 :            : 
     247                 :            :         if (pgoff == 0)
     248                 :            :                 return virt_to_page(rb->user_page);
     249                 :            : 
     250                 :            :         return virt_to_page(rb->data_pages[pgoff - 1]);
     251                 :            : }
     252                 :            : 
     253                 :            : static void *perf_mmap_alloc_page(int cpu)
     254                 :            : {
     255                 :            :         struct page *page;
     256                 :            :         int node;
     257                 :            : 
     258                 :            :         node = (cpu == -1) ? cpu : cpu_to_node(cpu);
     259                 :            :         page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0);
     260                 :            :         if (!page)
     261                 :            :                 return NULL;
     262                 :            : 
     263                 :            :         return page_address(page);
     264                 :            : }
     265                 :            : 
     266                 :            : struct ring_buffer *rb_alloc(int nr_pages, long watermark, int cpu, int flags)
     267                 :            : {
     268                 :            :         struct ring_buffer *rb;
     269                 :            :         unsigned long size;
     270                 :            :         int i;
     271                 :            : 
     272                 :            :         size = sizeof(struct ring_buffer);
     273                 :            :         size += nr_pages * sizeof(void *);
     274                 :            : 
     275                 :            :         rb = kzalloc(size, GFP_KERNEL);
     276                 :            :         if (!rb)
     277                 :            :                 goto fail;
     278                 :            : 
     279                 :            :         rb->user_page = perf_mmap_alloc_page(cpu);
     280                 :            :         if (!rb->user_page)
     281                 :            :                 goto fail_user_page;
     282                 :            : 
     283                 :            :         for (i = 0; i < nr_pages; i++) {
     284                 :            :                 rb->data_pages[i] = perf_mmap_alloc_page(cpu);
     285                 :            :                 if (!rb->data_pages[i])
     286                 :            :                         goto fail_data_pages;
     287                 :            :         }
     288                 :            : 
     289                 :            :         rb->nr_pages = nr_pages;
     290                 :            : 
     291                 :            :         ring_buffer_init(rb, watermark, flags);
     292                 :            : 
     293                 :            :         return rb;
     294                 :            : 
     295                 :            : fail_data_pages:
     296                 :            :         for (i--; i >= 0; i--)
     297                 :            :                 free_page((unsigned long)rb->data_pages[i]);
     298                 :            : 
     299                 :            :         free_page((unsigned long)rb->user_page);
     300                 :            : 
     301                 :            : fail_user_page:
     302                 :            :         kfree(rb);
     303                 :            : 
     304                 :            : fail:
     305                 :            :         return NULL;
     306                 :            : }
     307                 :            : 
     308                 :            : static void perf_mmap_free_page(unsigned long addr)
     309                 :            : {
     310                 :            :         struct page *page = virt_to_page((void *)addr);
     311                 :            : 
     312                 :            :         page->mapping = NULL;
     313                 :            :         __free_page(page);
     314                 :            : }
     315                 :            : 
     316                 :            : void rb_free(struct ring_buffer *rb)
     317                 :            : {
     318                 :            :         int i;
     319                 :            : 
     320                 :            :         perf_mmap_free_page((unsigned long)rb->user_page);
     321                 :            :         for (i = 0; i < rb->nr_pages; i++)
     322                 :            :                 perf_mmap_free_page((unsigned long)rb->data_pages[i]);
     323                 :            :         kfree(rb);
     324                 :            : }
     325                 :            : 
     326                 :            : #else
     327                 :          0 : static int data_page_nr(struct ring_buffer *rb)
     328                 :            : {
     329                 :          0 :         return rb->nr_pages << page_order(rb);
     330                 :            : }
     331                 :            : 
     332                 :            : struct page *
     333                 :          0 : perf_mmap_to_page(struct ring_buffer *rb, unsigned long pgoff)
     334                 :            : {
     335                 :            :         /* The '>' counts in the user page. */
     336         [ #  # ]:          0 :         if (pgoff > data_page_nr(rb))
     337                 :            :                 return NULL;
     338                 :            : 
     339                 :          0 :         return vmalloc_to_page((void *)rb->user_page + pgoff * PAGE_SIZE);
     340                 :            : }
     341                 :            : 
     342                 :            : static void perf_mmap_unmark_page(void *addr)
     343                 :            : {
     344                 :          0 :         struct page *page = vmalloc_to_page(addr);
     345                 :            : 
     346                 :          0 :         page->mapping = NULL;
     347                 :            : }
     348                 :            : 
     349                 :          0 : static void rb_free_work(struct work_struct *work)
     350                 :            : {
     351                 :            :         struct ring_buffer *rb;
     352                 :            :         void *base;
     353                 :            :         int i, nr;
     354                 :            : 
     355                 :          0 :         rb = container_of(work, struct ring_buffer, work);
     356                 :            :         nr = data_page_nr(rb);
     357                 :            : 
     358                 :          0 :         base = rb->user_page;
     359                 :            :         /* The '<=' counts in the user page. */
     360         [ #  # ]:          0 :         for (i = 0; i <= nr; i++)
     361                 :          0 :                 perf_mmap_unmark_page(base + (i * PAGE_SIZE));
     362                 :            : 
     363                 :          0 :         vfree(base);
     364                 :          0 :         kfree(rb);
     365                 :          0 : }
     366                 :            : 
     367                 :          0 : void rb_free(struct ring_buffer *rb)
     368                 :            : {
     369                 :          0 :         schedule_work(&rb->work);
     370                 :          0 : }
     371                 :            : 
     372                 :          0 : struct ring_buffer *rb_alloc(int nr_pages, long watermark, int cpu, int flags)
     373                 :            : {
     374                 :            :         struct ring_buffer *rb;
     375                 :            :         unsigned long size;
     376                 :            :         void *all_buf;
     377                 :            : 
     378                 :            :         size = sizeof(struct ring_buffer);
     379                 :            :         size += sizeof(void *);
     380                 :            : 
     381                 :            :         rb = kzalloc(size, GFP_KERNEL);
     382         [ #  # ]:          0 :         if (!rb)
     383                 :            :                 goto fail;
     384                 :            : 
     385                 :          0 :         INIT_WORK(&rb->work, rb_free_work);
     386                 :            : 
     387                 :          0 :         all_buf = vmalloc_user((nr_pages + 1) * PAGE_SIZE);
     388         [ #  # ]:          0 :         if (!all_buf)
     389                 :            :                 goto fail_all_buf;
     390                 :            : 
     391                 :          0 :         rb->user_page = all_buf;
     392                 :          0 :         rb->data_pages[0] = all_buf + PAGE_SIZE;
     393 [ #  # ][ #  # ]:          0 :         rb->page_order = ilog2(nr_pages);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     394                 :          0 :         rb->nr_pages = !!nr_pages;
     395                 :            : 
     396                 :          0 :         ring_buffer_init(rb, watermark, flags);
     397                 :            : 
     398                 :          0 :         return rb;
     399                 :            : 
     400                 :            : fail_all_buf:
     401                 :          0 :         kfree(rb);
     402                 :            : 
     403                 :            : fail:
     404                 :            :         return NULL;
     405                 :            : }
     406                 :            : 
     407                 :            : #endif

Generated by: LCOV version 1.9