vme_user causes system hang/freeze
De Roo, Steven
steven.deroo at arcelormittal.com
Mon May 6 15:06:14 UTC 2013
Hi,
I'm running OpenSuSE 12.3, kernel 3.7.
I found out that the problem occurs when there is another card in the VME-crate that performs a lot of writes in the memory-region I'm reading in my example.
('a lot of' = each millisecond, the first 64 bytes get updated).
I've already added a sleep to the loop in my example, ranging from 20 milliseconds to a whole second, and it's just a matter of time...
Sometimes, I get the freeze after 50 loops, sometimes after 2000.
When I disable the VME-card that writes data to this region, my example program keeps running flawlessly...
Can 'concurrent' access to the same memory region cause such a nasty result ?
Kind regards,
Steven
--------------------------------------------------------------------------------
Hi Steven,
I have run this test up on a pair of boards I have access to. I had to declare the loop variable, but other than that it seems to be running fine here (I'm testing this on the head of the staging tree[1]):
root at ge-xvb601:~/vme_test# uname -r
3.9.0
root at ge-xvb601:~/vme_test# gcc -o test_extended test_extended.c root at ge-xvb601:~/vme_test# ./test_extended > test.txt root at ge-xvb601:~/vme_test# wc -l test.txt 900 test.txt root at ge-xvb601:~/vme_test# tail test.txt
0038: ff ff df ff df ff ff ff
0000: ff ff ff fb ff f5 ff ff
0008: ff ff ff ff 7f ff ff ff
0010: ff ff df df be fb ff fe
0018: ff f7 ff f7 7f ea ff ff
0020: ff ef ff ff d8 ee ff ff
0028: ff ff ff ff 7e f7 ff f7
0030: ff ff 7b 6e 5d df ff ff
0038: ff ff df ff df ff ff ff
root at ge-xvb601:~/vme_test#
Which version of kernel are you running this on?
Martyn
[1] git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
On 02/05/13 09:33, De Roo, Steven wrote:
> Dear all,
>
> I've been trying to access the VME-bus using a Xembedded XVME-6300
> board (with TSI-148 chipset) and the vme_user module from Martyn, with success.
> (Thanks to Martyn for an easy demo program).
>
> I've modified the code (see below) to...
> - use A_32/D_32
> - use 0x8BB00000 as base address
> - read data at an offset 0x8400 from this address
> - do a read of 6400 bytes instead of 512 bytes This seems to be
> working perfect (another VME-card writes a recognizable pattern at the
> above address, and I can see it using the printf-statements).
>
> HOWEVER:
> When I do this read in a loop (eg. 100 times), then my whole system
> freezes/hangs after about 50 times, and I have to power off/power on
> the machine...
>
> Does anybody have an idea what's going wrong ?
> Can I activate something to find out the problem ?
>
> Kind regards,
> Steven De Roo
>
> ----------------------------------------------------------------------
> ----------
>
> #define _XOPEN_SOURCE 500
> #define u32 unsigned int // Needed to add this line #include
> <linux/types.h> // Needed to add this line #include <stdio.h> #include
> <stdlib.h> #include <sys/ioctl.h> #include <sys/types.h> #include
> <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include
> "vme_user.h"
>
> int main(int argc, char *argv[])
> {
> int fd;
> int i;
> int retval;
> unsigned char data[6400];
>
> struct vme_master master;
>
> fd = open("/dev/bus/vme/m0", O_RDONLY);
> if (fd == -1) {
> perror("ERROR: Opening window device file");
> return 1;
> }
>
> master.enable = 1;
> master.vme_addr = 0x8BB00000;
> master.size = 0x10000;
> master.aspace = 4; // VME_A32
> master.cycle = 0x2000 | 0x8000; // user/data access
> master.dwidth = 4; // VME_D32
>
> retval = ioctl(fd, VME_SET_MASTER, &master);
> if (retval != 0) {
> printf("retval=%d\n", retval);
> perror("ERROR: Failed to configure window");
> return 1;
> }
> for (i=0; i<sizeof(data); i++) {
> data[i] = 0;
> }
>
> for (loop=0; loop<100; loop++)
> {
> retval = pread(fd, data, sizeof(data), 0x8400);
> if (retval < sizeof(data)) {
> printf("WARNING: Only read %d bytes", retval);
> }
>
> // Print first 64 bytes
> for(i=0; i<8*8; i++) {
> if (i % 8 == 0) {
> printf("\n""%4.4x: ", i);
> }
> printf("%2.2x ", data[i]);
> }
> printf("\n");
> }
>
> close(fd);
>
> return 0;
> }
>
--
Martyn Welch (Lead Software Engineer) | Registered in England and Wales
GE Intelligent Platforms | (3828642) at 100 Barbirolli Square
T +44(0)1327322748 | Manchester, M2 3AB
E martyn.welch at ge.com | VAT:GB 927559189
More information about the devel
mailing list