2011-03-17 09:39:25     mmap() / MAP_PRIVATE fails on /dev char device

Document created by Aaronwu Employee on Aug 26, 2013
Version 1Show Document
  • View in full screen mode

2011-03-17 09:39:25     mmap() / MAP_PRIVATE fails on /dev char device

Martin Strubel (SWITZERLAND)

Message: 99009   

 

Hello,

 

I've used to mmap a char device driver the following way:

 

c->buffers[i].start = mmap(NULL, buffer.length,

     PROT_READ | PROT_WRITE, /* required */

     MAP_PRIVATE, // must be private on uClinux

     c->fd, buffer.m.offset);

 

The char driver implements the .mmap method and used to work fine up to 2009R1 release.

 

With the 2010R1-RC5, the mapping fails within mm/nommu.c, specifical in validate_mmap_request(), the following sequence applies:

 

        mapping = file->f_mapping;

        if (!mapping)

            mapping = file->f_path.dentry->d_inode->i_mapping;

 

        capabilities = 0;

        if (mapping && mapping->backing_dev_info)

            capabilities = mapping->backing_dev_info->capabilities;

 

 

On the last above code line, capabilities is returned as BDI_MAP_CAP_COPY, however, has to be BDI_MAP_CAP_DIRECT in order to call the drivers .mmap method. If there is no backing_dev_info (and capabilities remain 0), the proper caps would be determined later.

 

Is this a bug or a feature I'm missing?

 

Greetings,

 

- Martin

QuoteReplyEditDelete

 

 

2011-03-28 01:59:15     Re: mmap() / MAP_PRIVATE fails on /dev char device

Aaron Wu (CHINA)

Message: 99325   

 

Hi Martin,

 

What's the latest status for this proplem, do you have some sample code and instructions by following which we can reproduce this issue?

QuoteReplyEditDelete

Attachments

    Outcomes