diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2010-02-04 19:47:29 -0500 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-29 17:27:29 -0400 |
commit | 0c1a489cb92c996d50adfb84fee5edd7205e0c1b (patch) | |
tree | adf44d3379cb7b7aca57fcb607e766be3aad80a0 /litmus/sched_trace.c | |
parent | 8815090d72fe0fe8f5f67e3bcc8fbe7a5ad1704d (diff) |
Used miscdevice API for sched_trace
This patch changes sched_trace.c to use the miscdevice API
instead of doing all the cdev management ourselves. This remove a
chunk of code and we get sysfs / udev integration for free.
On systems with default udev rules, this will result in a /dev/litmus/log
device being created automatically.
Diffstat (limited to 'litmus/sched_trace.c')
-rw-r--r-- | litmus/sched_trace.c | 72 |
1 files changed, 17 insertions, 55 deletions
diff --git a/litmus/sched_trace.c b/litmus/sched_trace.c index 87e725a35eb3..ad0b138d4b01 100644 --- a/litmus/sched_trace.c +++ b/litmus/sched_trace.c | |||
@@ -5,7 +5,7 @@ | |||
5 | #include <linux/semaphore.h> | 5 | #include <linux/semaphore.h> |
6 | 6 | ||
7 | #include <linux/fs.h> | 7 | #include <linux/fs.h> |
8 | #include <linux/cdev.h> | 8 | #include <linux/miscdevice.h> |
9 | #include <asm/uaccess.h> | 9 | #include <asm/uaccess.h> |
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/sysrq.h> | 11 | #include <linux/sysrq.h> |
@@ -15,6 +15,8 @@ | |||
15 | #include <litmus/sched_trace.h> | 15 | #include <litmus/sched_trace.h> |
16 | #include <litmus/litmus.h> | 16 | #include <litmus/litmus.h> |
17 | 17 | ||
18 | #define SCHED_TRACE_NAME "litmus/log" | ||
19 | |||
18 | /* Allocate a buffer of about 32k per CPU */ | 20 | /* Allocate a buffer of about 32k per CPU */ |
19 | #define LITMUS_TRACE_BUF_PAGES 8 | 21 | #define LITMUS_TRACE_BUF_PAGES 8 |
20 | #define LITMUS_TRACE_BUF_SIZE (PAGE_SIZE * LITMUS_TRACE_BUF_PAGES * NR_CPUS) | 22 | #define LITMUS_TRACE_BUF_SIZE (PAGE_SIZE * LITMUS_TRACE_BUF_PAGES * NR_CPUS) |
@@ -25,14 +27,6 @@ | |||
25 | /* Max length for one write --- from kernel --- to the buffer */ | 27 | /* Max length for one write --- from kernel --- to the buffer */ |
26 | #define MSG_SIZE 255 | 28 | #define MSG_SIZE 255 |
27 | 29 | ||
28 | /* | ||
29 | * Major number for the tracing char device. | ||
30 | * the major numbes are from the unassigned/local use block | ||
31 | * | ||
32 | * set MAJOR to 0 to have it dynamically assigned | ||
33 | */ | ||
34 | #define LOG_MAJOR 251 | ||
35 | |||
36 | /* Inner ring buffer structure */ | 30 | /* Inner ring buffer structure */ |
37 | typedef struct { | 31 | typedef struct { |
38 | rwlock_t del_lock; | 32 | rwlock_t del_lock; |
@@ -316,54 +310,18 @@ static int log_release(struct inode *in, struct file *filp) | |||
316 | * | 310 | * |
317 | * Except for opening the device file it uses the same operations as trace_fops. | 311 | * Except for opening the device file it uses the same operations as trace_fops. |
318 | */ | 312 | */ |
319 | struct file_operations log_fops = { | 313 | static struct file_operations log_fops = { |
320 | .owner = THIS_MODULE, | 314 | .owner = THIS_MODULE, |
321 | .open = log_open, | 315 | .open = log_open, |
322 | .release = log_release, | 316 | .release = log_release, |
323 | .read = log_read, | 317 | .read = log_read, |
324 | }; | 318 | }; |
325 | 319 | ||
326 | /* | 320 | static struct miscdevice litmus_log_dev = { |
327 | * Device registration | 321 | .name = SCHED_TRACE_NAME, |
328 | */ | 322 | .minor = MISC_DYNAMIC_MINOR, |
329 | static int __init register_buffer_dev(const char* name, | 323 | .fops = &log_fops, |
330 | struct file_operations* fops, | 324 | }; |
331 | int major, int count) | ||
332 | { | ||
333 | dev_t trace_dev; | ||
334 | struct cdev *cdev; | ||
335 | int error = 0; | ||
336 | |||
337 | if(major) { | ||
338 | trace_dev = MKDEV(major, 0); | ||
339 | error = register_chrdev_region(trace_dev, count, name); | ||
340 | } else { | ||
341 | /* dynamically allocate major number */ | ||
342 | error = alloc_chrdev_region(&trace_dev, 0, count, name); | ||
343 | major = MAJOR(trace_dev); | ||
344 | } | ||
345 | if (error) { | ||
346 | printk(KERN_WARNING "sched trace: " | ||
347 | "Could not register major/minor number %d\n", major); | ||
348 | return error; | ||
349 | } | ||
350 | cdev = cdev_alloc(); | ||
351 | if (!cdev) { | ||
352 | printk(KERN_WARNING "sched trace: " | ||
353 | "Could not get a cdev for %s.\n", name); | ||
354 | return -ENOMEM; | ||
355 | } | ||
356 | cdev->owner = THIS_MODULE; | ||
357 | cdev->ops = fops; | ||
358 | error = cdev_add(cdev, trace_dev, count); | ||
359 | if (error) { | ||
360 | printk(KERN_WARNING "sched trace: " | ||
361 | "add_cdev failed for %s.\n", name); | ||
362 | return -ENOMEM; | ||
363 | } | ||
364 | return error; | ||
365 | |||
366 | } | ||
367 | 325 | ||
368 | #ifdef CONFIG_MAGIC_SYSRQ | 326 | #ifdef CONFIG_MAGIC_SYSRQ |
369 | void dump_trace_buffer(int max) | 327 | void dump_trace_buffer(int max) |
@@ -372,7 +330,7 @@ void dump_trace_buffer(int max) | |||
372 | int len; | 330 | int len; |
373 | int count = 0; | 331 | int count = 0; |
374 | 332 | ||
375 | /* potentially, but very unlikely race... */ | 333 | /* potential, but very unlikely, race... */ |
376 | trace_recurse = 1; | 334 | trace_recurse = 1; |
377 | while ((max == 0 || count++ < max) && | 335 | while ((max == 0 || count++ < max) && |
378 | (len = rb_get(&log_buffer.buf, line, sizeof(line) - 1)) > 0) { | 336 | (len = rb_get(&log_buffer.buf, line, sizeof(line) - 1)) > 0) { |
@@ -408,9 +366,13 @@ static int __init init_sched_trace(void) | |||
408 | #endif | 366 | #endif |
409 | 367 | ||
410 | 368 | ||
411 | return register_buffer_dev("litmus_log", &log_fops, | 369 | return misc_register(&litmus_log_dev); |
412 | LOG_MAJOR, 1); | ||
413 | } | 370 | } |
414 | 371 | ||
415 | module_init(init_sched_trace); | 372 | static void __exit exit_sched_trace(void) |
373 | { | ||
374 | misc_deregister(&litmus_log_dev); | ||
375 | } | ||
416 | 376 | ||
377 | module_init(init_sched_trace); | ||
378 | module_exit(exit_sched_trace); | ||