Commit 101d15c7 authored by Keith Packard's avatar Keith Packard Committed by Adam Jackson

During reset/shutdown, clean up leases in DIX instead of each driver

Instead of having every video driver loop over any pending leases to
free them during CloseScreen, do this up in the DIX layer by
terminating leases when a leased CRTC or Output is destroyed and
(just to make sure), also terminating leases in RRCloseScreen. The
latter should "never" get invoked as any lease should be associated
with a resource which was destroyed.

This is required as by the time the driver's CloseScreen function is
invoked, we've already freed all of the DIX randr structures and no
longer have any way to reference the leases
Signed-off-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=106960
Cc: Thomas Hellstrom <thellstrom@vmware.com>
(cherry picked from commit 1ef7aed3)
parent 9347326d
......@@ -1838,8 +1838,6 @@ CloseScreen(ScreenPtr pScreen)
ms->drmmode.shadow_fb2 = NULL;
}
drmmode_terminate_leases(pScrn, &ms->drmmode);
drmmode_uevent_fini(pScrn, &ms->drmmode);
drmmode_free_bos(pScrn, &ms->drmmode);
......
......@@ -3327,23 +3327,6 @@ drmmode_terminate_lease(RRLeasePtr lease)
}
}
void
drmmode_terminate_leases(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
{
ScreenPtr screen = xf86ScrnToScreen(pScrn);
rrScrPrivPtr scr_priv = rrGetScrPriv(screen);
RRLeasePtr lease, next;
xorg_list_for_each_entry_safe(lease, next, &scr_priv->leases, list) {
drmmode_lease_private_ptr lease_private = lease->devPrivate;
drmModeRevokeLease(drmmode->fd, lease_private->lessee_id);
free(lease_private);
lease->devPrivate = NULL;
RRLeaseTerminated(lease);
RRLeaseFree(lease);
}
}
static const xf86CrtcConfigFuncsRec drmmode_xf86crtc_config_funcs = {
.resize = drmmode_xf86crtc_resize,
.create_lease = drmmode_create_lease,
......
......@@ -272,8 +272,6 @@ extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn);
extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode);
extern void drmmode_terminate_leases(ScrnInfoPtr scrn, drmmode_ptr drmmode);
Bool drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
void *drmmode_map_front_bo(drmmode_ptr drmmode);
Bool drmmode_map_cursor_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
......
......@@ -89,8 +89,12 @@ RRCloseScreen(ScreenPtr pScreen)
{
rrScrPriv(pScreen);
int j;
RRLeasePtr lease, next;
unwrap(pScrPriv, pScreen, CloseScreen);
xorg_list_for_each_entry_safe(lease, next, &pScrPriv->leases, list)
RRTerminateLease(lease);
for (j = pScrPriv->numCrtcs - 1; j >= 0; j--)
RRCrtcDestroy(pScrPriv->crtcs[j]);
for (j = pScrPriv->numOutputs - 1; j >= 0; j--)
......
......@@ -829,6 +829,9 @@ RRCrtcIsLeased(RRCrtcPtr crtc);
extern _X_EXPORT Bool
RROutputIsLeased(RROutputPtr output);
void
RRTerminateLease(RRLeasePtr lease);
Bool
RRLeaseInit(void);
......
......@@ -872,6 +872,17 @@ RRCrtcDestroyResource(void *value, XID pid)
if (pScreen) {
rrScrPriv(pScreen);
int i;
RRLeasePtr lease, next;
xorg_list_for_each_entry_safe(lease, next, &pScrPriv->leases, list) {
int c;
for (c = 0; c < lease->numCrtcs; c++) {
if (lease->crtcs[c] == crtc) {
RRTerminateLease(lease);
break;
}
}
}
for (i = 0; i < pScrPriv->numCrtcs; i++) {
if (pScrPriv->crtcs[i] == crtc) {
......
......@@ -169,7 +169,7 @@ RRLeaseFree(RRLeasePtr lease)
* finished, which may be some time after this function returns
* if the driver operation is asynchronous
*/
static void
void
RRTerminateLease(RRLeasePtr lease)
{
ScreenPtr screen = lease->screen;
......
......@@ -379,6 +379,17 @@ RROutputDestroyResource(void *value, XID pid)
if (pScreen) {
rrScrPriv(pScreen);
int i;
RRLeasePtr lease, next;
xorg_list_for_each_entry_safe(lease, next, &pScrPriv->leases, list) {
int o;
for (o = 0; o < lease->numOutputs; o++) {
if (lease->outputs[o] == output) {
RRTerminateLease(lease);
break;
}
}
}
if (pScrPriv->primaryOutput == output)
pScrPriv->primaryOutput = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment