* System V msg queue bugs in latest kernels @ 2001-02-17 18:42 Mark Swanson 2001-02-17 19:03 ` Manfred Spraul 0 siblings, 1 reply; 6+ messages in thread From: Mark Swanson @ 2001-02-17 18:42 UTC (permalink / raw) To: linux-kernel Hello, ipcs (msg) gives incorrect results if used-bytes is above 65536. It stays at 65536 even though messages are being read and removed from the msg queue. The sysv msg queue either ignores the /proc/sys/kernel/msgmnb value if it is above 65536 or simply gets it wrong. Proof: I can place more than msgmnb bytes in a queue. The behavior is not consistent, but 100% reproducable. It's not consistent because if I use messages of about 1000-2000 bytes the msgmnb never gets bigger than 65536 (even if /proc/sys/kernel/msgmnb is set to 1048576 - bug). However, if I use small messages like 13 bytes I can get bizarre (wrong) ipcs results like this: used-bytes messages 65536 65536 Why does Linux ignore the /proc/sys/kernel/msgmnb value - or seem to partly ignore it if it is above 65536? I *really* need this to be around a MB. Is there an undocumented limit here or is this a bug? Thanks. ===== A camel is ugly but useful; it may stink, and it may spit, but it'll get you where you're going. - Larry Wall - __________________________________________________ Do You Yahoo!? Get personalized email addresses from Yahoo! Mail - only $35 a year! http://personal.mail.yahoo.com/ ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: System V msg queue bugs in latest kernels 2001-02-17 18:42 System V msg queue bugs in latest kernels Mark Swanson @ 2001-02-17 19:03 ` Manfred Spraul 2001-02-17 19:22 ` Mark Swanson ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Manfred Spraul @ 2001-02-17 19:03 UTC (permalink / raw) To: Mark Swanson; +Cc: linux-kernel Mark Swanson wrote: > > Hello, > > ipcs (msg) gives incorrect results if used-bytes is above 65536. It > stays at 65536 even though messages are being read and removed from the > msg queue. > I'm testing it. Could you check /proc/sysvipc/msg? I know that several API's have 16-bit numbers, perhaps wrong values are returned to user space. -- Manfred ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: System V msg queue bugs in latest kernels 2001-02-17 19:03 ` Manfred Spraul @ 2001-02-17 19:22 ` Mark Swanson 2001-02-17 19:40 ` Mark Swanson 2001-02-17 20:07 ` Manfred Spraul 2 siblings, 0 replies; 6+ messages in thread From: Mark Swanson @ 2001-02-17 19:22 UTC (permalink / raw) To: Manfred Spraul; +Cc: linux-kernel You are right. /proc/sysvipc/msg is correct. It shows: cbytes: 1048575 qnum: 95325 ipcs shows: used-bytes: 65535 messages: 65535 It's a 16-bit number issue. --- Manfred Spraul <manfred@colorfullife.com> wrote: > Mark Swanson wrote: > > > > Hello, > > > > ipcs (msg) gives incorrect results if used-bytes is above 65536. It > > stays at 65536 even though messages are being read and removed from > the > > msg queue. > > > I'm testing it. > > Could you check /proc/sysvipc/msg? > > I know that several API's have 16-bit numbers, perhaps wrong values > are > returned to user space. > > -- > Manfred ===== A camel is ugly but useful; it may stink, and it may spit, but it'll get you where you're going. - Larry Wall - __________________________________________________ Do You Yahoo!? Get personalized email addresses from Yahoo! Mail - only $35 a year! http://personal.mail.yahoo.com/ ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: System V msg queue bugs in latest kernels 2001-02-17 19:03 ` Manfred Spraul 2001-02-17 19:22 ` Mark Swanson @ 2001-02-17 19:40 ` Mark Swanson 2001-02-17 20:07 ` Manfred Spraul 2 siblings, 0 replies; 6+ messages in thread From: Mark Swanson @ 2001-02-17 19:40 UTC (permalink / raw) To: Manfred Spraul; +Cc: linux-kernel The exact error is in /usr/include/linux/msg.h The three unsigned shorts should be unsigned int instead. Would too many things break if this was changed? Should user-space tools like ipcs be rewritten to use /proc/sysvipc instead? (I notice that my old 2.2.14 kernel doesn't have /proc/sysvipc...) Thanks. /* one msqid structure for each queue on the system */ struct msqid_ds { struct ipc_perm msg_perm; struct msg *msg_first; /* first message on queue */ struct msg *msg_last; /* last message in queue */ __kernel_time_t msg_stime; /* last msgsnd time */ __kernel_time_t msg_rtime; /* last msgrcv time */ __kernel_time_t msg_ctime; /* last change time */ struct wait_queue *wwait; struct wait_queue *rwait; unsigned short msg_cbytes; /* current number of bytes on queue */ unsigned short msg_qnum; /* number of messages in queue */ unsigned short msg_qbytes; /* max number of bytes on queue */ __kernel_ipc_pid_t msg_lspid; /* pid of last msgsnd */ __kernel_ipc_pid_t msg_lrpid; /* last receive pid */ }; ===== A camel is ugly but useful; it may stink, and it may spit, but it'll get you where you're going. - Larry Wall - __________________________________________________ Do You Yahoo!? Get personalized email addresses from Yahoo! Mail - only $35 a year! http://personal.mail.yahoo.com/ ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: System V msg queue bugs in latest kernels 2001-02-17 19:03 ` Manfred Spraul 2001-02-17 19:22 ` Mark Swanson 2001-02-17 19:40 ` Mark Swanson @ 2001-02-17 20:07 ` Manfred Spraul 2 siblings, 0 replies; 6+ messages in thread From: Manfred Spraul @ 2001-02-17 20:07 UTC (permalink / raw) To: Mark Swanson, linux-kernel [-- Attachment #1: Type: text/plain, Size: 979 bytes --] Manfred Spraul wrote: > > Mark Swanson wrote: > > > > Hello, > > > > ipcs (msg) gives incorrect results if used-bytes is above 65536. It > > stays at 65536 even though messages are being read and removed from the > > msg queue. > > Ok, does the value stay at 65536 or 65535? It should stay at 65535 if you use a too old version of util-linux. Please upgrade (see linux/Documentation/Changes) The proc interface at /proc/sysvipc/msg should report the correct numbers. If you want to access values > 65535 from your app you have 2 options: 1) use the new msqid64_ds structure. You must pass IPC_64 to the msgctl call. This is the only option if you need correct 32-bit uids. Check the util-linux source, I don't have sample code. msqid64_ds is only supported by the 2.4 kernel. 2) the old msqid_ds structure also support 32-bit queue length, an unused field was reused. No support for 32-bit uids. #define msg_lqbytes __rwait; I've attached my old sample code. -- Manfred [-- Attachment #2: longqueue.c --] [-- Type: text/plain, Size: 2435 bytes --] /* * This code is public domain sample code. * Written by Manfred Spraul, 1999 * * The application must be started by root or * setuid(root). * * $Header: /pub/cvs/ms/ipcmsg/longqueue.c,v 1.2 1999/10/09 23:27:54 manfreds Exp $ */ #include <sys/msg.h> #include <stdlib.h> #include <stdio.h> #include <string.h> /* result codes: * 0: success * 1: partial success, queue len now USHORT_MAX * 100: invalid parameters. * 101: other error * 256: fatal error, please delete the queue: queue len now 0. */ #define USHORT_MAX 0xFFff struct queuelen { int llen; unsigned short slen; }; struct msqid_ds g_q; #define msg_lqbytes __rwait void failure(char* msg) { printf(" unexpected error in %s.\n",msg); exit(101); } int init_ipc(int id) { int res; res = msgget(id,0); if(res == -1) failure("findkey()"); id = res; res = msgctl(id,IPC_STAT,&g_q); if(res == -1) failure("init_ipc()"); return id; } void get_queuelen(int id, struct queuelen *out) { int res; struct msqid_ds q; res = msgctl(id,IPC_STAT,&q); if(res == -1) failure("get_queuelen()"); out->llen = q.msg_lqbytes; out->slen = q.msg_qbytes; } int set_queuelen(int id, int len) { struct msqid_ds q; memcpy(&q,&g_q,sizeof(q)); if(len > USHORT_MAX) { q.msg_qbytes = 0; q.msg_lqbytes = len; } else { q.msg_qbytes = len; } return msgctl(id,IPC_SET,&q); } int main(int argc,char** argv) { int id; int len; struct queuelen prev; struct queuelen new; printf("longqueue <id> <len>\n"); if(argc != 3) { printf("Invalid parameters.\n"); return 100; } id = atoi(argv[1]); len = atoi(argv[2]); if(len <= 0) { printf("Invalid parameters.\n"); return 100; } id = init_ipc(id); get_queuelen(id,&prev); if(set_queuelen(id,len) == -1) failure("set_queuelen()"); if(len <= USHORT_MAX) { out_success: get_queuelen(id,&prev); printf(" new queuelen: (%d,%d).\n",prev.slen,prev.llen); return 0; } /* the old Linux ipcmsg code doesn't support * long queues. It interprets this as "queue len 0". * Check for this, and try USHORT_MAX, then the original * value. */ get_queuelen(id,&new); if(new.slen != 0) goto out_success; if(set_queuelen(id,USHORT_MAX) == -1) { if(set_queuelen(id,prev.slen) == -1) { printf(" fatal error. queue len now 0.\n"); return 256; }; failure("set_queuelen()"); } get_queuelen(id,&new); printf(" new queuelen: (%d,%d).\n",prev.slen,prev.llen); return 1; } ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: System V msg queue bugs in latest kernels
@ 2001-02-17 23:53 Christopher Allen Wing
0 siblings, 0 replies; 6+ messages in thread
From: Christopher Allen Wing @ 2001-02-17 23:53 UTC (permalink / raw)
To: Manfred Spraul; +Cc: Mark Swanson, linux-kernel
Manfred:
> If you want to access values > 65535 from your app you have 2 options:
>
> 1) use the new msqid64_ds structure. You must pass IPC_64 to the msgctl
> call. This is the only option if you need correct 32-bit uids.
glibc 2.2 will support this natively without needing any changes to your
application (besides a recompile). struct msqid_ds in the glibc 2.2
headers corresponds to struct msqid64_ds in the kernel.
It would be a bad thing to require people to change their source code in
order to build against the improved sysvipc interface :)
(glibc 2.2 also handles the case of a non 2.4 kernel properly, by
detecting the lack of IPC_64 support and emulating it in software-- Jakub
Jelinek wrote this compatibility code because I was too lazy/didn't need
it myself)
-Chris Wing
wingc@engin.umich.edu
^ permalink raw reply [flat|nested] 6+ messages in threadend of thread, other threads:[~2001-02-17 23:53 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2001-02-17 18:42 System V msg queue bugs in latest kernels Mark Swanson 2001-02-17 19:03 ` Manfred Spraul 2001-02-17 19:22 ` Mark Swanson 2001-02-17 19:40 ` Mark Swanson 2001-02-17 20:07 ` Manfred Spraul -- strict thread matches above, loose matches on Subject: below -- 2001-02-17 23:53 Christopher Allen Wing
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox