Thread (5 messages) 5 messages, 4 authors, 2005-02-28

Re: [ patch 1/7] drivers/serial/jsm: new serial device driver

From: Jeff Garzik <hidden>
Date: 2005-02-28 00:52:59
Also in: lkml

Kyle Moffett wrote:
On Feb 27, 2005, at 18:38, Wen Xiong wrote:
quoted
+/*
+ * jsm_init_globals()
+ *
+ * This is where we initialize the globals from the static insmod
+ * configuration variables.  These are declared near the head of
+ * this file.
+ */
+static void jsm_init_globals(void)
+{
+    int i = 0;
+
+    jsm_rawreadok        = rawreadok;
+    jsm_trcbuf_size        = trcbuf_size;
+    jsm_debug        = debug;
+
+    for (i = 0; i < MAXBOARDS; i++) {
+        jsm_Board[i] = NULL;
+        jsm_board_slot[i] = (char *)kmalloc(20, GFP_KERNEL);
+        memset(jsm_board_slot[i], 0, 20);
+    }

Instead of several 20-byte kmallocs, you could help reduce memory
usage and fragmentation with something like this:

static void *jsm_board_slot_mem;

jsm_board_slot_mem = kmalloc(20*MAXBOARDS, GFP_KERNEL);
memset(jsm_board_slot_mem, 0, 20*MAXBOARDS)
for (i = 0; i < MAXBOARDS; i++) {
    jsm_Board[i] = NULL;
    jsm_board_slot[i] = &jsm_board_slot_mem[20*i];
}

Then free like this:
kfree(jsm_board_slot_mem);
Agree with your initial comment, but you missed an overall point: 
MAXBOARDS must be eliminated completely.  We do not impose such limits 
in Linux.

Information should be allocated on a per-device basis.

On the other hand, it might be nice to have all these structures
dynamically allocated, so that the no-boards case only uses the 8 or
16 bytes of RAM required for a struct list_head.  In that case you
could clump the other board info into a single struct instead of
multiple independent static arrays.  Something like this might work:

struct jsm_board_instance {
    struct list_head board_list;
    struct board_t board;
    char slot[20];
    [...etc...]
};
static struct list_head jsm_board_list = LIST_HEAD_INIT(jsm_board_list);
static spinlock_t jsm_board_list_lock = SPIN_LOCK_UNLOCKED;

Then when doing hardware add/remove, take the lock and do the list
manipulation, then unlock.
Correct-a-mundo!

This is the way it should be done.

	Jeff

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help