* 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 thread
end 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