2 * drivers/misc/logger.c
6 * Copyright (C) 2007-2008 Google, Inc.
8 * Robert Love <rlove@google.com>
10 * This software is licensed under the terms of the GNU General Public
11 * License version 2, as published by the Free Software Foundation, and
12 * may be copied, distributed, and modified under those terms.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
20 #define pr_fmt(fmt) "logger: " fmt
22 #include <linux/sched.h>
23 #include <linux/module.h>
25 #include <linux/miscdevice.h>
26 #include <linux/uaccess.h>
27 #include <linux/poll.h>
28 #include <linux/slab.h>
29 #include <linux/time.h>
30 #include <linux/vmalloc.h>
33 #include <asm/ioctls.h>
36 * struct logger_log - represents a specific log, such as 'main' or 'radio'
38 * This structure lives from module insertion until module removal, so it does
39 * not need additional reference counting. The structure is protected by the
43 unsigned char *buffer
;/* the ring buffer itself */
44 struct miscdevice misc
; /* misc device representing the log */
45 wait_queue_head_t wq
; /* wait queue for readers */
46 struct list_head readers
; /* this log's readers */
47 struct mutex mutex
; /* mutex protecting buffer */
48 size_t w_off
; /* current write head offset */
49 size_t head
; /* new readers start here */
50 size_t size
; /* size of the log */
51 struct list_head logs
; /* list of log channels (myself)*/
54 static LIST_HEAD(log_list
);
58 * struct logger_reader - a logging device open for reading
60 * This object lives from open to release, so we don't need additional
61 * reference counting. The structure is protected by log->mutex.
63 struct logger_reader
{
64 struct logger_log
*log
; /* associated log */
65 struct list_head list
; /* entry in logger_log's list */
66 size_t r_off
; /* current read head offset */
69 /* logger_offset - returns index 'n' into the log via (optimized) modulus */
70 static size_t logger_offset(struct logger_log
*log
, size_t n
)
72 return n
& (log
->size
- 1);
77 * file_get_log - Given a file structure, return the associated log
79 * This isn't aesthetic. We have several goals:
81 * 1) Need to quickly obtain the associated log during an I/O operation
82 * 2) Readers need to maintain state (logger_reader)
83 * 3) Writers need to be very fast (open() should be a near no-op)
85 * In the reader case, we can trivially go file->logger_reader->logger_log.
86 * For a writer, we don't want to maintain a logger_reader, so we just go
87 * file->logger_log. Thus what file->private_data points at depends on whether
88 * or not the file was opened for reading. This function hides that dirtiness.
90 static inline struct logger_log
*file_get_log(struct file
*file
)
92 if (file
->f_mode
& FMODE_READ
) {
93 struct logger_reader
*reader
= file
->private_data
;
96 return file
->private_data
;
100 * get_entry_len - Grabs the length of the payload of the next entry starting
103 * An entry length is 2 bytes (16 bits) in host endian order.
104 * In the log, the length does not include the size of the log entry structure.
105 * This function returns the size including the log entry structure.
107 * Caller needs to hold log->mutex.
109 static __u32
get_entry_len(struct logger_log
*log
, size_t off
)
113 /* copy 2 bytes from buffer, in memcpy order, */
114 /* handling possible wrap at end of buffer */
116 ((__u8
*)&val
)[0] = log
->buffer
[off
];
117 if (likely(off
+1 < log
->size
))
118 ((__u8
*)&val
)[1] = log
->buffer
[off
+1];
120 ((__u8
*)&val
)[1] = log
->buffer
[0];
122 return sizeof(struct logger_entry
) + val
;
126 * do_read_log_to_user - reads exactly 'count' bytes from 'log' into the
127 * user-space buffer 'buf'. Returns 'count' on success.
129 * Caller must hold log->mutex.
131 static ssize_t
do_read_log_to_user(struct logger_log
*log
,
132 struct logger_reader
*reader
,
139 * We read from the log in two disjoint operations. First, we read from
140 * the current read head offset up to 'count' bytes or to the end of
141 * the log, whichever comes first.
143 len
= min(count
, log
->size
- reader
->r_off
);
144 if (copy_to_user(buf
, log
->buffer
+ reader
->r_off
, len
))
148 * Second, we read any remaining bytes, starting back at the head of
152 if (copy_to_user(buf
+ len
, log
->buffer
, count
- len
))
155 reader
->r_off
= logger_offset(log
, reader
->r_off
+ count
);
161 * logger_read - our log's read() method
166 * - If there are no log entries to read, blocks until log is written to
167 * - Atomically reads exactly one log entry
169 * Optimal read size is LOGGER_ENTRY_MAX_LEN. Will set errno to EINVAL if read
170 * buffer is insufficient to hold next entry.
172 static ssize_t
logger_read(struct file
*file
, char __user
*buf
,
173 size_t count
, loff_t
*pos
)
175 struct logger_reader
*reader
= file
->private_data
;
176 struct logger_log
*log
= reader
->log
;
182 mutex_lock(&log
->mutex
);
184 prepare_to_wait(&log
->wq
, &wait
, TASK_INTERRUPTIBLE
);
186 ret
= (log
->w_off
== reader
->r_off
);
187 mutex_unlock(&log
->mutex
);
191 if (file
->f_flags
& O_NONBLOCK
) {
196 if (signal_pending(current
)) {
204 finish_wait(&log
->wq
, &wait
);
208 mutex_lock(&log
->mutex
);
210 /* is there still something to read or did we race? */
211 if (unlikely(log
->w_off
== reader
->r_off
)) {
212 mutex_unlock(&log
->mutex
);
216 /* get the size of the next entry */
217 ret
= get_entry_len(log
, reader
->r_off
);
223 /* get exactly one entry from the log */
224 ret
= do_read_log_to_user(log
, reader
, buf
, ret
);
227 mutex_unlock(&log
->mutex
);
233 * get_next_entry - return the offset of the first valid entry at least 'len'
236 * Caller must hold log->mutex.
238 static size_t get_next_entry(struct logger_log
*log
, size_t off
, size_t len
)
243 size_t nr
= get_entry_len(log
, off
);
244 off
= logger_offset(log
, off
+ nr
);
246 } while (count
< len
);
252 * is_between - is a < c < b, accounting for wrapping of a, b, and c
253 * positions in the buffer
255 * That is, if a<b, check for c between a and b
256 * and if a>b, check for c outside (not between) a and b
258 * |------- a xxxxxxxx b --------|
261 * |xxxxx b --------- a xxxxxxxxx|
265 static inline int is_between(size_t a
, size_t b
, size_t c
)
268 /* is c between a and b? */
272 /* is c outside of b through a? */
281 * fix_up_readers - walk the list of all readers and "fix up" any who were
282 * lapped by the writer; also do the same for the default "start head".
283 * We do this by "pulling forward" the readers and start head to the first
284 * entry after the new write head.
286 * The caller needs to hold log->mutex.
288 static void fix_up_readers(struct logger_log
*log
, size_t len
)
290 size_t old
= log
->w_off
;
291 size_t new = logger_offset(log
, old
+ len
);
292 struct logger_reader
*reader
;
294 if (is_between(old
, new, log
->head
))
295 log
->head
= get_next_entry(log
, log
->head
, len
);
297 list_for_each_entry(reader
, &log
->readers
, list
)
298 if (is_between(old
, new, reader
->r_off
))
299 reader
->r_off
= get_next_entry(log
, reader
->r_off
, len
);
303 * do_write_log - writes 'len' bytes from 'buf' to 'log'
305 * The caller needs to hold log->mutex.
307 static void do_write_log(struct logger_log
*log
, const void *buf
, size_t count
)
311 len
= min(count
, log
->size
- log
->w_off
);
312 memcpy(log
->buffer
+ log
->w_off
, buf
, len
);
315 memcpy(log
->buffer
, buf
+ len
, count
- len
);
317 log
->w_off
= logger_offset(log
, log
->w_off
+ count
);
322 * do_write_log_user - writes 'len' bytes from the user-space buffer 'buf' to
325 * The caller needs to hold log->mutex.
327 * Returns 'count' on success, negative error code on failure.
329 static ssize_t
do_write_log_from_user(struct logger_log
*log
,
330 const void __user
*buf
, size_t count
)
334 len
= min(count
, log
->size
- log
->w_off
);
335 if (len
&& copy_from_user(log
->buffer
+ log
->w_off
, buf
, len
))
339 if (copy_from_user(log
->buffer
, buf
+ len
, count
- len
))
341 * Note that by not updating w_off, this abandons the
342 * portion of the new entry that *was* successfully
343 * copied, just above. This is intentional to avoid
344 * message corruption from missing fragments.
348 log
->w_off
= logger_offset(log
, log
->w_off
+ count
);
354 * logger_aio_write - our write method, implementing support for write(),
355 * writev(), and aio_write(). Writes are our fast path, and we try to optimize
356 * them above all else.
358 static ssize_t
logger_aio_write(struct kiocb
*iocb
, const struct iovec
*iov
,
359 unsigned long nr_segs
, loff_t ppos
)
361 struct logger_log
*log
= file_get_log(iocb
->ki_filp
);
362 size_t orig
= log
->w_off
;
363 struct logger_entry header
;
367 now
= current_kernel_time();
369 header
.pid
= current
->tgid
;
370 header
.tid
= current
->pid
;
371 header
.sec
= now
.tv_sec
;
372 header
.nsec
= now
.tv_nsec
;
373 header
.len
= min_t(size_t, iocb
->ki_left
, LOGGER_ENTRY_MAX_PAYLOAD
);
375 /* null writes succeed, return zero */
376 if (unlikely(!header
.len
))
379 mutex_lock(&log
->mutex
);
382 * Fix up any readers, pulling them forward to the first readable
383 * entry after (what will be) the new write offset. We do this now
384 * because if we partially fail, we can end up with clobbered log
385 * entries that encroach on readable buffer.
387 fix_up_readers(log
, sizeof(struct logger_entry
) + header
.len
);
389 do_write_log(log
, &header
, sizeof(struct logger_entry
));
391 while (nr_segs
-- > 0) {
395 /* figure out how much of this vector we can keep */
396 len
= min_t(size_t, iov
->iov_len
, header
.len
- ret
);
398 /* write out this segment's payload */
399 nr
= do_write_log_from_user(log
, iov
->iov_base
, len
);
400 if (unlikely(nr
< 0)) {
402 mutex_unlock(&log
->mutex
);
410 mutex_unlock(&log
->mutex
);
412 /* wake up any blocked readers */
413 wake_up_interruptible(&log
->wq
);
418 static struct logger_log
*get_log_from_minor(int minor
)
420 struct logger_log
*log
;
422 list_for_each_entry(log
, &log_list
, logs
)
423 if (log
->misc
.minor
== minor
)
429 * logger_open - the log's open() file operation
431 * Note how near a no-op this is in the write-only case. Keep it that way!
433 static int logger_open(struct inode
*inode
, struct file
*file
)
435 struct logger_log
*log
;
438 ret
= nonseekable_open(inode
, file
);
442 log
= get_log_from_minor(MINOR(inode
->i_rdev
));
446 if (file
->f_mode
& FMODE_READ
) {
447 struct logger_reader
*reader
;
449 reader
= kmalloc(sizeof(struct logger_reader
), GFP_KERNEL
);
454 INIT_LIST_HEAD(&reader
->list
);
456 mutex_lock(&log
->mutex
);
457 reader
->r_off
= log
->head
;
458 list_add_tail(&reader
->list
, &log
->readers
);
459 mutex_unlock(&log
->mutex
);
461 file
->private_data
= reader
;
463 file
->private_data
= log
;
469 * logger_release - the log's release file operation
471 * Note this is a total no-op in the write-only case. Keep it that way!
473 static int logger_release(struct inode
*ignored
, struct file
*file
)
475 if (file
->f_mode
& FMODE_READ
) {
476 struct logger_reader
*reader
= file
->private_data
;
477 struct logger_log
*log
= reader
->log
;
479 mutex_lock(&log
->mutex
);
480 list_del(&reader
->list
);
481 mutex_unlock(&log
->mutex
);
490 * logger_poll - the log's poll file operation, for poll/select/epoll
492 * Note we always return POLLOUT, because you can always write() to the log.
493 * Note also that, strictly speaking, a return value of POLLIN does not
494 * guarantee that the log is readable without blocking, as there is a small
495 * chance that the writer can lap the reader in the interim between poll()
496 * returning and the read() request.
498 static unsigned int logger_poll(struct file
*file
, poll_table
*wait
)
500 struct logger_reader
*reader
;
501 struct logger_log
*log
;
502 unsigned int ret
= POLLOUT
| POLLWRNORM
;
504 if (!(file
->f_mode
& FMODE_READ
))
507 reader
= file
->private_data
;
510 poll_wait(file
, &log
->wq
, wait
);
512 mutex_lock(&log
->mutex
);
513 if (log
->w_off
!= reader
->r_off
)
514 ret
|= POLLIN
| POLLRDNORM
;
515 mutex_unlock(&log
->mutex
);
520 static long logger_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
)
522 struct logger_log
*log
= file_get_log(file
);
523 struct logger_reader
*reader
;
526 mutex_lock(&log
->mutex
);
529 case LOGGER_GET_LOG_BUF_SIZE
:
532 case LOGGER_GET_LOG_LEN
:
533 if (!(file
->f_mode
& FMODE_READ
)) {
537 reader
= file
->private_data
;
538 if (log
->w_off
>= reader
->r_off
)
539 ret
= log
->w_off
- reader
->r_off
;
541 ret
= (log
->size
- reader
->r_off
) + log
->w_off
;
543 case LOGGER_GET_NEXT_ENTRY_LEN
:
544 if (!(file
->f_mode
& FMODE_READ
)) {
548 reader
= file
->private_data
;
549 if (log
->w_off
!= reader
->r_off
)
550 ret
= get_entry_len(log
, reader
->r_off
);
554 case LOGGER_FLUSH_LOG
:
555 if (!(file
->f_mode
& FMODE_WRITE
)) {
559 list_for_each_entry(reader
, &log
->readers
, list
)
560 reader
->r_off
= log
->w_off
;
561 log
->head
= log
->w_off
;
566 mutex_unlock(&log
->mutex
);
571 static const struct file_operations logger_fops
= {
572 .owner
= THIS_MODULE
,
574 .aio_write
= logger_aio_write
,
576 .unlocked_ioctl
= logger_ioctl
,
577 .compat_ioctl
= logger_ioctl
,
579 .release
= logger_release
,
583 * Log size must be a power of two, greater than LOGGER_ENTRY_MAX_LEN,
584 * and less than LONG_MAX minus LOGGER_ENTRY_MAX_LEN.
586 static int __init
create_log(char *log_name
, int size
)
589 struct logger_log
*log
;
590 unsigned char *buffer
;
592 buffer
= vmalloc(size
);
596 log
= kzalloc(sizeof(struct logger_log
), GFP_KERNEL
);
599 goto out_free_buffer
;
601 log
->buffer
= buffer
;
603 log
->misc
.minor
= MISC_DYNAMIC_MINOR
;
604 log
->misc
.name
= kstrdup(log_name
, GFP_KERNEL
);
605 if (log
->misc
.name
== NULL
) {
610 log
->misc
.fops
= &logger_fops
;
611 log
->misc
.parent
= NULL
;
613 init_waitqueue_head(&log
->wq
);
614 INIT_LIST_HEAD(&log
->readers
);
615 mutex_init(&log
->mutex
);
620 INIT_LIST_HEAD(&log
->logs
);
621 list_add_tail(&log
->logs
, &log_list
);
623 /* finally, initialize the misc device for this log */
624 ret
= misc_register(&log
->misc
);
626 pr_err("failed to register misc device for log '%s'!\n",
631 pr_info("created %luK log '%s'\n",
632 (unsigned long) log
->size
>> 10, log
->misc
.name
);
644 static int __init
logger_init(void)
648 ret
= create_log(LOGGER_LOG_MAIN
, 256*1024);
652 ret
= create_log(LOGGER_LOG_EVENTS
, 256*1024);
656 ret
= create_log(LOGGER_LOG_RADIO
, 256*1024);
660 ret
= create_log(LOGGER_LOG_SYSTEM
, 256*1024);
667 device_initcall(logger_init
);