[lemona commit] r444 - in trunk/driver: . blades

2 views
Skip to first unread message

codesite...@google.com

unread,
Nov 23, 2008, 9:18:55 PM11/23/08
to lemon...@googlegroups.com
Author: barratis
Date: Sun Nov 23 18:18:18 2008
New Revision: 444

Modified:
trunk/driver/blades/string.c
trunk/driver/init.c
trunk/driver/lemona.h
trunk/driver/lemona_blades.h
trunk/driver/lemona_net.h
trunk/driver/lemona_patch.h
trunk/driver/lemona_relay.h
trunk/driver/logging.c
trunk/driver/mixers.c
trunk/driver/net.c
trunk/driver/relay.c

Log:
- changed lemona_relay_log to return void
- fixed the dead lock which was occuring in lemona_net_log, I was
calling lemona_net_cleanup instead of __lemona_net_cleanup
- fixed lemona_zest_get_size & lemona_zest_fill, loop stop condition
weren't taking correctly dual blades in account
- added Laurent to the authors copyright list for the files he changed
- updated init phase to fail if no backends is loaded successfully


Modified: trunk/driver/blades/string.c
==============================================================================
--- trunk/driver/blades/string.c (original)
+++ trunk/driver/blades/string.c Sun Nov 23 18:18:18 2008
@@ -90,7 +90,7 @@

dentry = file->f_dentry;

- /* shall we compute the size or fill the zest ? */
+ /* TODO: shall we compute the size or fill the zest ? */
if (zest == NULL)
{
while (dentry != dentry->d_parent)

Modified: trunk/driver/init.c
==============================================================================
--- trunk/driver/init.c (original)
+++ trunk/driver/init.c Sun Nov 23 18:18:18 2008
@@ -43,7 +43,8 @@

static int __init lemona_init(void)
{
- long err = 0;
+ long err = 0;
+ int backends = 0;
extern atomic_t lemona_activated;

lemona_printk("Initialization for kernel tree " UTS_RELEASE "...\n");
@@ -54,10 +55,13 @@
goto err;
}
err = lemona_relay_init();
- if (err)
- goto err;
+ if (err == 0)
+ ++backends;
err = lemona_net_init();
- if (err < 0)
+ if (err == 0)
+ ++backends;
+
+ if (backends == 0)
goto err;
lemona_printk("Done.\n");
atomic_set(&lemona_activated, 1);

Modified: trunk/driver/lemona.h
==============================================================================
--- trunk/driver/lemona.h (original)
+++ trunk/driver/lemona.h Sun Nov 23 18:18:18 2008
@@ -1,6 +1,6 @@
/*
** This file is part of Lemona.
-** Copyright (C) 2008 Kenfe-Micka�l Laventure
+** Copyright (C) 2008 Kenfe-Micka�l Laventure, Laurent Malvert
**
** The contents of this file are subject to the terms of either the
** GNU General Public License Version 2 ("GPL") or the MIT License
@@ -26,8 +26,8 @@
*/
struct lemona_zest {
/*
- need always to be the first member. This facilitate parsing when a
- zest can find itself cut in two
+ need always to be the first member. This facilitate parsing since a
+ zest can find itself cut across two log files
*/
int size; /* size taken by this zest and args sz/value */

@@ -136,7 +136,7 @@
* Prototypes
*/
extern int lemona_log(int sysnr, int in,
- int argnr, int extnr, ...);
+ int argnr, int extnr, ...);

# endif /* __KERNEL __ */


Modified: trunk/driver/lemona_blades.h
==============================================================================
--- trunk/driver/lemona_blades.h (original)
+++ trunk/driver/lemona_blades.h Sun Nov 23 18:18:18 2008
@@ -21,39 +21,39 @@
* from blades/generics.c
*/
int lemona_blade_integer(struct lemona_zest *zest,
- int isExt, int idx, int off,
- void *fruit1, void *fruit2);
+ int isExt, int idx, int off,
+ void *fruit1, void *fruit2);

int lemona_blade_integer64(struct lemona_zest *zest,
- int isExt, int idx, int off,
- void *fruit1, void *fruit2);
+ int isExt, int idx, int off,
+ void *fruit1, void *fruit2);

int lemona_blade_long(struct lemona_zest *zest,
- int isExt, int idx, int off,
- void *fruit1, void *fruit2);
+ int isExt, int idx, int off,
+ void *fruit1, void *fruit2);

int lemona_blade_long_long(struct lemona_zest *zest,
- int isExt, int idx, int off,
- void *fruit1, void *fruit2);
+ int isExt, int idx, int off,
+ void *fruit1, void *fruit2);

/* this is a dual blade */
int lemona_blade_output_buffer(struct lemona_zest *zest,
- int isExt, int idx, int off,
- void *fruit1, void* fruit2);
+ int isExt, int idx, int off,
+ void *fruit1, void* fruit2);

/* this is a dual blade */
int lemona_blade_output_buffer64(struct lemona_zest *zest,
- int isExt, int idx, int off,
- void *fruit1, void* fruit2);
+ int isExt, int idx, int off,
+ void *fruit1, void* fruit2);

/*
* from blades/string.c
*/
int lemona_blade_string_null(struct lemona_zest *zest,
- int isExt, int idx, int off,
- void __user *str, void *unused);
+ int isExt, int idx, int off,
+ void __user *str, void *unused);
int lemona_blade_string_fd(struct lemona_zest *zest,
- int isExt, int idx, int off,
- void __user *str, void *unused);
+ int isExt, int idx, int off,
+ void __user *str, void *unused);

#endif

Modified: trunk/driver/lemona_net.h
==============================================================================
--- trunk/driver/lemona_net.h (original)
+++ trunk/driver/lemona_net.h Sun Nov 23 18:18:18 2008
@@ -43,6 +43,7 @@

struct lemona_net {
struct mutex lock;
+/* spinlock_t lock; */
unsigned long timeout;

struct sockaddr_in sin;
@@ -57,7 +58,7 @@

struct lemona_net { };

-# define lemona_net_init() 0
+# define lemona_net_init() -1
# define lemona_net_log(x)
# define lemona_net_cleanup()


Modified: trunk/driver/lemona_patch.h
==============================================================================
--- trunk/driver/lemona_patch.h (original)
+++ trunk/driver/lemona_patch.h Sun Nov 23 18:18:18 2008
@@ -1,6 +1,6 @@
/*
** This file is part of Lemona.
-** Copyright (C) 2008 Kenfe-Micka�l Laventure
+** Copyright (C) 2008 Kenfe-Micka�l Laventure, Laurent Malvert
**
** The contents of this file are subject to the terms of either the
** GNU General Public License Version 2 ("GPL") or the MIT License
@@ -77,6 +77,15 @@
# define __lemona_log(sysnr, in, argnr, extnr, ...) lemona_log(sysnr,
in, argnr, extnr, ## __VA_ARGS__)

# endif /* CONFIG_LEMONA_MODULE */
+
+# else /* CONFIG_LEMONA || CONFIG_LEMONA_MODULE */
+
+# define lemona_block_start
+# define lemona_block_end
+
+# define lemona_log_in(sysnr, argnr, extnr, ...)
+# define lemona_log_out(sysnr, argnr, extnr, ...)
+
# endif /* CONFIG_LEMONA || CONFIG_LEMONA_MODULE */

#endif /* _LEMONA_PATCH_H_ */

Modified: trunk/driver/lemona_relay.h
==============================================================================
--- trunk/driver/lemona_relay.h (original)
+++ trunk/driver/lemona_relay.h Sun Nov 23 18:18:18 2008
@@ -78,7 +78,7 @@

int __init lemona_relay_init(void);
void lemona_relay_cleanup(void);
-int lemona_relay_log(const struct lemona_zest *);
+void lemona_relay_log(const struct lemona_zest *);

typedef bool (*lemonarelayisoursfn)(const struct dentry *dentry);
bool lemona_relay_is_ours(const struct dentry *dentry);
@@ -87,9 +87,9 @@

struct lemona_relay { };

-# define lemona_relay_init() 0
+# define lemona_relay_init() -1
# define lemona_relay_cleanup()
-# define lemona_relay_log(z) 0
+# define lemona_relay_log(z)
# define lemona_relay_is_ours(d) false

typedef bool (*lemonarelayisoursfn)(void *);

Modified: trunk/driver/logging.c
==============================================================================
--- trunk/driver/logging.c (original)
+++ trunk/driver/logging.c Sun Nov 23 18:18:18 2008
@@ -20,8 +20,8 @@

#include "lemona.h"

-extern const struct lemona_mixer lemona_mixers[];
-extern const int lemona_mixers_size;
+extern const struct lemona_mixer lemona_mixers[];
+extern const int lemona_mixers_size;

#if defined (CONFIG_LEMONA_MODULE)
atomic_t lemona_clients = ATOMIC_INIT(0);
@@ -48,6 +48,7 @@
int in, va_list ap)
{
int i = 0;
+ int j = 0;
int tmp = 0;
int size = 0;
int bladesnr;
@@ -68,7 +69,7 @@
bladesnr = mixer->out.argnr + mixer->out.extnr;
}
/* one blade for each arg then for each ext */
- for (i = 0; i < bladesnr; i += handlers[i].dual ? 2 : 1)
+ for (i = 0, j = 0; j < bladesnr; j += handlers[i].dual ? 2 : 1, ++i)
{
if (handlers[i].blade == NULL)
{
@@ -120,6 +121,7 @@
va_list ap)
{
int i;
+ int j;
int off = 0;
int ret = 0;
const struct __lemona_mixer_handler *handlers;
@@ -168,7 +170,7 @@
* Lets put our args into our zest
*/
off = (int)((char *)z->args - (char *)z);
- for (i = 0; i < z->argnr; i += handlers[i].dual ? 2 : 1)
+ for (i = 0, j = 0; j < z->argnr; j += handlers[i].dual ? 2 : 1, ++i)
{
arg1 = va_arg(ap, void*);
if (handlers[i].dual == true)
@@ -193,16 +195,17 @@
z->extsz = (int *)((char *)z + off); /* just after the last arg value */
z->exts = z->extsz + z->extnr; /* located right after z->extsz */
off = (int)((char *)z->exts - (char *)z);
- for (i = 0; i < z->extnr; i += handlers[i].dual ? 2 : 1)
+ /* don't reinit i, the idx is correct and take dual blades in account */
+ for (j = 0; j < z->extnr; j += handlers[i].dual ? 2 : 1, ++i)
{
arg1 = va_arg(ap, void*);
- if (handlers[z->argnr + i].dual == true)
+ if (handlers[i].dual == true)
{
arg2 = va_arg(ap, void*);
- ret = handlers[z->argnr + i].blade(z, true, i, off, arg1, arg2);
+ ret = handlers[i].blade(z, true, i, off, arg1, arg2);
}
else
- ret = handlers[z->argnr + i].blade(z, true, i, off, arg1, NULL);
+ ret = handlers[i].blade(z, true, i, off, arg1, NULL);
if (ret < 0)
{
lemona_printk("exts (syscal %i) in: %i blade %i returned %i\n",
@@ -253,8 +256,11 @@
zsz = lemona_zest_get_size(mixer, in, ap);
if (zsz > 0)
{
+ int alignedsz;
+
/* aligned the allocation */
- z = kzalloc(zsz + (zsz % sizeof(int)), GFP_KERNEL);
+ alignedsz = (zsz / sizeof(int) + zsz % sizeof(int)) * sizeof(int);
+ z = kzalloc(alignedsz, GFP_KERNEL);
if (z != NULL)
z->size = zsz;
else

Modified: trunk/driver/mixers.c
==============================================================================
--- trunk/driver/mixers.c (original)
+++ trunk/driver/mixers.c Sun Nov 23 18:18:18 2008
@@ -1,6 +1,6 @@
/*
** This file is part of Lemona.
-** Copyright (C) 2008 Kenfe-Micka�l Laventure
+** Copyright (C) 2008 Kenfe-Micka�l Laventure, Laurent Malvert
**
** The contents of this file are subject to the terms of either the
** GNU General Public License Version 2 ("GPL") or the MIT License

Modified: trunk/driver/net.c
==============================================================================
--- trunk/driver/net.c (original)
+++ trunk/driver/net.c Sun Nov 23 18:18:18 2008
@@ -18,6 +18,10 @@
#include <linux/module.h> /* module_param */

#include <linux/in.h> /* INADDR_LOOPBACK */
+#include <linux/net.h> /* struct socket */
+#include <net/sock.h> /* struct sock */
+
+#include <linux/spinlock.h>

#include "lemona.h"

@@ -98,6 +102,7 @@
lemona_printk("Unable to connect to server: %i\n", ret);
goto out;
}
+ sock->sk->sk_rcvtimeo = 2 * HZ;
lemona_printk("We are now connected to server %s:%d\n",
net_log_addr, net_log_port);
out:
@@ -154,28 +159,40 @@

if (juice->net.sock)
{
- int ret;
- int sent;
- struct kvec kvec = {
- .iov_base = zest,
+ int ret;
+ struct kvec kvec = {
+ .iov_base = zest,
/* Zest are aligned on sizeof(int) */
- .iov_len = zest->size + (zest->size % sizeof(int))
+ .iov_len = (zest->size / sizeof(int)
+ + zest->size % sizeof(int)) * sizeof(int)
+ };
+ struct msghdr hdr = {
+ .msg_flags = /* MSG_DONTWAIT | */ MSG_NOSIGNAL
};
- struct msghdr hdr = { 0 };

- hdr.msg_flags = MSG_NOSIGNAL;
- for (sent = 0; sent != kvec.iov_len; sent += ret)
+ /*
+ * TODO: if the interface used doesn't have an IP
+ * and the link is broken the whole system will freeze.
+ * I have no workaround so far for that. I don't even understand
+ * why the kernel let us connect in the first place...
+ */
+ while (kvec.iov_len > 0)
{
ret = kernel_sendmsg(juice->net.sock, &hdr, &kvec, 1, kvec.iov_len);
- if (ret < 0)
+ if (ret <= 0)
{
- lemona_printk("kernel_sendmsg: unable to send message: %i\n",
- ret);
- lemona_net_cleanup();
+ if (ret == -EAGAIN)
+ continue;
+ __lemona_net_cleanup();
+ if (ret != 0)
+ lemona_printk("kernel_sendmsg: unable to send message: %i\n",
+ ret);
/* this is the time after which we will be able to try again */
juice->net.timeout = jiffies + (NET_LOG_RETRY * HZ);
break;
}
+ kvec.iov_base = (char *)zest + ret;
+ kvec.iov_len = kvec.iov_len - ret;
}
}
mutex_unlock(&(juice->net.lock));

Modified: trunk/driver/relay.c
==============================================================================
--- trunk/driver/relay.c (original)
+++ trunk/driver/relay.c Sun Nov 23 18:18:18 2008
@@ -141,11 +141,12 @@
return (false);
}

-int lemona_relay_log(const struct lemona_zest *zest)
+void lemona_relay_log(const struct lemona_zest *zest)
{
/* Zest are aligned on sizeof(int) */
- relay_write(juice->rchan, zest, zest->size + (zest->size % sizeof(int)));
- return (0);
+ relay_write(juice->rchan, zest,
+ (zest->size / sizeof(int)
+ + zest->size % sizeof(int)) * sizeof(int));
}

void lemona_relay_cleanup(void)
Reply all
Reply to author
Forward
0 new messages