All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] -EINTR using rt_pipe_read with TM_INFINITE
@ 2006-08-09 13:09 Jacques GANGLOFF
  2006-08-09 23:19 ` Jan Kiszka
  0 siblings, 1 reply; 4+ messages in thread
From: Jacques GANGLOFF @ 2006-08-09 13:09 UTC (permalink / raw)
  To: xenomai

Hi,

I did this little test :

Below I have attached two sources, one on the kernel side and one on the
user side.
I do here a very simple fifo handshaking test. I insert the kernel module
then I run the user program. When I do the test with the "THE BUG IS HERE"
line commented, I got :

root@domain.hid# ./user
user : j'ai envoyé A
user :j'ai bien reçu E
root@domain.hid# dmesg
hello world
kernel : j'ai bien reçu A
kernel : ret = 1
kernel :j'ai envoyé E

Now, when I uncomment the line :
root@domain.hid# ./user
user : j'ai envoyé A
[CRTL-C] because the user program is blocking ...
root@domain.hid# dmesg
hello world
kernel : j'ai bien reçu A
kernel : ret = -4
kernel :j'ai envoyé E


Now, ret=-4 is the code for -EINTR. According to the doc :
"-EINTR is returned if rt_task_unblock() has been called for the waiting
task before any data was available."

I cannot see where rt_task_unblock() could be called. What is wrong ?

Thanks for your help,
Jacques

==================================================================
Kernel module :
==================================================================

#include <native/task.h>
#include <native/pipe.h>
#include <rtdm/rtdm_driver.h>

#define TASK_PRIO 99
#define TASK_MODE T_FPU|T_CPU(0)
#define TASK_STKSZ 4096

RT_PIPE pipe1,pipe2;
RT_TASK task_desc;

void task_body (void *cookie)
{
	char buf,mesg;
	int err;

    mesg = 'E';
	/*lecture dans le pipe (TM_INFINITE : bloque la tâche s'il y a rien dans
	 * le pipe)*/
	err = rt_pipe_read(&pipe1,&buf,sizeof(char),TM_INFINITE);


	rtdm_printk("kernel : j'ai bien reçu %c \n",buf);

        /* THE BUG IS HERE */
	err = rt_pipe_read(&pipe1,&buf,sizeof(char),TM_INFINITE);
        /* THE BUG IS HERE */

	rtdm_printk("kernel : ret = %d\n", err );

	/*écriture dans le pipe*/
	err = rt_pipe_write(&pipe2,&mesg,sizeof(char),P_NORMAL);

	rtdm_printk("kernel :j'ai envoyé %c \n",mesg);


}


int init_module(void)
{

	int err=0;


	printk("hello world\n");

	/*Création d'un pipe pour lecture*/
	err = rt_pipe_create(&pipe1,"MyPipe0",0,sizeof(char));
	if(err)
	{
		rtdm_printk("pipe MyPipe0 creation failure \n");
	}

	/*Création d'un pipe pour écriture*/
	err = rt_pipe_create(&pipe2,"MyPipe1",1,sizeof(char));
	if(err)
	{
		rtdm_printk("pipe MyPipe1 creation failure \n");
	}

	/*Création de la tâche*/
	err =
rt_task_create(&task_desc,"MyTaskName",TASK_STKSZ,TASK_PRIO,TASK_MODE);

	if (!err)
	{
		/*lancement de la tâche*/
		rt_task_start(&task_desc,&task_body,NULL);
	}

	return 0;

}


void cleanup_module(void)

{
	rt_task_delete(&task_desc);
	rt_pipe_delete(&pipe1);
	rt_pipe_delete(&pipe2);
}

===================================================

User program :

===================================================

#include <native/task.h>
#include <native/pipe.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>



int main()
{
	int pipe1,pipe2;
	char m2,m1='A';

	m2 = 0;

	/*Ouverture du device côté user pour écriture */
	pipe1 = open("/dev/rtp0",O_RDWR);

	/*Ouverture du device côté user pour lecture*/
	pipe2 = open("/dev/rtp1",O_RDONLY);

	/*écriture des données*/
	write(pipe1,&m1,sizeof(char));

	printf("user : j'ai envoyé %c \n",m1);

	/* lecture des données */
	read(pipe2,&m2,sizeof(char));

	printf("user :j'ai bien reçu %c \n",m2);


	close(pipe1);
	close(pipe2);
	return 0;
}
 ___________________________________________

   Prof. Jacques GANGLOFF

   Strasbourg I University
   LSIIT Laboratory, EAVR team
   Bd S. Brant
   BP 10413, 67412 ILLKIRCH cedex, FRANCE
   Tel : +33 (0)3 90 24 44 68
   Fax : +33 (0)3 90 24 44 80
   http://eavr.u-strasbg.fr
____________________________________________



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Xenomai-core] -EINTR using rt_pipe_read with TM_INFINITE
  2006-08-09 13:09 [Xenomai-core] -EINTR using rt_pipe_read with TM_INFINITE Jacques GANGLOFF
@ 2006-08-09 23:19 ` Jan Kiszka
  2006-08-10 16:43   ` Jacques GANGLOFF
  0 siblings, 1 reply; 4+ messages in thread
From: Jan Kiszka @ 2006-08-09 23:19 UTC (permalink / raw)
  To: Jacques GANGLOFF; +Cc: xenomai

[-- Attachment #1: Type: text/plain, Size: 1644 bytes --]

Jacques GANGLOFF wrote:
> Hi,
> 
> I did this little test :
> 
> Below I have attached two sources, one on the kernel side and one on the
> user side.
> I do here a very simple fifo handshaking test. I insert the kernel module
> then I run the user program. When I do the test with the "THE BUG IS HERE"
> line commented, I got :
> 
> root@domain.hid# ./user
> user : j'ai envoyé A
> user :j'ai bien reçu E
> root@domain.hid# dmesg
> hello world
> kernel : j'ai bien reçu A
> kernel : ret = 1
> kernel :j'ai envoyé E
> 
> Now, when I uncomment the line :
> root@domain.hid# ./user
> user : j'ai envoyé A
> [CRTL-C] because the user program is blocking ...
> root@domain.hid# dmesg
> hello world
> kernel : j'ai bien reçu A
> kernel : ret = -4
> kernel :j'ai envoyé E
> 

That looks like a correct behaviour to me: the kernel module is trying
to read from pipe1 (MyPipe0, /dev/rtp0) and is blocked on it. The
user-space tool tries to do the same (is this intended BTW?). Then the
user-space program gets terminate, thus pipe1 is cleaned up. During that
cleanup all RT-readers on the pipe are woken up with -EINTR as return
code [1].

> 
> Now, ret=-4 is the code for -EINTR. According to the doc :
> "-EINTR is returned if rt_task_unblock() has been called for the waiting
> task before any data was available."
> 
> I cannot see where rt_task_unblock() could be called. What is wrong ?
> 

Ok, the documentation is insufficient here. We should actually add the
second reason for EINTR as sketched above.

Jan


[1]http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/nucleus/pipe.c#L607


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Xenomai-core] -EINTR using rt_pipe_read with TM_INFINITE
  2006-08-10 16:43   ` Jacques GANGLOFF
@ 2006-08-10 14:59     ` Dmitry Adamushko
  0 siblings, 0 replies; 4+ messages in thread
From: Dmitry Adamushko @ 2006-08-10 14:59 UTC (permalink / raw)
  To: Jacques GANGLOFF; +Cc: Jan Kiszka, xenomai

[-- Attachment #1: Type: text/plain, Size: 822 bytes --]

Hello,

take a look at the 4-th parameter of rt_pipe_create() :

@param poolsize Specifies the size of a dedicated buffer pool for the
 * pipe. Passing 0 means that all message allocations for this pipe are
 * performed on the system heap.

The system heap is also used for other allocations and not only to serve a
given heap. It's default size is 128 Kb (configurable through the config
though).

Passing non-zero parameter causes a private heap of the given size to be
created for this heap.

Note, it's a size in bytes, not a flag (in your example you use 1 for the
second heap).

This value is rounded up to a page size.

rt_pipe_create()
{
...
if (poolsize < 2 * PAGE_SIZE)
                        poolsize = 2 * PAGE_SIZE;

poolsize = xnheap_rounded_size(poolsize, PAGE_SIZE);



-- 
Best regards,
Dmitry Adamushko

[-- Attachment #2: Type: text/html, Size: 1077 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Xenomai-core] -EINTR using rt_pipe_read with TM_INFINITE
  2006-08-09 23:19 ` Jan Kiszka
@ 2006-08-10 16:43   ` Jacques GANGLOFF
  2006-08-10 14:59     ` Dmitry Adamushko
  0 siblings, 1 reply; 4+ messages in thread
From: Jacques GANGLOFF @ 2006-08-10 16:43 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai

>
> That looks like a correct behaviour to me: the kernel module is trying
to read from pipe1 (MyPipe0, /dev/rtp0) and is blocked on it. The
user-space tool tries to do the same (is this intended BTW?). Then the
user-space program gets terminate, thus pipe1 is cleaned up. During that
cleanup all RT-readers on the pipe are woken up with -EINTR as return
code [1].
>

Hi Jan,

Thanks for your reply.

Indeed, I was on a wrong track: [CTRL-C] closed the application and also
the pipes, thus sending this INTR signal to the kernel module.

BTW, is there a limit to the size of a message one can send in a pipe.
Could this limit be around 65535 ?

I'm porting a RTAI application to xenomai and I am still hunting a bug on
a pipe. Writing on the user side more than 65530 bytes on a pipe yields a
"Cannot allocate memory" perror message.

Thanks a lot for your hints,
Jacques

 ___________________________________________

   Prof. Jacques GANGLOFF

   Strasbourg I University
   LSIIT Laboratory, EAVR team
   Bd S. Brant
   BP 10413, 67412 ILLKIRCH cedex, FRANCE
   Tel : +33 (0)3 90 24 44 68
   Fax : +33 (0)3 90 24 44 80
   http://eavr.u-strasbg.fr
____________________________________________






^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-08-10 16:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-09 13:09 [Xenomai-core] -EINTR using rt_pipe_read with TM_INFINITE Jacques GANGLOFF
2006-08-09 23:19 ` Jan Kiszka
2006-08-10 16:43   ` Jacques GANGLOFF
2006-08-10 14:59     ` Dmitry Adamushko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.