opnsense-src/sys/dev/drm2
Konstantin Belousov 5975e53d40 Fix a race in vm_page_busy_sleep(9).
Suppose that we have an exclusively busy page, and a thread which can
accept shared-busy page.  In this case, typical code waiting for the
page xbusy state to pass is
again:
	VM_OBJECT_WLOCK(object);
	...
	if (vm_page_xbusied(m)) {
		vm_page_lock(m);
 		VM_OBJECT_WUNLOCK(object);    <---1
		vm_page_busy_sleep(p, "vmopax");
 		goto again;
	}

Suppose that the xbusy state owner locked the object, unbusied the
page and unlocked the object after we are at the line [1], but before we
executed the load of the busy_lock word in vm_page_busy_sleep().  If it
happens that there is still no waiters recorded for the busy state,
the xbusy owner did not acquired the page lock, so it proceeded.

More, suppose that some other thread happen to share-busy the page
after xbusy state was relinquished but before the m->busy_lock is read
in vm_page_busy_sleep().  Again, that thread only needs vm_object lock
to proceed.  Then, vm_page_busy_sleep() reads busy_lock value equal to
the VPB_SHARERS_WORD(1).

In this case, all tests in vm_page_busy_sleep(9) pass and we are going
to sleep, despite the page being share-busied.

Update check for m->busy_lock == VPB_UNBUSIED in vm_page_busy_sleep(9)
to also accept shared-busy state if we only wait for the xbusy state to
pass.

Merge sequential if()s with the same 'then' clause in
vm_page_busy_sleep().

Note that the current code does not share-busy pages from parallel
threads, the only way to have more that one sbusy owner is right now
is to recurse.

Reported and tested by:	pho (previous version)
Reviewed by:	alc, markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D8196
2016-10-13 14:41:05 +00:00
..
i915 Fix a race in vm_page_busy_sleep(9). 2016-10-13 14:41:05 +00:00
radeon Remove redundant declaration for radeon_pm_acpi_event_handler(..) to fix 2016-07-11 15:47:43 +00:00
ttm Fix a race in vm_page_busy_sleep(9). 2016-10-13 14:41:05 +00:00
ati_pcigart.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_agpsupport.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_atomic.h drm/i915: Update to match Linux 3.8.13 2016-03-08 20:33:02 +00:00
drm_auth.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_buffer.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_buffer.h
drm_bufs.c Add a new file operations hook for mmap operations. File type-specific 2015-06-04 19:41:15 +00:00
drm_context.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_core.h
drm_crtc.c drm: Revert the part of r288653 about M_WAITOK vs M_NOWAIT 2016-01-13 20:35:02 +00:00
drm_crtc.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_crtc_helper.c drm: Import Linux commit 9bc3cd5673d84d29272fa7181a4dfca83cbb48c1 2015-03-29 18:45:51 +00:00
drm_crtc_helper.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_dma.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_dp_helper.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_dp_helper.h drm: Import drm_dp_helper.c from Linux 3.8-rc3 2013-08-24 23:38:57 +00:00
drm_dp_iic_helper.c Revert bus_get_cpus() for now. 2016-05-03 01:17:40 +00:00
drm_drv.c drm: Fix dev->ioctl_count references leak 2016-03-11 18:59:15 +00:00
drm_edid.c drm2(4): Fix double-free in low-memory error path 2016-04-20 03:45:45 +00:00
drm_edid.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_edid_modes.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_fb_helper.c Remove taskqueue_enqueue_fast(). 2016-03-01 17:47:32 +00:00
drm_fb_helper.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_fixed.h drm: Import drm_fixed.h from Linux 3.8 2013-08-25 12:27:15 +00:00
drm_fops.c drm2: a few minor fixes after r280183 2015-10-04 07:45:36 +00:00
drm_fourcc.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_gem.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_gem_names.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_gem_names.h drm/i915: Add HW context support 2014-09-17 08:28:50 +00:00
drm_global.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_global.h
drm_hashtab.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_hashtab.h
drm_ioc32.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_ioctl.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_irq.c CALLOUT_MPSAFE has lost its meaning since r141428, i.e., for more than ten 2015-05-22 17:05:21 +00:00
drm_linux_list.h drm/i915: Update to match Linux 3.8.13 2016-03-08 20:33:02 +00:00
drm_linux_list_sort.c drm: Fix build with gcc, broken with r258549 2013-11-25 15:01:59 +00:00
drm_lock.c Hide an unused in FreeBSD function behind #ifdef linux to get rid of 2015-09-22 15:32:27 +00:00
drm_mem_util.h drm/i915: Update to match Linux 3.8.13 2016-03-08 20:33:02 +00:00
drm_memory.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_mm.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_mm.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_mode.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_modes.c drm: Import Linux commit 9bc3cd5673d84d29272fa7181a4dfca83cbb48c1 2015-03-29 18:45:51 +00:00
drm_os_freebsd.c [drm] fix up hex_dump_to_buffer to not overflow linebuf. 2016-06-03 05:01:35 +00:00
drm_os_freebsd.h Always panic if an invalid capability is passed to capable(..) instead of 2016-07-14 13:55:38 +00:00
drm_pci.c drm: Revert the part of r288653 about M_WAITOK vs M_NOWAIT 2016-01-13 20:35:02 +00:00
drm_pciids.h drm/i915: Update to match Linux 3.8.13 2016-03-08 20:33:02 +00:00
drm_sarea.h drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_scatter.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_stub.c drm2: a few minor fixes after r280183 2015-10-04 07:45:36 +00:00
drm_sysctl.c drm: Update the device-independent code to match Linux 3.8.13 2015-03-17 18:50:33 +00:00
drm_vm.c sys/dev: minor spelling fixes. 2016-05-03 03:41:25 +00:00
drmP.h Define drmP.h's __OS_HAS_AGP and __OS_HAS_MTRR macros in a defined and 2016-09-03 13:33:28 +00:00