41
41
static struct list_head kstat_module_list;
42
42
static kid_t kstat_id;
45
kstat_resize_raw(kstat_t *ksp)
47
if (ksp->ks_raw_bufsize == KSTAT_RAW_MAX)
50
vmem_free(ksp->ks_raw_buf, ksp->ks_raw_bufsize);
51
ksp->ks_raw_bufsize = MIN(ksp->ks_raw_bufsize * 2, KSTAT_RAW_MAX);
52
ksp->ks_raw_buf = vmem_alloc(ksp->ks_raw_bufsize, KM_SLEEP);
58
kstat_waitq_enter(kstat_io_t *kiop)
64
delta = new - kiop->wlastupdate;
65
kiop->wlastupdate = new;
68
kiop->wlentime += delta * wcnt;
72
EXPORT_SYMBOL(kstat_waitq_enter);
75
kstat_waitq_exit(kstat_io_t *kiop)
81
delta = new - kiop->wlastupdate;
82
kiop->wlastupdate = new;
84
ASSERT((int)wcnt > 0);
85
kiop->wlentime += delta * wcnt;
88
EXPORT_SYMBOL(kstat_waitq_exit);
91
kstat_runq_enter(kstat_io_t *kiop)
97
delta = new - kiop->rlastupdate;
98
kiop->rlastupdate = new;
101
kiop->rlentime += delta * rcnt;
102
kiop->rtime += delta;
105
EXPORT_SYMBOL(kstat_runq_enter);
108
kstat_runq_exit(kstat_io_t *kiop)
114
delta = new - kiop->rlastupdate;
115
kiop->rlastupdate = new;
117
ASSERT((int)rcnt > 0);
118
kiop->rlentime += delta * rcnt;
119
kiop->rtime += delta;
121
EXPORT_SYMBOL(kstat_runq_exit);
45
124
kstat_seq_show_headers(struct seq_file *f)
47
126
kstat_t *ksp = (kstat_t *)f->private;
48
129
ASSERT(ksp->ks_magic == KS_MAGIC);
50
131
seq_printf(f, "%d %d 0x%02x %d %d %lld %lld\n",
55
136
switch (ksp->ks_type) {
56
137
case KSTAT_TYPE_RAW:
57
seq_printf(f, "raw data");
139
if (ksp->ks_raw_ops.headers) {
140
rc = ksp->ks_raw_ops.headers(
141
ksp->ks_raw_buf, ksp->ks_raw_bufsize);
142
if (rc == ENOMEM && !kstat_resize_raw(ksp))
145
seq_puts(f, ksp->ks_raw_buf);
147
seq_printf(f, "raw data\n");
59
150
case KSTAT_TYPE_NAMED:
60
151
seq_printf(f, "%-31s %-4s %s\n",
81
172
"name", "events", "elapsed",
82
173
"min", "max", "start", "stop");
86
"%-8s %-5s %-13s %-12s %-12s %-8s %-8s "
87
"%-12s %-12s %-12s\n",
88
"txg", "state", "birth",
89
"nread", "nwritten", "reads", "writes",
90
"otime", "qtime", "stime");
93
176
PANIC("Undefined kstat type %d\n", ksp->ks_type);
205
kstat_seq_show_txg(struct seq_file *f, kstat_txg_t *ktp)
209
switch (ktp->state) {
210
case TXG_STATE_OPEN: state = 'O'; break;
211
case TXG_STATE_QUIESCING: state = 'Q'; break;
212
case TXG_STATE_SYNCING: state = 'S'; break;
213
case TXG_STATE_COMMITTED: state = 'C'; break;
214
default: state = '?'; break;
218
"%-8llu %-5c %-13llu %-12llu %-12llu %-8u %-8u "
219
"%12lld %12lld %12lld\n", ktp->txg, state, ktp->birth,
220
ktp->nread, ktp->nwritten, ktp->reads, ktp->writes,
221
ktp->open_time, ktp->quiesce_time, ktp->sync_time);
226
290
kstat_seq_show(struct seq_file *f, void *p)
228
292
kstat_t *ksp = (kstat_t *)f->private;
233
297
switch (ksp->ks_type) {
234
298
case KSTAT_TYPE_RAW:
235
ASSERT(ksp->ks_ndata == 1);
236
rc = kstat_seq_show_raw(f, ksp->ks_data,
300
if (ksp->ks_raw_ops.data) {
301
rc = ksp->ks_raw_ops.data(
302
ksp->ks_raw_buf, ksp->ks_raw_bufsize, p);
303
if (rc == ENOMEM && !kstat_resize_raw(ksp))
306
seq_puts(f, ksp->ks_raw_buf);
308
ASSERT(ksp->ks_ndata == 1);
309
rc = kstat_seq_show_raw(f, ksp->ks_data,
239
313
case KSTAT_TYPE_NAMED:
240
314
rc = kstat_seq_show_named(f, (kstat_named_t *)p);
248
322
case KSTAT_TYPE_TIMER:
249
323
rc = kstat_seq_show_timer(f, (kstat_timer_t *)p);
252
rc = kstat_seq_show_txg(f, (kstat_txg_t *)p);
255
326
PANIC("Undefined kstat type %d\n", ksp->ks_type);
262
333
kstat_default_update(kstat_t *ksp, int rw)
264
335
ASSERT(ksp != NULL);
337
if (rw == KSTAT_WRITE)
305
380
ASSERT(ksp->ks_magic == KS_MAGIC);
308
mutex_enter(&ksp->ks_lock);
383
mutex_enter(ksp->ks_lock);
385
if (ksp->ks_type == KSTAT_TYPE_RAW) {
386
ksp->ks_raw_bufsize = PAGE_SIZE;
387
ksp->ks_raw_buf = vmem_alloc(ksp->ks_raw_bufsize, KM_SLEEP);
310
390
/* Dynamically update kstat, on error existing kstats are used */
311
391
(void) ksp->ks_update(ksp, KSTAT_READ);
313
393
ksp->ks_snaptime = gethrtime();
316
kstat_seq_show_headers(f);
395
if (!n && kstat_seq_show_headers(f))
318
398
if (n >= ksp->ks_ndata)
339
419
kstat_seq_stop(struct seq_file *f, void *v)
341
kstat_t *ksp = (kstat_t *)f->private;
342
ASSERT(ksp->ks_magic == KS_MAGIC);
344
mutex_exit(&ksp->ks_lock);
421
kstat_t *ksp = (kstat_t *)f->private;
422
ASSERT(ksp->ks_magic == KS_MAGIC);
424
if (ksp->ks_type == KSTAT_TYPE_RAW)
425
vmem_free(ksp->ks_raw_buf, ksp->ks_raw_bufsize);
427
mutex_exit(ksp->ks_lock);
347
430
static struct seq_operations kstat_seq_ops = {
495
proc_kstat_write(struct file *filp, const char __user *buf,
496
size_t len, loff_t *ppos)
498
struct seq_file *f = filp->private_data;
499
kstat_t *ksp = f->private;
502
ASSERT(ksp->ks_magic == KS_MAGIC);
504
mutex_enter(ksp->ks_lock);
505
rc = ksp->ks_update(ksp, KSTAT_WRITE);
506
mutex_exit(ksp->ks_lock);
411
515
static struct file_operations proc_kstat_operations = {
412
.open = proc_kstat_open,
415
.release = seq_release,
516
.open = proc_kstat_open,
517
.write = proc_kstat_write,
520
.release = seq_release,
524
__kstat_set_raw_ops(kstat_t *ksp,
525
int (*headers)(char *buf, size_t size),
526
int (*data)(char *buf, size_t size, void *data),
527
void *(*addr)(kstat_t *ksp, loff_t index))
529
ksp->ks_raw_ops.headers = headers;
530
ksp->ks_raw_ops.data = data;
531
ksp->ks_raw_ops.addr = addr;
533
EXPORT_SYMBOL(__kstat_set_raw_ops);
419
536
__kstat_create(const char *ks_module, int ks_instance, const char *ks_name,
420
537
const char *ks_class, uchar_t ks_type, uint_t ks_ndata,
440
557
mutex_exit(&kstat_module_lock);
442
559
ksp->ks_magic = KS_MAGIC;
443
mutex_init(&ksp->ks_lock, NULL, MUTEX_DEFAULT, NULL);
560
mutex_init(&ksp->ks_private_lock, NULL, MUTEX_DEFAULT, NULL);
561
ksp->ks_lock = &ksp->ks_private_lock;
444
562
INIT_LIST_HEAD(&ksp->ks_list);
446
564
ksp->ks_crtime = gethrtime();
453
571
ksp->ks_flags = ks_flags;
454
572
ksp->ks_update = kstat_default_update;
455
573
ksp->ks_private = NULL;
574
ksp->ks_raw_ops.headers = NULL;
575
ksp->ks_raw_ops.data = NULL;
576
ksp->ks_raw_ops.addr = NULL;
577
ksp->ks_raw_buf = NULL;
578
ksp->ks_raw_bufsize = 0;
457
580
switch (ksp->ks_type) {
458
581
case KSTAT_TYPE_RAW:
475
598
ksp->ks_ndata = ks_ndata;
476
599
ksp->ks_data_size = ks_ndata * sizeof(kstat_timer_t);
479
ksp->ks_ndata = ks_ndata;
480
ksp->ks_data_size = ks_ndata * sizeof(kstat_timer_t);
483
602
PANIC("Undefined kstat type %d\n", ksp->ks_type);
486
605
if (ksp->ks_flags & KSTAT_FLAG_VIRTUAL) {
487
606
ksp->ks_data = NULL;
489
ksp->ks_data = kmem_alloc(ksp->ks_data_size, KM_SLEEP);
608
ksp->ks_data = kmem_zalloc(ksp->ks_data_size, KM_SLEEP);
490
609
if (ksp->ks_data == NULL) {
491
610
kmem_free(ksp, sizeof(*ksp));
525
644
list_add_tail(&ksp->ks_list, &module->ksm_kstat_list);
527
mutex_enter(&ksp->ks_lock);
646
mutex_enter(ksp->ks_lock);
528
647
ksp->ks_owner = module;
529
ksp->ks_proc = proc_create_data(ksp->ks_name, 0444,
648
ksp->ks_proc = proc_create_data(ksp->ks_name, 0644,
530
649
module->ksm_proc, &proc_kstat_operations, (void *)ksp);
531
650
if (ksp->ks_proc == NULL) {
532
651
list_del_init(&ksp->ks_list);
533
652
if (list_empty(&module->ksm_kstat_list))
534
653
kstat_delete_module(module);
536
mutex_exit(&ksp->ks_lock);
655
mutex_exit(ksp->ks_lock);
538
657
mutex_exit(&kstat_module_lock);
559
678
if (!(ksp->ks_flags & KSTAT_FLAG_VIRTUAL))
560
679
kmem_free(ksp->ks_data, ksp->ks_data_size);
562
mutex_destroy(&ksp->ks_lock);
682
mutex_destroy(&ksp->ks_private_lock);
563
683
kmem_free(ksp, sizeof(*ksp));