Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion staging: android: logger: Allocate logs dynamically at boot
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Tim Bird  
View profile  
 More options May 4 2012, 7:40 pm
Newsgroups: linux.kernel
From: Tim Bird <tim.b...@am.sony.com>
Date: Sat, 05 May 2012 01:40:01 +0200
Local: Fri, May 4 2012 7:40 pm
Subject: [PATCH] staging: android: logger: Allocate logs dynamically at boot
This changes the log initialization to be dynamic, but still
at boot time.  These changes are a predecessor to implementing
runtime allocation and freeing of logs, to make the Android logger
less hard-coded.

This makes no ABI changes with user space.

Signed-off-by: Tim Bird <tim.b...@am.sony.com>
---
 drivers/staging/android/logger.c |  117 ++++++++++++++++++++++++--------------
 1 file changed, 75 insertions(+), 42 deletions(-)

diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c
index ea69b6a..fa5fd71 100644
--- a/drivers/staging/android/logger.c
+++ b/drivers/staging/android/logger.c
@@ -25,6 +25,7 @@
 #include <linux/poll.h>
 #include <linux/slab.h>
 #include <linux/time.h>
+#include <linux/vmalloc.h>
 #include "logger.h"

 #include <asm/ioctls.h>
@@ -564,81 +565,113 @@ static const struct file_operations logger_fops = {
        .release = logger_release,
 };

-/*
- * Defines a log structure with name 'NAME' and a size of 'SIZE' bytes, which
- * must be a power of two, greater than LOGGER_ENTRY_MAX_LEN, and less than
- * LONG_MAX minus LOGGER_ENTRY_MAX_LEN.
- */
-#define DEFINE_LOGGER_DEVICE(VAR, NAME, SIZE) \
-static unsigned char _buf_ ## VAR[SIZE]; \
-static struct logger_log VAR = { \
-       .buffer = _buf_ ## VAR, \
-       .misc = { \
-               .minor = MISC_DYNAMIC_MINOR, \
-               .name = NAME, \
-               .fops = &logger_fops, \
-               .parent = NULL, \
-       }, \
-       .wq = __WAIT_QUEUE_HEAD_INITIALIZER(VAR .wq), \
-       .readers = LIST_HEAD_INIT(VAR .readers), \
-       .mutex = __MUTEX_INITIALIZER(VAR .mutex), \
-       .w_off = 0, \
-       .head = 0, \
-       .size = SIZE, \
-};
-
-DEFINE_LOGGER_DEVICE(log_main, LOGGER_LOG_MAIN, 256*1024)
-DEFINE_LOGGER_DEVICE(log_events, LOGGER_LOG_EVENTS, 256*1024)
-DEFINE_LOGGER_DEVICE(log_radio, LOGGER_LOG_RADIO, 256*1024)
-DEFINE_LOGGER_DEVICE(log_system, LOGGER_LOG_SYSTEM, 256*1024)
+#define MAX_LOGS       5
+struct logger_log *logs_array[MAX_LOGS];

 static struct logger_log *get_log_from_minor(int minor)
 {
-       if (log_main.misc.minor == minor)
-               return &log_main;
-       if (log_events.misc.minor == minor)
-               return &log_events;
-       if (log_radio.misc.minor == minor)
-               return &log_radio;
-       if (log_system.misc.minor == minor)
-               return &log_system;
+       int i;
+
+       for (i = 0; i < MAX_LOGS; i++) {
+               if (logs_array[i]->misc.minor == minor)
+                       return logs_array[i];
+       }
        return NULL;
 }

-static int __init init_log(struct logger_log *log)
+static int __init add_log(struct logger_log *log)
 {
-       int ret;
+       int i;

+       for (i = 0; i < MAX_LOGS; i++) {
+               if (logs_array[i] == 0) {
+                       logs_array[i] = log;
+                       return 0;
+               }
+       }
+       return -1;
+}
+
+/*
+ * Log size must be a power of two, greater than LOGGER_ENTRY_MAX_LEN,
+ * and less than LONG_MAX minus LOGGER_ENTRY_MAX_LEN.
+ */
+static int __init create_log(char *log_name, int size)
+{
+       int ret = 0;
+       struct logger_log *log;
+       unsigned char *buffer;
+
+       buffer = vmalloc(size);
+       if (buffer == NULL)
+               return -1;
+
+       log = kzalloc(sizeof(struct logger_log), GFP_KERNEL);
+       if (log == NULL) {
+               ret = -1;
+               goto out_free_buffer;
+       }
+       log->buffer = buffer;
+
+       log->misc.minor = MISC_DYNAMIC_MINOR;
+       log->misc.name = kstrdup(log_name, GFP_KERNEL);
+       if (log->misc.name == NULL) {
+               ret = -1;
+               goto out_free_log;
+       }
+
+       log->misc.fops = &logger_fops;
+       log->misc.parent = NULL;
+
+       init_waitqueue_head(&log->wq);
+       INIT_LIST_HEAD(&log->readers);
+       mutex_init(&log->mutex);
+       log->w_off = 0;
+       log->head = 0;
+       log->size = size;
+
+       ret = add_log(log);
+       if (unlikely(ret))
+               goto out_free_log;
+
+       /* finally, initialize the misc device for this log */
        ret = misc_register(&log->misc);
        if (unlikely(ret)) {
                printk(KERN_ERR "logger: failed to register misc "
                       "device for log '%s'!\n", log->misc.name);
-               return ret;
+               goto out_free_log;
        }

        printk(KERN_INFO "logger: created %luK log '%s'\n",
               (unsigned long) log->size >> 10, log->misc.name);

        return 0;
+
+out_free_log:
+       kfree(log);
+
+out_free_buffer:
+       vfree(buffer);
+       return ret;
 }

 static int __init logger_init(void)
 {
        int ret;

-       ret = init_log(&log_main);
+       ret = create_log(LOGGER_LOG_MAIN, 256*1024);
        if (unlikely(ret))
                goto out;

-       ret = init_log(&log_events);
+       ret = create_log(LOGGER_LOG_EVENTS, 256*1024);
        if (unlikely(ret))
                goto out;

-       ret = init_log(&log_radio);
+       ret = create_log(LOGGER_LOG_RADIO, 256*1024);
        if (unlikely(ret))
                goto out;

-       ret = init_log(&log_system);
+       ret = create_log(LOGGER_LOG_SYSTEM, 256*1024);
        if (unlikely(ret))
                goto out;

--
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.