Hi Oct 13, 2025, 19:41 by [email protected]:
> Hello, > > [email protected], le lun. 13 oct. 2025 21:13:01 +0200, a ecrit: > >> Another thing for the streamio change is that my current patch does not work >> when there is a both an input and an output buffer. >> >> Can this happen? >> > > Yes, see the open_hook which allows both modes at the same time. > >> If yes do you have an idea on how to resolve this? >> > > What issue do you actually get? From a quick glance it doesn't look > like calling start_input/output spuriously would really pose problem? > I have not actually tried it. I thought that start_input/start_output (without nowait) will block waiting for the response. I probably confused this with dev_read/dev_write in my head. > Samuel > >> Sep 28, 2025, 19:32 by [email protected]: >> >> > [email protected], le dim. 28 sept. 2025 20:37:01 +0200, a ecrit: >> > >> >> >> >> >> >> >> >> Sep 25, 2025, 21:02 by [email protected]: >> >> >> >> > Hello, >> >> > >> >> > [email protected], le jeu. 25 sept. 2025 13:11:07 +0200, a ecrit: >> >> > >> >> >> Hi SamuelI found something in kmsg_putchar. >> >> >> >> >> >> if kmsg_write_offset +1 == kmsg_read_offset (mod KMSGBUFFSIZE) >> >> >> it just discards the character which leads to the previous message >> >> >> being malformed. >> >> >> >> >> > >> >> > Which is kind of expected: we are overflowing. >> >> > >> >> >> Should it in that case also terminate the current message by setting >> >> >> the previously written char (at kmsg_write_offset -1 mod >> >> >> KMSGBUFFERSIZE) to \n ? >> >> >> >> >> > >> >> > I'd rather not alter the content. >> >> > >> >> >> I tried this patch and it fixes the problem. Some messages are being >> >> >> lost but I don't know what else to do with them. (i am reusing the >> >> >> offset variable that is not needed anymore) >> >> >> I guess I encounter this because at boot time a lot of messages are >> >> >> being written to the buffer in a short time before the syslogd can >> >> >> start emptying them so increasing the buffer prevents the early >> >> >> wraparound. >> >> >> >> >> > >> >> > Yes, there is no way around that issue except increasing the buffer size >> >> > if our boot log is indeed quite verbose (we can indeed do that). Perhaps >> >> > we'd rather instead drop some messages which are not really that useful. >> >> > >> >> >> >> I am overflowing by just a couple of messages, with the increased buffer >> >> I can read 4438 bytes. >> >> > That being said, dropping the latest characters being put might not be >> >> > the best, I'd rather say drop the oldest characters so that you are sure >> >> > you have the latest information. And then you'll have '\n'. >> >> > >> >> This essentially means writing the char as usual but when after that >> >> write and read offset are equal incrementing the read offset as well. >> >> >> >> Something like this? >> >> >> > >> > Yes, exactly. >> > >> > Samuel >> > >> >> --8<---------------cut here---------------start------------->8--- >> >> diff --git a/device/kmsg.c b/device/kmsg.c >> >> index e5b518e6..bb72930d 100644 >> >> --- a/device/kmsg.c >> >> +++ b/device/kmsg.c >> >> @@ -217,7 +217,6 @@ void >> >> kmsg_putchar (int c) >> >> { >> >> io_req_t ior; >> >> - int offset; >> >> spl_t s = -1; >> >> >> >> /* XXX: cninit is not called before cnputc is used. So call kmsginit >> >> @@ -230,22 +229,20 @@ kmsg_putchar (int c) >> >> >> >> if (spl_init) >> >> s = simple_lock_irq (&kmsg_lock); >> >> - offset = kmsg_write_offset + 1; >> >> - if (offset == KMSGBUFSIZE) >> >> - offset = 0; >> >> - >> >> - if (offset == kmsg_read_offset) >> >> - { >> >> - /* Discard C. */ >> >> - if (spl_init) >> >> - simple_unlock_irq (s, &kmsg_lock); >> >> - return; >> >> - } >> >> >> >> kmsg_buffer[kmsg_write_offset++] = c; >> >> if (kmsg_write_offset == KMSGBUFSIZE) >> >> kmsg_write_offset = 0; >> >> >> >> + if(kmsg_write_offset == kmsg_read_offset) >> >> + { >> >> + /* Drop first unread char */ >> >> + kmsg_read_offset++; >> >> + if (kmsg_read_offset == KMSGBUFSIZE) >> >> + kmsg_read_offset = 0; >> >> + } >> >> + >> >> + >> >> while ((ior = (io_req_t) dequeue_head (&kmsg_read_queue)) != NULL) >> >> iodone (ior); >> >> --8<---------------cut here---------------end--------------->8--- >> >> >> >> I think I would also prefer this over just dropping the character. >> >> >> >> >> >> > Samuel >> >> > >> >> >> > >> > -- >> > Samuel >> > /* >> > * Oops. The kernel tried to access some bad page. We'll have to >> > * terminate things with extreme prejudice. >> > */ >> > die_if_kernel("Oops", regs, error_code); >> > (From linux/arch/i386/mm/fault.c) >> > >> > > -- > Samuel > --- christ gives channel operator status to Dieu > -+- #ens-mim and hell -+- >
