2 * drivers/misc/tegra-profiler/comm.c
4 * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20 #include <linux/slab.h>
21 #include <linux/vmalloc.h>
22 #include <linux/miscdevice.h>
23 #include <linux/sched.h>
24 #include <linux/poll.h>
25 #include <linux/bitops.h>
26 #include <linux/err.h>
29 #include <asm/uaccess.h>
31 #include <linux/tegra_profiler.h>
36 struct quadd_comm_ctx comm_ctx;
38 static inline void *rb_alloc(unsigned long size)
43 static inline void rb_free(void *addr)
48 static void rb_reset(struct quadd_ring_buffer *rb)
53 rb->max_fill_count = 0;
56 static int rb_init(struct quadd_ring_buffer *rb, size_t size)
58 spin_lock_init(&rb->lock);
63 rb->buf = (char *) rb_alloc(rb->size);
65 pr_err("Ring buffer alloc error\n");
68 pr_info("rb: data buffer size: %u\n", (unsigned int)rb->size);
75 static void rb_deinit(struct quadd_ring_buffer *rb)
79 spin_lock_irqsave(&rb->lock, flags);
86 spin_unlock_irqrestore(&rb->lock, flags);
89 static __attribute__((unused)) int rb_is_full(struct quadd_ring_buffer *rb)
91 return rb->fill_count == rb->size;
94 static int rb_is_empty(struct quadd_ring_buffer *rb)
96 return rb->fill_count == 0;
99 static int rb_is_empty_lock(struct quadd_ring_buffer *rb)
104 spin_lock_irqsave(&rb->lock, flags);
105 res = rb->fill_count == 0;
106 spin_unlock_irqrestore(&rb->lock, flags);
112 rb_get_free_space(struct quadd_ring_buffer *rb)
114 return rb->size - rb->fill_count;
118 rb_write(struct quadd_ring_buffer *rb, char *data, size_t length)
120 size_t new_pos_write, chunk1;
122 if (length > rb_get_free_space(rb))
125 new_pos_write = (rb->pos_write + length) % rb->size;
127 if (new_pos_write < rb->pos_write) {
128 chunk1 = rb->size - rb->pos_write;
129 memcpy(rb->buf + rb->pos_write, data, chunk1);
130 if (new_pos_write > 0)
131 memcpy(rb->buf, data + chunk1, new_pos_write);
133 memcpy(rb->buf + rb->pos_write, data, length);
136 rb->pos_write = new_pos_write;
137 rb->fill_count += length;
142 static ssize_t rb_read_undo(struct quadd_ring_buffer *rb, size_t length)
144 if (rb_get_free_space(rb) < length)
147 if (rb->pos_read > length)
148 rb->pos_read -= length;
150 rb->pos_read += rb->size - length;
152 rb->fill_count += length;
156 static size_t rb_read(struct quadd_ring_buffer *rb, char *data, size_t length)
158 unsigned int new_pos_read, chunk1;
160 if (length > rb->fill_count)
163 new_pos_read = (rb->pos_read + length) % rb->size;
165 if (new_pos_read < rb->pos_read) {
166 chunk1 = rb->size - rb->pos_read;
167 memcpy(data, rb->buf + rb->pos_read, chunk1);
168 if (new_pos_read > 0)
169 memcpy(data + chunk1, rb->buf, new_pos_read);
171 memcpy(data, rb->buf + rb->pos_read, length);
174 rb->pos_read = new_pos_read;
175 rb->fill_count -= length;
181 rb_read_user(struct quadd_ring_buffer *rb, char __user *data, size_t length)
183 size_t new_pos_read, chunk1;
185 if (length > rb->fill_count)
188 new_pos_read = (rb->pos_read + length) % rb->size;
190 if (new_pos_read < rb->pos_read) {
191 chunk1 = rb->size - rb->pos_read;
192 if (copy_to_user(data, rb->buf + rb->pos_read, chunk1))
195 if (new_pos_read > 0) {
196 if (copy_to_user(data + chunk1, rb->buf,
201 if (copy_to_user(data, rb->buf + rb->pos_read, length))
205 rb->pos_read = new_pos_read;
206 rb->fill_count -= length;
212 write_sample(struct quadd_record_data *sample,
213 struct quadd_iovec *vec, int vec_count)
217 struct quadd_ring_buffer *rb = &comm_ctx.rb;
218 size_t length_sample;
220 length_sample = sizeof(struct quadd_record_data);
221 for (i = 0; i < vec_count; i++)
222 length_sample += vec[i].len;
224 spin_lock_irqsave(&rb->lock, flags);
226 if (length_sample > rb_get_free_space(rb)) {
227 pr_err_once("Error: Buffer has been overflowed\n");
228 spin_unlock_irqrestore(&rb->lock, flags);
232 if (!rb_write(rb, (char *)sample, sizeof(struct quadd_record_data))) {
233 spin_unlock_irqrestore(&rb->lock, flags);
237 for (i = 0; i < vec_count; i++) {
238 if (!rb_write(rb, vec[i].base, vec[i].len)) {
239 spin_unlock_irqrestore(&rb->lock, flags);
240 pr_err_once("%s: error: ring buffer\n", __func__);
245 if (rb->fill_count > rb->max_fill_count)
246 rb->max_fill_count = rb->fill_count;
248 spin_unlock_irqrestore(&rb->lock, flags);
250 wake_up_interruptible(&comm_ctx.read_wait);
253 static ssize_t read_sample(char __user *buffer, size_t max_length)
257 int retval = -EIO, ip_size;
258 int was_read = 0, write_offset = 0;
260 struct quadd_ring_buffer *rb = &comm_ctx.rb;
261 struct quadd_record_data record;
262 size_t length_extra = 0, nr_events;
263 struct quadd_sample_data *sample;
265 spin_lock_irqsave(&rb->lock, flags);
267 if (rb_is_empty(rb)) {
272 if (rb->fill_count < sizeof(record))
275 if (!rb_read(rb, (char *)&record, sizeof(record)))
278 was_read += sizeof(record);
280 type = record.record_type;
283 case QUADD_RECORD_TYPE_SAMPLE:
284 sample = &record.sample;
286 if (rb->fill_count < sizeof(sed))
289 if (!rb_read(rb, (char *)&sed, sizeof(sed)))
292 was_read += sizeof(sed);
294 ip_size = (sed & QUADD_SED_IP64) ?
295 sizeof(u64) : sizeof(u32);
297 length_extra = sample->callchain_nr * ip_size;
299 nr_events = __sw_hweight32(sample->events_flags);
300 length_extra += nr_events * sizeof(u32);
302 length_extra += sample->state ? sizeof(u32) : 0;
305 case QUADD_RECORD_TYPE_MMAP:
306 length_extra = sizeof(u64) * 2;
308 if (record.mmap.filename_length > 0) {
309 length_extra += record.mmap.filename_length;
311 pr_err("Error: filename is empty\n");
316 case QUADD_RECORD_TYPE_HEADER:
317 length_extra = record.hdr.nr_events * sizeof(u32);
320 case QUADD_RECORD_TYPE_DEBUG:
321 length_extra = record.debug.extra_length;
324 case QUADD_RECORD_TYPE_MA:
328 case QUADD_RECORD_TYPE_POWER_RATE:
329 length_extra = record.power_rate.nr_cpus * sizeof(u32);
332 case QUADD_RECORD_TYPE_ADDITIONAL_SAMPLE:
333 length_extra = record.additional_sample.extra_length;
340 if (was_read + length_extra > max_length) {
341 retval = rb_read_undo(rb, was_read);
349 if (length_extra > rb->fill_count)
352 if (copy_to_user(buffer, &record, sizeof(record)))
353 goto out_fault_error;
355 write_offset += sizeof(record);
357 if (type == QUADD_RECORD_TYPE_SAMPLE) {
358 if (copy_to_user(buffer + write_offset, &sed, sizeof(sed)))
359 goto out_fault_error;
361 write_offset += sizeof(sed);
364 if (length_extra > 0) {
365 retval = rb_read_user(rb, buffer + write_offset,
370 write_offset += length_extra;
373 spin_unlock_irqrestore(&rb->lock, flags);
380 spin_unlock_irqrestore(&rb->lock, flags);
384 static void put_sample(struct quadd_record_data *data,
385 struct quadd_iovec *vec, int vec_count)
387 if (!atomic_read(&comm_ctx.active))
390 write_sample(data, vec, vec_count);
393 static void comm_reset(void)
397 pr_debug("Comm reset\n");
398 spin_lock_irqsave(&comm_ctx.rb.lock, flags);
399 rb_reset(&comm_ctx.rb);
400 spin_unlock_irqrestore(&comm_ctx.rb.lock, flags);
403 static int is_active(void)
405 return atomic_read(&comm_ctx.active) != 0;
408 static struct quadd_comm_data_interface comm_data = {
409 .put_sample = put_sample,
411 .is_active = is_active,
414 static int check_access_permission(void)
416 struct task_struct *task;
418 if (capable(CAP_SYS_ADMIN))
421 if (!comm_ctx.params_ok || comm_ctx.process_pid == 0)
425 task = pid_task(find_vpid(comm_ctx.process_pid), PIDTYPE_PID);
430 if (current_fsuid() != task_uid(task) &&
431 task_uid(task) != comm_ctx.debug_app_uid) {
432 pr_err("Permission denied, owner/task uids: %u/%u\n",
433 current_fsuid(), task_uid(task));
439 static struct quadd_extabs_mmap *
440 find_mmap(unsigned long vm_start)
442 struct quadd_extabs_mmap *entry;
444 list_for_each_entry(entry, &comm_ctx.ext_mmaps, list) {
445 struct vm_area_struct *mmap_vma = entry->mmap_vma;
446 if (vm_start == mmap_vma->vm_start)
453 static int device_open(struct inode *inode, struct file *file)
455 mutex_lock(&comm_ctx.io_mutex);
457 mutex_unlock(&comm_ctx.io_mutex);
461 static int device_release(struct inode *inode, struct file *file)
463 mutex_lock(&comm_ctx.io_mutex);
466 if (comm_ctx.nr_users == 0) {
467 if (atomic_cmpxchg(&comm_ctx.active, 1, 0)) {
468 comm_ctx.control->stop();
469 pr_info("Stop profiling: daemon is closed\n");
472 mutex_unlock(&comm_ctx.io_mutex);
478 device_poll(struct file *file, poll_table *wait)
480 unsigned int mask = 0;
481 struct quadd_ring_buffer *rb = &comm_ctx.rb;
483 poll_wait(file, &comm_ctx.read_wait, wait);
485 if (!rb_is_empty_lock(rb))
486 mask |= POLLIN | POLLRDNORM;
488 if (!atomic_read(&comm_ctx.active))
495 device_read(struct file *filp,
502 size_t samples_counter = 0;
503 size_t was_read = 0, min_size;
505 err = check_access_permission();
509 mutex_lock(&comm_ctx.io_mutex);
511 if (!atomic_read(&comm_ctx.active)) {
512 mutex_unlock(&comm_ctx.io_mutex);
516 min_size = sizeof(struct quadd_record_data) + sizeof(u32);
518 while (was_read + min_size < length) {
519 res = read_sample(buffer + was_read, length - was_read);
521 mutex_unlock(&comm_ctx.io_mutex);
522 pr_err("Error: data is corrupted\n");
532 if (!atomic_read(&comm_ctx.active))
536 mutex_unlock(&comm_ctx.io_mutex);
541 device_ioctl(struct file *file,
542 unsigned int ioctl_num,
543 unsigned long ioctl_param)
548 struct quadd_extabs_mmap *mmap;
549 struct quadd_parameters *user_params;
550 struct quadd_comm_cap cap;
551 struct quadd_module_state state;
552 struct quadd_module_version versions;
553 struct quadd_extables extabs;
554 struct quadd_ring_buffer *rb = &comm_ctx.rb;
556 if (ioctl_num != IOCTL_SETUP &&
557 ioctl_num != IOCTL_GET_CAP &&
558 ioctl_num != IOCTL_GET_STATE &&
559 ioctl_num != IOCTL_GET_VERSION) {
560 err = check_access_permission();
565 mutex_lock(&comm_ctx.io_mutex);
569 if (atomic_read(&comm_ctx.active)) {
570 pr_err("error: tegra profiler is active\n");
575 user_params = vmalloc(sizeof(*user_params));
581 if (copy_from_user(user_params, (void __user *)ioctl_param,
582 sizeof(struct quadd_parameters))) {
583 pr_err("setup failed\n");
589 err = comm_ctx.control->set_parameters(user_params,
590 &comm_ctx.debug_app_uid);
592 pr_err("error: setup failed\n");
596 comm_ctx.params_ok = 1;
597 comm_ctx.process_pid = user_params->pids[0];
599 if (user_params->reserved[QUADD_PARAM_IDX_SIZE_OF_RB] == 0) {
600 pr_err("error: too old version of daemon\n");
605 comm_ctx.rb_size = user_params->reserved[0];
607 pr_info("setup success: freq/mafreq: %u/%u, backtrace: %d, pid: %d\n",
609 user_params->ma_freq,
610 user_params->backtrace,
611 user_params->pids[0]);
617 comm_ctx.control->get_capabilities(&cap);
618 if (copy_to_user((void __user *)ioctl_param, &cap,
619 sizeof(struct quadd_comm_cap))) {
620 pr_err("error: get_capabilities failed\n");
626 case IOCTL_GET_VERSION:
627 strcpy((char *)versions.branch, QUADD_MODULE_BRANCH);
628 strcpy((char *)versions.version, QUADD_MODULE_VERSION);
630 versions.samples_version = QUADD_SAMPLES_VERSION;
631 versions.io_version = QUADD_IO_VERSION;
633 if (copy_to_user((void __user *)ioctl_param, &versions,
634 sizeof(struct quadd_module_version))) {
635 pr_err("error: get version failed\n");
641 case IOCTL_GET_STATE:
642 comm_ctx.control->get_state(&state);
644 state.buffer_size = comm_ctx.rb_size;
646 spin_lock_irqsave(&rb->lock, flags);
647 state.buffer_fill_size =
648 comm_ctx.rb_size - rb_get_free_space(rb);
649 state.reserved[QUADD_MOD_STATE_IDX_RB_MAX_FILL_COUNT] =
651 spin_unlock_irqrestore(&rb->lock, flags);
653 if (copy_to_user((void __user *)ioctl_param, &state,
654 sizeof(struct quadd_module_state))) {
655 pr_err("error: get_state failed\n");
662 if (!atomic_cmpxchg(&comm_ctx.active, 0, 1)) {
663 if (!comm_ctx.params_ok) {
664 pr_err("error: params failed\n");
665 atomic_set(&comm_ctx.active, 0);
670 err = rb_init(rb, comm_ctx.rb_size);
672 pr_err("error: rb_init failed\n");
673 atomic_set(&comm_ctx.active, 0);
677 err = comm_ctx.control->start();
679 pr_err("error: start failed\n");
680 atomic_set(&comm_ctx.active, 0);
683 pr_info("Start profiling success\n");
688 if (atomic_cmpxchg(&comm_ctx.active, 1, 0)) {
689 comm_ctx.control->stop();
690 wake_up_interruptible(&comm_ctx.read_wait);
691 rb_deinit(&comm_ctx.rb);
692 pr_info("Stop profiling success\n");
696 case IOCTL_SET_EXTAB:
697 if (copy_from_user(&extabs, (void __user *)ioctl_param,
699 pr_err("error: set_extab failed\n");
704 mmap_vm_start = (u64 *)
705 &extabs.reserved[QUADD_EXT_IDX_MMAP_VM_START];
707 spin_lock(&comm_ctx.mmaps_lock);
708 mmap = find_mmap((unsigned long)*mmap_vm_start);
710 pr_err("%s: error: mmap is not found\n", __func__);
712 spin_unlock(&comm_ctx.mmaps_lock);
716 err = comm_ctx.control->set_extab(&extabs, mmap);
717 spin_unlock(&comm_ctx.mmaps_lock);
719 pr_err("error: set_extab\n");
725 pr_err("error: ioctl %u is unsupported in this version of module\n",
732 mutex_unlock(&comm_ctx.io_mutex);
737 delete_mmap(struct quadd_extabs_mmap *mmap)
739 struct quadd_extabs_mmap *entry, *next;
741 list_for_each_entry_safe(entry, next, &comm_ctx.ext_mmaps, list) {
743 list_del(&entry->list);
751 static void mmap_open(struct vm_area_struct *vma)
755 static void mmap_close(struct vm_area_struct *vma)
757 struct quadd_extabs_mmap *mmap;
759 pr_debug("mmap_close: vma: %#lx - %#lx\n",
760 vma->vm_start, vma->vm_end);
762 spin_lock(&comm_ctx.mmaps_lock);
764 mmap = find_mmap(vma->vm_start);
766 pr_err("%s: error: mmap is not found\n", __func__);
770 comm_ctx.control->delete_mmap(mmap);
774 spin_unlock(&comm_ctx.mmaps_lock);
777 static int mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
780 struct quadd_extabs_mmap *mmap;
781 unsigned long offset = vmf->pgoff << PAGE_SHIFT;
783 pr_debug("mmap_fault: vma: %#lx - %#lx, pgoff: %#lx, vaddr: %p\n",
784 vma->vm_start, vma->vm_end, vmf->pgoff, vmf->virtual_address);
786 spin_lock(&comm_ctx.mmaps_lock);
788 mmap = find_mmap(vma->vm_start);
790 spin_unlock(&comm_ctx.mmaps_lock);
791 return VM_FAULT_SIGBUS;
796 vmf->page = vmalloc_to_page(data + offset);
799 spin_unlock(&comm_ctx.mmaps_lock);
803 static struct vm_operations_struct mmap_vm_ops = {
810 device_mmap(struct file *filp, struct vm_area_struct *vma)
812 unsigned long vma_size, nr_pages;
813 struct quadd_extabs_mmap *entry;
815 pr_debug("mmap: vma: %#lx - %#lx, pgoff: %#lx\n",
816 vma->vm_start, vma->vm_end, vma->vm_pgoff);
818 if (vma->vm_pgoff != 0)
821 vma->vm_private_data = filp->private_data;
823 vma_size = vma->vm_end - vma->vm_start;
824 nr_pages = vma_size / PAGE_SIZE;
826 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
830 entry->mmap_vma = vma;
832 INIT_LIST_HEAD(&entry->list);
833 INIT_LIST_HEAD(&entry->ex_entries);
835 entry->data = vmalloc_user(nr_pages * PAGE_SIZE);
837 pr_err("%s: error: vmalloc_user", __func__);
842 spin_lock(&comm_ctx.mmaps_lock);
843 list_add_tail(&entry->list, &comm_ctx.ext_mmaps);
844 spin_unlock(&comm_ctx.mmaps_lock);
846 vma->vm_ops = &mmap_vm_ops;
847 vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP;
849 vma->vm_ops->open(vma);
854 static void unregister(void)
856 misc_deregister(comm_ctx.misc_dev);
857 kfree(comm_ctx.misc_dev);
860 static void free_ctx(void)
862 rb_deinit(&comm_ctx.rb);
865 static const struct file_operations qm_fops = {
869 .release = device_release,
870 .unlocked_ioctl = device_ioctl,
871 .compat_ioctl = device_ioctl,
875 static int comm_init(void)
878 struct miscdevice *misc_dev;
880 misc_dev = kzalloc(sizeof(*misc_dev), GFP_KERNEL);
882 pr_err("Error: alloc error\n");
886 misc_dev->minor = MISC_DYNAMIC_MINOR;
887 misc_dev->name = QUADD_DEVICE_NAME;
888 misc_dev->fops = &qm_fops;
890 res = misc_register(misc_dev);
892 pr_err("Error: misc_register: %d\n", res);
896 comm_ctx.misc_dev = misc_dev;
898 mutex_init(&comm_ctx.io_mutex);
899 atomic_set(&comm_ctx.active, 0);
901 comm_ctx.params_ok = 0;
902 comm_ctx.process_pid = 0;
903 comm_ctx.nr_users = 0;
905 init_waitqueue_head(&comm_ctx.read_wait);
907 INIT_LIST_HEAD(&comm_ctx.ext_mmaps);
908 spin_lock_init(&comm_ctx.mmaps_lock);
913 struct quadd_comm_data_interface *
914 quadd_comm_events_init(struct quadd_comm_control_interface *control)
922 comm_ctx.control = control;
926 void quadd_comm_events_exit(void)
928 mutex_lock(&comm_ctx.io_mutex);
931 mutex_unlock(&comm_ctx.io_mutex);