mmap fails for DRM_IOCTL_MODE_MAP_DUMB for Radeon, Nouveau, and VMWGFX

Rian Quinn rianquinn at gmail.com
Mon Nov 10 13:33:56 PST 2014


I would be surprised if the size argument was the issue. That comes right
out out of the create IOCTL unmodified. Here is the full source that I am
using.

    // Clear the arg buffers.
    memset(&create_arg, 0, sizeof(create_arg));
    memset(&map_arg, 0, sizeof(map_arg));

    //
------------------------------------------------------------------------
    // Allocate

    // Fill in the arguments for the IOCTL. Note that we only support 32bpp
    // dumb buffers so that is hard coded here.
    create_arg.width = width;
    create_arg.height = height;
    create_arg.bpp = 32;

    // Allocate the dumb buffer
    if (drmIoctl(gpu->fd(), DRM_IOCTL_MODE_CREATE_DUMB, &create_arg))
    {
        svWarning(0) << "Failed: DRM_IOCTL_MODE_CREATE_DUMB - " <<
strerror(errno);
        return;
    }

    // Store the dumb buffer properties.
    mSize = create_arg.size;
    mStride = create_arg.pitch;
    mHandle = create_arg.handle;

    //
------------------------------------------------------------------------
    // Map

    // Fill in the arguments for the IOCTL.
    map_arg.handle = mHandle;

    // Allocate the dumb buffer
    if (drmIoctl(gpu->fd(), DRM_IOCTL_MODE_MAP_DUMB, &map_arg))
    {
        svWarning(0) << "Failed: DRM_IOCTL_MODE_MAP_DUMB - " <<
strerror(errno);
        return;
    }

    // Store the mapped memory
    if ((mVaddr = (svuint32 *)mmap(0, mSize, PROT_READ | PROT_WRITE,
MAP_SHARED, gpu->fd(), map_arg.offset)) == MAP_FAILED)
    {
        // Need to clear out the address so that we don't try to use it.
        mVaddr = NULL;

        // Error out.
        svWarning(0) << "Failed: Dumb Buffer mmap - " << strerror(errno);
        return;
    }


When this code runs, I get the "Invalid Argument" on the mmap.

On Mon, Nov 10, 2014 at 4:14 PM, Dave Airlie <airlied at gmail.com> wrote:

> On 11 November 2014 06:33, Rian Quinn <rianquinn at gmail.com> wrote:
> > I did another test using the following that David put up on github:
> >
> > https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset.c
> >
> > This test also fails on everything except Intel. What's really strange is
> > this test actually does a test to verify that dumb buffers are supported,
> > and the test passes in all cases. David's code is returning with the same
> > error of "Invalid Argument" on the mmap call. Why would the other
> driver's
> > claim to support dumb buffers, but have no means to map the memory?
>
> Just a guess, the size argument is wrong.
>
> But you know you have the kernel source, stick some printks in the
> EINVAL return paths already.
>
> Dave.
> > - Rian
> >
> > On Mon, Nov 10, 2014 at 2:48 PM, Rian Quinn <rianquinn at gmail.com> wrote:
> >>
> >> When working with dumb buffers, DRM_IOCTL_MODE_MAP_DUMB and mmap works
> >> fine on Intel, but the mmap call fails on Radeon, Nouveau, and VMWGFX.
> I you
> >> look at the source for the xorg moderating driver, it only uses the dumb
> >> buffer IOCTL (i.e. it’s not using LibKMS), and if you look at the kernel
> >> source code for the dumb buffer IOCTLs for each of the Radeon, Nouveau,
> and
> >> VMWGFX drivers, they all implement the functions. Furthermore all of the
> >> IOCTLs succeed without error. Its only when you attempt to map the
> memory,
> >> that you get an error of “Invalid Argument”. Here is my map call:
> >>
> >> mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, map_arg.offset)
> >>
> >> Is this a bug, or is there a different way to map the dumb buffers for
> >> these drivers other than LibKMS.
> >>
> >> Thanks,
> >> - Rian
> >
> >
> >
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20141110/7cacc3bb/attachment.html>


More information about the dri-devel mailing list