Assistance with a problem related to GEM and Atomic Commit inside vkms

Ville Syrjälä ville.syrjala at linux.intel.com
Fri Apr 5 15:42:31 UTC 2019


On Wed, Apr 03, 2019 at 04:35:11PM -0300, Rodrigo Siqueira wrote:
> Hi,
> 
> I’m working to add writeback support to vkms; you can see my current
> patch at the end of this email (some prints highlight the issue that I’m
> asking for help here). I’m using the Liviu Dudau and Brian Starkey IGT
> patchset, which can be seen here:
> https://patchwork.freedesktop.org/series/39229/. 
> 
> I’m stuck with a problem that happens in my vkms_wb_atomic_commit()
> function, which is a helper function at  drm_connector_helper_funcs. You
> can see the full implementation of this function at the end of this
> email, but here is the important part:
> 
>   struct drm_framebuffer *fb = conn_state->writeback_job->fb;
>   struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
>   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
> 
> A few lines after this variable initialization, I try to make a memory
> copy like this:
> 
>   memcpy(vkms_conn->writeback_vaddr, vkms_obj->vaddr, vkms_obj->gem.size);
> 
> If I test my implementation with the subtest writeback-fb-id, everything
> work as expected; for extra details, this is the dmesg output after this
> test and with a debug print:
> 
> => writeback-fb-id
> 
> [Apr 3 11:30] CIFS: Attempting to mount //10.0.2.4/qemu
> [  +1.601900] Console: switching to colour dummy device 80x25
> [  +0.000017] [IGT] kms_writeback: executing
> [  +0.032532] [IGT] kms_writeback: starting subtest writeback-fb-id
> [  +0.001932] VKMS_OBJ (1): Buff (1) - Vaddr (1) - Size = 1228800 - count = 1
> [  +0.050524] [IGT] kms_writeback: exiting, ret=0
> [  +0.005202] Console: switching to colour frame buffer device 100x37
> 
> In the above log, you can see the print info; notice that Vaddr is the
> output of vkms_obj->vaddr (Vaddr -> vkms_obj->vaddr != NULL). On the
> other hand, if I try the subtest writeback-check-output, something weird
> happens in this function. Here is the dmesg output for this test:
> 
> =>  writeback-check-output
> 
> [ +29.911185] Console: switching to colour dummy device 80x25
> [  +0.000017] [IGT] kms_writeback: executing
> [  +0.021289] [IGT] kms_writeback: starting subtest writeback-check-output
> [  +0.016270] VKMS_OBJ (1): Buff (1) - Vaddr (0) - Size = 1228800 - count = 0
> [  +0.000005] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
> [  +0.000004] #PF error: [normal kernel read fault]
> [  +0.000001] PGD 0 P4D 0
> [  +0.000003] Oops: 0000 [#1] PREEMPT SMP PTI
> [  +0.000002] CPU: 3 PID: 426 Comm: kms_writeback Not tainted 5.0.0-VKMS-RULES+ #102
> [  +0.000002] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-20181126_142135-anatol 04/01/2014
> [  +0.000021] RIP: 0010:__memcpy+0x12/0x20
> [  +0.000002] Code: ff 0f 31 48 c1 e2 20 48 09 c2 48 31 d3 e9 79 ff ff ff 90 90 90 90 90 90 0f 1f 44 00 00 48 89 f8 48 89 d1 48 c1 e9 03 83 e2 07 <f3> 48 a5 89 d1 f3 a4 c3 66 0f 1f 44 00 00 48 89 f8 48 89 d1 f3 a4
> [  +0.000001] RSP: 0018:ffffadaf0098fbd8 EFLAGS: 00010246
> [  +0.000002] RAX: ffff9f1bf5400000 RBX: ffff9f1bfa28df00 RCX: 0000000000025800
> [  +0.000001] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff9f1bf5400000
> [  +0.000001] RBP: 0000000000000001 R08: 00000017818788be R09: ffffadaf0098fb60
> [  +0.000001] R10: ffff9f1bfffdc998 R11: ffffffffa25ec401 R12: ffff9f1b777ff430
> [  +0.000001] R13: ffffffffc06558b8 R14: ffffffffc06853c0 R15: ffffffffc0685520
> [  +0.000002] FS:  00007f2862deae80(0000) GS:ffff9f1bfc980000(0000) knlGS:0000000000000000
> [  +0.000001] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [  +0.000001] CR2: 0000000000000000 CR3: 00000000baf6c000 CR4: 00000000000006e0
> [  +0.000004] Call Trace:
> [  +0.000023]  drm_atomic_helper_commit_modeset_enables+0x15d/0x1e0 [drm_kms_helper]
> [  +0.000028]  drm_atomic_helper_commit_tail+0x31/0x60 [drm_kms_helper]
> [  +0.000008]  commit_tail+0x58/0x70 [drm_kms_helper]
> [  +0.000008]  drm_atomic_helper_commit+0x103/0x110 [drm_kms_helper]
> [  +0.000040]  drm_mode_atomic_ioctl+0x829/0x950 [drm]
> [  +0.000012]  ? drm_atomic_set_property+0x960/0x960 [drm]
> [  +0.000029]  drm_ioctl_kernel+0xb2/0xf0 [drm]
> [  +0.000011]  drm_ioctl+0x25f/0x3f0 [drm]
> [  +0.000009]  ? drm_atomic_set_property+0x960/0x960 [drm]
> [  +0.000004]  ? n_tty_open+0xa0/0xa0
> [  +0.000004]  do_vfs_ioctl+0xa4/0x630
> [  +0.000003]  ksys_ioctl+0x60/0x90
> [  +0.000003]  ? ksys_write+0x4f/0xb0
> [  +0.000002]  __x64_sys_ioctl+0x16/0x20
> [  +0.000003]  do_syscall_64+0x5b/0x170
> [  +0.000003]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
> [  +0.000002] RIP: 0033:0x7f286677580b
> [  +0.000001] Code: 0f 1e fa 48 8b 05 55 b6 0c 00 64 c7 00 26 00 00 00 48 c7 c0 ff 
> 
> Notice that Vaddr became NULL for some reason that I cannot understand.

Just missing the .prepare_writeback_job() hook?

-- 
Ville Syrjälä
Intel


More information about the dri-devel mailing list