void ath9k_spectral_init_debug(struct ath_softc *sc) { sc->rfs_chan_spec_scan = relay_open("spectral_scan", sc->debug.debugfs_phy, 1024, 256, &rfs_spec_scan_cb, NULL); debugfs_create_file("spectral_scan_ctl", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_spec_scan_ctl); debugfs_create_file("spectral_short_repeat", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_spectral_short_repeat); debugfs_create_file("spectral_count", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_spectral_count); debugfs_create_file("spectral_period", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_spectral_period); debugfs_create_file("spectral_fft_period", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_spectral_fft_period); }
void ath9k_cmn_spectral_init_debug(struct ath_spec_scan_priv *spec_priv, struct dentry *debugfs_phy) { spec_priv->rfs_chan_spec_scan = relay_open("spectral_scan", debugfs_phy, 1024, 256, &rfs_spec_scan_cb, NULL); debugfs_create_file("spectral_scan_ctl", S_IRUSR | S_IWUSR, debugfs_phy, spec_priv, &fops_spec_scan_ctl); debugfs_create_file("spectral_short_repeat", S_IRUSR | S_IWUSR, debugfs_phy, spec_priv, &fops_spectral_short_repeat); debugfs_create_file("spectral_count", S_IRUSR | S_IWUSR, debugfs_phy, spec_priv, &fops_spectral_count); debugfs_create_file("spectral_period", S_IRUSR | S_IWUSR, debugfs_phy, spec_priv, &fops_spectral_period); debugfs_create_file("spectral_fft_period", S_IRUSR | S_IWUSR, debugfs_phy, spec_priv, &fops_spectral_fft_period); }
static int setup_relay(void) { relay = relay_open("kmem_cache_relay", NULL, RELAY_BUFFER_SIZE, RELAY_NUM_BUFFERS, &kt_relay_callbacks, NULL); if (!relay) { pr_err("Error creating relay channel\n"); return -ENOMEM; } return 0; }
int kp_transport_init(ktap_State *ks) { char prefix[32] = {0}; sprintf(prefix, "trace-%d-", (int)task_tgid_vnr(current)); G(ks)->ktap_chan = relay_open(prefix, ktap_dir, 4096, 10, &relay_callbacks, NULL); if (!G(ks)->ktap_chan) { pr_err("ktap: relay_open failed\n"); return -1; } return 0; }
static int do_kvm_trace_enable(struct kvm_user_trace_setup *kuts) { struct kvm_trace *kt; int i, r = -ENOMEM; if (!kuts->buf_size || !kuts->buf_nr) return -EINVAL; kt = kzalloc(sizeof(*kt), GFP_KERNEL); if (!kt) goto err; r = -EIO; atomic_set(&kt->lost_records, 0); kt->lost_file = debugfs_create_file("lost_records", 0444, kvm_debugfs_dir, kt, &kvm_trace_lost_ops); if (!kt->lost_file) goto err; kt->rchan = relay_open("trace", kvm_debugfs_dir, kuts->buf_size, kuts->buf_nr, &kvm_relay_callbacks, kt); if (!kt->rchan) goto err; kvm_trace = kt; for (i = 0; i < ARRAY_SIZE(kvm_trace_probes); i++) { struct kvm_trace_probe *p = &kvm_trace_probes[i]; r = marker_probe_register(p->name, p->format, p->probe_func, p); if (r) printk(KERN_INFO "Unable to register probe %s\n", p->name); } kvm_trace->trace_state = KVM_TRACE_STATE_RUNNING; return 0; err: if (kt) { if (kt->lost_file) debugfs_remove(kt->lost_file); if (kt->rchan) relay_close(kt->rchan); kfree(kt); } return r; }
static int __init my_init(void) { int j, k; char data[64]; spinlock_t dumb_lock; mychan = relay_open(fname, NULL, SB_SIZE, N_SB, &relay_callbacks, NULL); /* can't use smp_processor_id() properly otherwise */ spin_lock_init(&dumb_lock); for (k = 0; k < 10; k++) { /* do this for a minute */ spin_lock(&dumb_lock); for (j = 0; j < 10; j++) { memset(data, 0, 64); sprintf(data, "data=%d\n", j * k); relay_write(mychan, data, 64); } printk(KERN_INFO "Relay Channel %s loaded on cpu=%d.\n", fname, smp_processor_id()); spin_unlock(&dumb_lock); msleep(6000); } return 0; }
static int guc_log_relay_create(struct intel_guc_log *log) { struct intel_guc *guc = log_to_guc(log); struct drm_i915_private *dev_priv = guc_to_i915(guc); struct rchan *guc_log_relay_chan; size_t n_subbufs, subbuf_size; int ret; lockdep_assert_held(&log->relay.lock); /* Keep the size of sub buffers same as shared log buffer */ subbuf_size = log->vma->size; /* * Store up to 8 snapshots, which is large enough to buffer sufficient * boot time logs and provides enough leeway to User, in terms of * latency, for consuming the logs from relay. Also doesn't take * up too much memory. */ n_subbufs = 8; guc_log_relay_chan = relay_open("guc_log", dev_priv->drm.primary->debugfs_root, subbuf_size, n_subbufs, &relay_callbacks, dev_priv); if (!guc_log_relay_chan) { DRM_ERROR("Couldn't create relay chan for GuC logging\n"); ret = -ENOMEM; return ret; } GEM_BUG_ON(guc_log_relay_chan->subbuf_size < subbuf_size); log->relay.channel = guc_log_relay_chan; return 0; }
int st_relayfs_open(void) { int n,m; //clear and fill in entries table with names/default memset( &relay_entries, 0x00, sizeof(relay_entries) ); for(n=0;n<RELAY_NUMBER_OF_TYPES;n++) { strcpy(relay_entries[n].name, relay_type_names[n]); relay_entries[n].active = 0; } //clear count table for(n=0;n<RELAY_NUMBER_OF_SOURCES;n++) for(m=0;m<RELAY_NUMBER_OF_TYPES;m++) relay_source_item_counts[n][m] = 0; //set up our debugfs dir and entries strelay_dir = debugfs_create_dir("st_relay", NULL); if (!strelay_dir) { printk("%s: ERROR: Couldn't create debugfs app directory.\n", __FUNCTION__); return 1; } else { st_relay_chan = relay_open("data", strelay_dir, SUBBUF_SIZE, N_SUBBUFS, &st_relayfs_callbacks, 0); if(st_relay_chan) { for(n=0;n<RELAY_NUMBER_OF_TYPES;n++) { relay_entries[n].dentry = debugfs_create_u32(relay_entries[n].name, 0666, strelay_dir, &(relay_entries[n].active)); } } else { printk("st_relayfs_open: ERROR: Couldn't create relay channel.\n"); } } return 0; }
/* * Setup everything required to start tracing */ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, struct block_device *bdev, struct blk_user_trace_setup *buts) { struct blk_trace *old_bt, *bt = NULL; struct dentry *dir = NULL; int ret, i; if (!buts->buf_size || !buts->buf_nr) return -EINVAL; strncpy(buts->name, name, BLKTRACE_BDEV_SIZE); buts->name[BLKTRACE_BDEV_SIZE - 1] = '\0'; /* * some device names have larger paths - convert the slashes * to underscores for this to work as expected */ for (i = 0; i < strlen(buts->name); i++) if (buts->name[i] == '/') buts->name[i] = '_'; bt = kzalloc(sizeof(*bt), GFP_KERNEL); if (!bt) return -ENOMEM; ret = -ENOMEM; bt->sequence = alloc_percpu(unsigned long); if (!bt->sequence) goto err; bt->msg_data = __alloc_percpu(BLK_TN_MAX_MSG, __alignof__(char)); if (!bt->msg_data) goto err; ret = -ENOENT; mutex_lock(&blk_tree_mutex); if (!blk_tree_root) { blk_tree_root = debugfs_create_dir("block", NULL); if (!blk_tree_root) { mutex_unlock(&blk_tree_mutex); goto err; } } mutex_unlock(&blk_tree_mutex); dir = debugfs_create_dir(buts->name, blk_tree_root); if (!dir) goto err; bt->dir = dir; bt->dev = dev; atomic_set(&bt->dropped, 0); ret = -EIO; bt->dropped_file = debugfs_create_file("dropped", 0444, dir, bt, &blk_dropped_fops); if (!bt->dropped_file) goto err; bt->msg_file = debugfs_create_file("msg", 0222, dir, bt, &blk_msg_fops); if (!bt->msg_file) goto err; bt->rchan = relay_open("trace", dir, buts->buf_size, buts->buf_nr, &blk_relay_callbacks, bt); if (!bt->rchan) goto err; bt->act_mask = buts->act_mask; if (!bt->act_mask) bt->act_mask = (u16) -1; blk_trace_setup_lba(bt, bdev); /* overwrite with user settings */ if (buts->start_lba) bt->start_lba = buts->start_lba; if (buts->end_lba) bt->end_lba = buts->end_lba; bt->pid = buts->pid; bt->trace_state = Blktrace_setup; ret = -EBUSY; old_bt = xchg(&q->blk_trace, bt); if (old_bt) { (void) xchg(&q->blk_trace, old_bt); goto err; } if (atomic_inc_return(&blk_probes_ref) == 1) blk_register_tracepoints(); return 0; err: blk_trace_free(bt); return ret; }
/* * Setup everything required to start tracing */ static int blk_trace_setup(request_queue_t *q, struct block_device *bdev, char __user *arg) { struct blk_user_trace_setup buts; struct blk_trace *old_bt, *bt = NULL; struct dentry *dir = NULL; char b[BDEVNAME_SIZE]; int ret, i; if (copy_from_user(&buts, arg, sizeof(buts))) return -EFAULT; if (!buts.buf_size || !buts.buf_nr) return -EINVAL; strcpy(buts.name, bdevname(bdev, b)); /* * some device names have larger paths - convert the slashes * to underscores for this to work as expected */ for (i = 0; i < strlen(buts.name); i++) if (buts.name[i] == '/') buts.name[i] = '_'; if (copy_to_user(arg, &buts, sizeof(buts))) return -EFAULT; ret = -ENOMEM; bt = kzalloc(sizeof(*bt), GFP_KERNEL); if (!bt) goto err; bt->sequence = alloc_percpu(unsigned long); if (!bt->sequence) goto err; ret = -ENOENT; dir = blk_create_tree(buts.name); if (!dir) goto err; bt->dir = dir; bt->dev = bdev->bd_dev; atomic_set(&bt->dropped, 0); ret = -EIO; bt->dropped_file = debugfs_create_file("dropped", 0444, dir, bt, &blk_dropped_fops); if (!bt->dropped_file) goto err; bt->rchan = relay_open("trace", dir, buts.buf_size, buts.buf_nr, &blk_relay_callbacks); if (!bt->rchan) goto err; bt->rchan->private_data = bt; bt->act_mask = buts.act_mask; if (!bt->act_mask) bt->act_mask = (u16) -1; bt->start_lba = buts.start_lba; bt->end_lba = buts.end_lba; if (!bt->end_lba) bt->end_lba = -1ULL; bt->pid = buts.pid; bt->trace_state = Blktrace_setup; ret = -EBUSY; old_bt = xchg(&q->blk_trace, bt); if (old_bt) { (void) xchg(&q->blk_trace, old_bt); goto err; } return 0; err: if (dir) blk_remove_tree(dir); if (bt) { if (bt->dropped_file) debugfs_remove(bt->dropped_file); if (bt->sequence) free_percpu(bt->sequence); if (bt->rchan) relay_close(bt->rchan); kfree(bt); } return ret; }
void test_fn(char *name) { relay_open(name, NULL, 1024*128, 4, NULL, NULL); }
/* * Setup everything required to start tracing */ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, struct blk_user_trace_setup *buts) { struct blk_trace *old_bt, *bt = NULL; struct dentry *dir = NULL; int ret, i; if (!buts->buf_size || !buts->buf_nr) return -EINVAL; strcpy(buts->name, name); /* * some device names have larger paths - convert the slashes * to underscores for this to work as expected */ for (i = 0; i < strlen(buts->name); i++) if (buts->name[i] == '/') buts->name[i] = '_'; ret = -ENOMEM; bt = kzalloc(sizeof(*bt), GFP_KERNEL); if (!bt) goto err; bt->sequence = alloc_percpu(unsigned long); if (!bt->sequence) goto err; ret = -ENOENT; dir = blk_create_tree(buts->name); if (!dir) goto err; bt->dir = dir; bt->dev = dev; atomic_set(&bt->dropped, 0); ret = -EIO; bt->dropped_file = debugfs_create_file("dropped", 0444, dir, bt, &blk_dropped_fops); if (!bt->dropped_file) goto err; bt->rchan = relay_open("trace", dir, buts->buf_size, buts->buf_nr, &blk_relay_callbacks, bt); if (!bt->rchan) goto err; bt->act_mask = buts->act_mask; if (!bt->act_mask) bt->act_mask = (u16) -1; bt->start_lba = buts->start_lba; bt->end_lba = buts->end_lba; if (!bt->end_lba) bt->end_lba = -1ULL; bt->pid = buts->pid; bt->trace_state = Blktrace_setup; ret = -EBUSY; old_bt = xchg(&q->blk_trace, bt); if (old_bt) { (void) xchg(&q->blk_trace, old_bt); goto err; } return 0; err: if (dir) blk_remove_tree(dir); if (bt) { if (bt->dropped_file) debugfs_remove(bt->dropped_file); free_percpu(bt->sequence); if (bt->rchan) relay_close(bt->rchan); kfree(bt); } return ret; }