mmap issue.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi All,

I am facing some issue while using mmap .

Issue 1.msync(ptr, PageSize, MS_ASYNC) if i pass MS_SYNC it fail with
bad option.
Issue 2. If i run the above program on target(ARM). the value is not changing

parent leaving critical section: -369098746
parent leaving critical section: -369098746
msync completed successfully
parent leaving critical section: -369098746
parent entered critical section -369098746



Thanks

But same program work well on Host machine.

parent leaving critical section: 12344
parent leaving critical section: 1000
msync completed successfully
parent leaving critical section: 1000
parent leaving critical section: 1000



#include <stdio.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <errno.h>
#define SEM_NAME "mysem"
#define _SC_PAGE_SIZE 4096
int count = 100;


int main()
{
     int i, nloop = 1;
     sem_t *mutex;
     int fd, *ptr=NULL;
     int PageSize;
     fd = open ("/dev/mem", O_RDWR|O_SYNC);
     if (fd < 0) {
         printf("Failed while opening the memory descriptor\n");
         printf("Error is = %d\n", errno);
     }
     printf("\n============ PRIOR MAPPING ===========\n");
     char comm[50];
     sprintf(comm,"cat /proc/%d/maps",(int)getpid());
     system(comm);
     printf("============== PRIOR MAPPING =========\n\n");

/*    if ( (PageSize = sysconf(_SC_PAGE_SIZE)) < 0) {
        printf("sysconf() Error=");
        return -1;
    }
*/
        PageSize=4096;

     printf("\n============ PRIOR MAPPIN1 ===========\n");
     ptr = (int*)(mmap(NULL, PageSize, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, 0));

     printf("\n============ PRIOR MAPPIN2 ===========\n");
     if (ptr == MAP_FAILED) {
         printf("MMAP failed\n");
         printf("value of errno is %d\n", errno);
         exit(0);
     }


   printf ("[%s] Mapped_buff_addr: [%8p]\n", __FUNCTION__, ptr);
     printf("\n============ NEW MAPPING ===========\n");
     //char comm[20];
     sprintf(comm,"cat /proc/%d/maps",(int)getpid());
     system(comm);
     printf("============== NEW MAPPING =========\n\n");
     printf("parent leaving critical section: %d\n", *ptr);
     *ptr = 1000;
     printf("parent leaving critical section: %d\n", *ptr);
     mutex = sem_open((SEM_NAME), O_CREAT | O_EXCL, S_IRWXU, 1);
     sem_unlink(SEM_NAME);
     setbuf(stdout, NULL); /* stdout is unbuffered */
     if (msync(ptr, PageSize, MS_ASYNC) < 0) { //naveen change to Async
         printf("Value of errno is %d\n", errno);
         printf("Value of page size is %d\n", PageSize);
         perror ("msync failed:");
         exit(0);
     }
     else {
         printf("msync completed successfully\n");
     }
     /* parent */
     for (i = 0; i < nloop; i++) {
         sem_wait(mutex);
        printf("parent leaving critical section: %d\n", *ptr);
         sleep(2);
         printf("parent leaving critical section: %d\n", *ptr);
         sem_post(mutex);
     }
     close(fd);
     return 0;
}

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux