Re: Kernel Oops on 3.14.66

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

 



Hi Dave,

thank you again.

I searched, where the memory for the request came from, it is set in line 2158 of i915_gem.c
and the kmalloc is in intel_ring_alloc_seqno() in intel_ringbuffer.c, right?

So I will test the following patch for intel_ringbuffer.c:


intel_ring_alloc_seqno(struct intel_ring_buffer *ring)
{
    if (ring->outstanding_lazy_seqno)
        return 0;

    if (ring->preallocated_lazy_request == NULL) {
        struct drm_i915_gem_request *request;

        request = kmalloc(sizeof(*request), GFP_KERNEL);
        if (request == NULL)
            return -ENOMEM;
+
+       INIT_LIST_HEAD(&request->list);
        ring->preallocated_lazy_request = request;
    }

    return i915_gem_get_seqno(ring->dev, &ring->outstanding_lazy_seqno);
}
:

2016-04-27 20:28 GMT+02:00 Dave Gordon <david.s.gordon@xxxxxxxxx>:
2016-04-27 12:03 GMT+02:00 Dave Gordon <david.s.gordon@xxxxxxxxx>:

On 27/04/16 10:19, Andreas Lampersperger wrote:

Hello,

has anyone here a hint for me, what can cause this error.
The error occures highly sporadic on different machines with intel hd
graphics (ivb_gt1).
I did also some kernel coredumps and found out, that the failed
paging request came from drm_i915_gem_request->list.prev or ->list.next.

Thank you
Andreas

Try this patch.

.Dave.

On 27/04/16 13:20, Andreas Lampersperger wrote:
Hi Dave,

thank you for the patch, but I'm using longtime kernel 3.14.66 and so the
patch does not fit.
Do you have any suggestions for that kernel?

Andreas

I have no idea what the code would look like in that version; do you have any way to get the git commit hash or tag of the i915 driver?

But essentially, if you have the kernel sources for that version, you could look for a line that allocates a "struct drm_i915_gem_request". It might be

    req = kmem_cache_zalloc(dev_priv->requests, GFP_KERNEL);

or in older versions it might be

    request = kzalloc(sizeof(*request), GFP_KERNEL);

or some other variation. It should of course be followed by a test for successful allocation, e.g.

    if (request == NULL)
        return -ENOMEM;

If you can find that line (or lines, at one time there were TWO such places), then you just have to add

    INIT_LIST_HEAD(&request->list);

after the test-for-NULL, or anywhere inline thereafter. For example:

    request = kzalloc(sizeof(*request), GFP_KERNEL);
    if (request == NULL)
        return -ENOMEM;

    ret = i915_gem_get_seqno(ring->dev, &request->seqno);
    if (ret) {
        kfree(request);
        return ret;
    }

+   INIT_LIST_HEAD(&request->list);
    kref_init(&request->ref);
    request->ring = ring;
    request->uniq = dev_private->request_uniq++;

HTH,
.Dave.

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux