codesite...@google.com
unread,Nov 23, 2008, 9:18:55 PM11/23/08Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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)