On 29/01/2019 20:32, Andres Monteverde wrote:
Hi, my name is Andres and the purpose of this mail is to ask about a
situation we're dealing with and a possible solution.
We are using rtems 4.10.2 in leon3 (gr712) AMP configuration with a
shared memory space of 0x1000 bytes.
Our system consists of two applications. One of them is the owner of a
global queue and the other is the consumer with a timeout.
The app running on core 0 sends a message every five seconds and the
app running on core 1 receives them with a timeout of one second.
After eigth timeouts, the application running in core 1 stops due an
internal error.
Analysing the operations of the OS, we've seen that the internal error
is generated by the lack of free shared memory, and it happens inside
the function _MPCI_Get_packet().
And we believe that the lack of free memory is because previously
timed-out mpci packets are not returned.
The same seems to happen with the proxys allocated in case of time
out, their are allocated using _Thread_MP_Allocate_proxy() and are not
returned.
If we perform the changes below, the test app runs indefinitely
without any error.
Whats your opinion about this?
diff -r basicsw_el1618_rtems_4.10/rtems_4.10/cpukit/rtems/src/msgmp.c
original/basicsw_el1618_rtems_4.10/rtems_4.10/cpukit/rtems/src/msgmp.c
174c174
< rtems_status_code result = (rtems_status_code)
_MPCI_Send_request_packet(
---
> return (rtems_status_code) _MPCI_Send_request_packet(
179,184c179
<
< _MPCI_Return_packet(&the_packet->Prefix);
<
< return result;
<
< break;
---
> break;
I don't think this is correct. If you call _MPCI_Send_request_packet(),
then the ownership of this packet is transferred to the implementation
of this function. With the shared memory driver, the packet is freed by
the receiver, see Shm_Free_envelope().
diff -r
basicsw_el1618_rtems_4.10/rtems_4.10/cpukit/score/src/threadqtimeout.c
original/basicsw_el1618_rtems_4.10/rtems_4.10/cpukit/score/src/threadqtimeout.c
51d50
< break;
55c54
< break;
---
> break;
57,61c56,58
< //todo check for critical section
This is an important TODO. The code below doesn't work under all conditions.
< the_thread->Wait.return_code =
the_thread->Wait.queue->timeout_status;
< _Thread_queue_Extract_with_proxy(the_thread);
< _Thread_Unnest_dispatch();
< break;
---
> _Thread_queue_Process_timeout( the_thread );
> _Thread_Unnest_dispatch();
> break;
I don't know the MPCI code good enough. It would help if you have a
self-contained test case which runs with PSIM (the PowerPC GDB built-in
simulator).
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.hu...@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
_______________________________________________
users mailing list
users@rtems.org
http://lists.rtems.org/mailman/listinfo/users