* [d-kernel] shmctl: Invalid argument
@ 2003-12-09 14:29 Grigory Batalov
2003-12-09 14:50 ` Dmitry V. Levin
2003-12-09 14:55 ` Sergey Vlasov
0 siblings, 2 replies; 5+ messages in thread
From: Grigory Batalov @ 2003-12-09 14:29 UTC (permalink / raw)
To: devel-kernel
[-- Attachment #1: Type: text/plain, Size: 1100 bytes --]
Здравствуйте!
После переезда с ядра 2.4.20-alt10-smp на 2.4.22-std-smp-alt12
от программы amdump (пакет amanda) наблюдаются сообщения:
taper: FATAL shmctl: Invalid argument
Я просмотрел исходники taper, его манипуляции с памятью
можно упростить до прилагаемого файла.
Указанное сообщение соответствует коду в taper.c:
if(shmid == -1) return; /* nothing to destroy */
if(shmctl(shmid, IPC_RMID, NULL) == -1) {
error("shmctl: %s", strerror(errno));
}
При запуске shmtest обычным пользователем видно, что память
выделяется и затем (через заданные 5 сек.) освобождается:
$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 262150 bga 700 1048576 1
<skip>
Однако, на ядре 2.4.20-alt10-smp программа завершается
молча, а на 2.4.22-std-smp-alt12 выходит сообщение:
./shmtest: : Unknown error 2339276
С чем это может быть связано?
На сервере два процессора, 2 Гб памяти, остальные пакеты -
из Мастера 2.2.
--
Григорий Баталов,
группа техподдержки
ОАО "Ковдорский ГОК"
[-- Attachment #2: shmtest.c --]
[-- Type: text/plain, Size: 774 bytes --]
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int shmid = -1;
char *result;
shmid = shmget(IPC_PRIVATE, 1024*1024, IPC_CREAT|0700);
if(shmid == -1) {
error("shmget: %s", strerror(errno));
exit(1);
}
result = (char *)shmat(shmid, NULL, 0);
if(result == (char *)-1) {
int save_errno = errno;
if(shmctl(shmid, IPC_RMID, NULL) == -1) {
error("shmctl: %s", strerror(errno));
}
errno = save_errno;
error("shmat: %s", strerror(errno));
exit(1);
}
sleep(5);
if(shmctl(shmid, IPC_RMID, NULL) == -1) {
error("shmctl: %s", strerror(errno));
exit(1);
}
if(shmdt(result) == -1) {
error("shmdt: %s", strerror(errno));
exit(1);
}
exit(0);
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [d-kernel] shmctl: Invalid argument
2003-12-09 14:29 [d-kernel] shmctl: Invalid argument Grigory Batalov
@ 2003-12-09 14:50 ` Dmitry V. Levin
2003-12-09 14:55 ` Sergey Vlasov
1 sibling, 0 replies; 5+ messages in thread
From: Dmitry V. Levin @ 2003-12-09 14:50 UTC (permalink / raw)
To: devel-kernel
[-- Attachment #1: Type: text/plain, Size: 1252 bytes --]
Hi,
On Tue, Dec 09, 2003 at 05:29:32PM +0300, Grigory Batalov wrote:
> Здравствуйте!
>
> После переезда с ядра 2.4.20-alt10-smp на 2.4.22-std-smp-alt12
> от программы amdump (пакет amanda) наблюдаются сообщения:
>
> taper: FATAL shmctl: Invalid argument
>
> Я просмотрел исходники taper, его манипуляции с памятью
> можно упростить до прилагаемого файла.
> Указанное сообщение соответствует коду в taper.c:
>
> if(shmid == -1) return; /* nothing to destroy */
> if(shmctl(shmid, IPC_RMID, NULL) == -1) {
> error("shmctl: %s", strerror(errno));
> }
>
> При запуске shmtest обычным пользователем видно, что память
> выделяется и затем (через заданные 5 сек.) освобождается:
>
> $ ipcs
> ------ Shared Memory Segments --------
> key shmid owner perms bytes nattch status
> 0x00000000 262150 bga 700 1048576 1
> <skip>
>
> Однако, на ядре 2.4.20-alt10-smp программа завершается
> молча, а на 2.4.22-std-smp-alt12 выходит сообщение:
>
> ./shmtest: : Unknown error 2339276
>
> С чем это может быть связано?
Это, скорее всего, связано с CONFIG_HARDEN_SHM=y в конфигурации ядра:
разделяемая память освобождается, если она не используется ни одним
процессом.
--
ldv
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [d-kernel] shmctl: Invalid argument
2003-12-09 14:29 [d-kernel] shmctl: Invalid argument Grigory Batalov
2003-12-09 14:50 ` Dmitry V. Levin
@ 2003-12-09 14:55 ` Sergey Vlasov
2003-12-10 6:42 ` Grigory Batalov
1 sibling, 1 reply; 5+ messages in thread
From: Sergey Vlasov @ 2003-12-09 14:55 UTC (permalink / raw)
To: devel-kernel
[-- Attachment #1: Type: text/plain, Size: 1169 bytes --]
On Tue, Dec 09, 2003 at 05:29:32PM +0300, Grigory Batalov wrote:
> После переезда с ядра 2.4.20-alt10-smp на 2.4.22-std-smp-alt12
> от программы amdump (пакет amanda) наблюдаются сообщения:
>
> taper: FATAL shmctl: Invalid argument
>
> Я просмотрел исходники taper, его манипуляции с памятью
> можно упростить до прилагаемого файла.
> Указанное сообщение соответствует коду в taper.c:
>
> if(shmid == -1) return; /* nothing to destroy */
> if(shmctl(shmid, IPC_RMID, NULL) == -1) {
> error("shmctl: %s", strerror(errno));
> }
>
> При запуске shmtest обычным пользователем видно, что память
> выделяется и затем (через заданные 5 сек.) освобождается:
>
> $ ipcs
> ------ Shared Memory Segments --------
> key shmid owner perms bytes nattch status
> 0x00000000 262150 bga 700 1048576 1
> <skip>
>
> Однако, на ядре 2.4.20-alt10-smp программа завершается
> молча, а на 2.4.22-std-smp-alt12 выходит сообщение:
>
> ./shmtest: : Unknown error 2339276
Не воспроизводится...
И программа с ошибками - попробуйте приложенный исправленный вариант.
gcc -o shmtest -g -O2 -Wall -W shmtest.c
[-- Attachment #2: shmtest.c --]
[-- Type: text/plain, Size: 761 bytes --]
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <error.h>
#include <stdlib.h>
int main(void)
{
int shmid = -1;
char *result;
shmid = shmget(IPC_PRIVATE, 1024*1024, IPC_CREAT|0700);
if(shmid == -1) {
error(0, errno, "shmget");
exit(1);
}
result = (char *)shmat(shmid, NULL, 0);
if(result == (char *)-1) {
int save_errno = errno;
if(shmctl(shmid, IPC_RMID, NULL) == -1) {
error(0, errno, "shmctl");
}
error(0, save_errno, "shmat");
exit(1);
}
sleep(5);
if(shmctl(shmid, IPC_RMID, NULL) == -1) {
error(0, errno, "shmctl");
exit(1);
}
if(shmdt(result) == -1) {
error(0, errno, "shmdt");
exit(1);
}
exit(0);
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [d-kernel] shmctl: Invalid argument
2003-12-09 14:55 ` Sergey Vlasov
@ 2003-12-10 6:42 ` Grigory Batalov
2003-12-11 9:57 ` Denis Ovsienko
0 siblings, 1 reply; 5+ messages in thread
From: Grigory Batalov @ 2003-12-10 6:42 UTC (permalink / raw)
To: ALT Linux kernel packages development
On Tue, 9 Dec 2003 17:55:49 +0300
Sergey Vlasov <vsu@altlinux.ru> wrote:
> > После переезда с ядра 2.4.20-alt10-smp на 2.4.22-std-smp-alt12
> > от программы amdump (пакет amanda) наблюдаются сообщения:
> >
> > taper: FATAL shmctl: Invalid argument
> >
> > Я просмотрел исходники taper, его манипуляции с памятью
> > можно упростить до прилагаемого файла.
> > Указанное сообщение соответствует коду в taper.c:
> >
> > if(shmid == -1) return; /* nothing to destroy */
> > if(shmctl(shmid, IPC_RMID, NULL) == -1) {
> > error("shmctl: %s", strerror(errno));
> > }
> >
> > При запуске shmtest обычным пользователем видно, что память
> > выделяется и затем (через заданные 5 сек.) освобождается:
> >
> > $ ipcs
> > ------ Shared Memory Segments --------
> > key shmid owner perms bytes nattch status
> > 0x00000000 262150 bga 700 1048576 1
> > <skip>
> >
> > Однако, на ядре 2.4.20-alt10-smp программа завершается
> > молча, а на 2.4.22-std-smp-alt12 выходит сообщение:
> >
> > ./shmtest: : Unknown error 2339276
>
> Не воспроизводится...
>
> И программа с ошибками - попробуйте приложенный исправленный вариант.
>
> gcc -o shmtest -g -O2 -Wall -W shmtest.c
Наверное, они error() переопределили по аналогии с perror(),
а я не заметил.
Указанное "shmctl: Invalid argument" при правильном
использовании error() появляется, если shmdt(result)
выполнить ДО shmctl(shmid, IPC_RMID, NULL).
On Tue, 9 Dec 2003 17:50:52 +0300
"Dmitry V. Levin" <ldv@altlinux.org> wrote:
> Это, скорее всего, связано с CONFIG_HARDEN_SHM=y в конфигурации ядра:
> разделяемая память освобождается, если она не используется ни одним
> процессом.
Как я понимаю, нужно пропатчить taper, чтобы shmdt всегда
выполнялось ПОСЛЕ shmctl?
--
Григорий Баталов,
группа техподдержки
ОАО "Ковдорский ГОК"
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [d-kernel] shmctl: Invalid argument
2003-12-10 6:42 ` Grigory Batalov
@ 2003-12-11 9:57 ` Denis Ovsienko
0 siblings, 0 replies; 5+ messages in thread
From: Denis Ovsienko @ 2003-12-11 9:57 UTC (permalink / raw)
To: ALT Linux kernel packages development
> Указанное "shmctl: Invalid argument" при правильном
> использовании error() появляется, если shmdt(result)
> выполнить ДО shmctl(shmid, IPC_RMID, NULL).
Естественно. shmctl(IPC_RMID) всего-то и делает, что выставляет флаг,
который говорит о том, что при detach от памяти нужно убить её, если
счётчик attached процессов нулевой. Естественно, shmid при этом должен
быть валидным (и приаттаченным).
Этот эффект я доказывал с примером в devel@, когда спорил с ldv@
насчёт hasher, правда, потом выяснилось, что я не понял тему спора.
Я специально не исследовал эффекты от shmctl() на детачнутой памяти, но
такой порядок работы, мне кажется, никто и заявлял.
--
DO4-UANIC
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2003-12-11 9:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-12-09 14:29 [d-kernel] shmctl: Invalid argument Grigory Batalov
2003-12-09 14:50 ` Dmitry V. Levin
2003-12-09 14:55 ` Sergey Vlasov
2003-12-10 6:42 ` Grigory Batalov
2003-12-11 9:57 ` Denis Ovsienko
ALT Linux kernel packages development
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel-kernel/0 devel-kernel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel-kernel devel-kernel/ http://lore.altlinux.org/devel-kernel \
devel-kernel@altlinux.org devel-kernel@altlinux.ru devel-kernel@altlinux.com
public-inbox-index devel-kernel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel-kernel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git