[ Date Index ][
Thread Index ]
[ <= Previous by date /
thread ]
[ Next by date /
thread => ]
On Wednesday 11 August 2004 14:48, Andrew Rogers wrote:
I have a kernel module that must output a lot of info, a few megabytes. As I can't write to a file from a kernel module I write the output to /var/log/messages using printk(). The problem is that after I have called printk() a few thousand times it stops printting to /var/log/messages and restarts printting some time later. It is very likely that I am calling printk too often in a short time interval. How can I ensure that printk() has output to /var/log/messages before calling printk() again?
I don't think you can.
I've just had a look at printk(). You'll be disappointed at the size of the
log buffer(s) :
#if defined(CONFIG_MULTIQUAD) || defined(CONFIG_IA64)
#define LOG_BUF_LEN (65536)
#elif defined(CONFIG_ARCH_S390)
#define LOG_BUF_LEN (131072)
#elif defined(CONFIG_SMP)
#define LOG_BUF_LEN (32768)
#else
#define LOG_BUF_LEN (16384) /* This must be a power of two */
#endif
Told you so.
You'll be doubly disappointed that the code that actually puts bytes into the
log buffer looks like this :
static void emit_log_char(char c)
{
LOG_BUF(log_end) = c;
log_end++;
if (log_end - log_start > LOG_BUF_LEN)
log_start = log_end - LOG_BUF_LEN;
if (log_end - con_start > LOG_BUF_LEN)
con_start = log_end - LOG_BUF_LEN;
if (logged_chars < LOG_BUF_LEN)
logged_chars++;
}
i.e it's a circular buffer, and the ends are not protected.
So - you can either :
1) write a new version of printk with sensible buffer handling :-),
2) (if this is quick-and-dirty and internal to your organisation...) redefine
LOG_BUF_LEN to something sufficiently big to make the problem go away and
recompile the kernel,
3) (I don't know if this is a possible solution for you, 'cause I don't know
what you're doing ...) implement a /proc filesystem interface and write some
user code to query it.
4) enter a world of pain. :-(
(this is usually where someone comes along and offers a brilliantly simple
solution that I haven't thought of ...)
jd
--
John Daragon argv[0] limited john@xxxxxxxxxx
Lambs Lawn Cottage, Staple Fitzpaine, Taunton TA3 5SL, UK
(house) 01460 234537 (office) 01460 234068
(mobile) 07836 576127 (fax) 01460 234069
--
The Mailing List for the Devon & Cornwall LUG
Mail majordomo@xxxxxxxxxxxx with "unsubscribe list" in the
message body to unsubscribe.