From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2C70DC3A589 for ; Tue, 20 Aug 2019 23:15:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E5FB822DD3 for ; Tue, 20 Aug 2019 23:15:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="l1Jlh9v8" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726250AbfHTXPU (ORCPT ); Tue, 20 Aug 2019 19:15:20 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:35276 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726128AbfHTXPU (ORCPT ); Tue, 20 Aug 2019 19:15:20 -0400 Received: by mail-pf1-f194.google.com with SMTP id d85so111780pfd.2; Tue, 20 Aug 2019 16:15:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=P4DqP7QEK94+1Gku+4oxR+UEtdt6lfhW9qrWkYTmrm0=; b=l1Jlh9v8yFIh1I4x00eju6HVusBfXMpANMF0wTStBschH9ne2Lx8J8F4XSW9uNfAJl SyzPyL/7vxXH3JiNV4z/mZVZsdH273B6gE3q7efnj/UJl8QNktzpktZ26K5OlOc5zJuv NS/JU7P8RDey83Z6UPYXlzDAWyFJvlJVb15OcxzffkAEjQLpJwN9GAoudWtxYtVPab8j lQwwnn/7H7tB3kMx8ntEIJn7HPr6ko0pFu7nn5fOoKfk4w9PuFw4Th0Byj5Gpds0+0Bh R9apU5q6EszwqxtXghPjdW2JvHY38mkPhU9gVVsBNnDx9P8rAhF7q5fPtc1rdKzuaF9B U6/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=P4DqP7QEK94+1Gku+4oxR+UEtdt6lfhW9qrWkYTmrm0=; b=qPaDFt+tbg9GeXWElRwXynYG3Ni6z2qL54jv5eUIi3AIbmUpsd4N1aMfmfYpBsylFx ERSuVpf2Xes7bWIUBeTYnQur6FUjcmIAUAyp2RSt8gbO0+mdPKJ52oGXjgYQdbGkuDfz MPfxbEjs/M1SnUYapnspbxX02DYCbyC97zS7f5TXn2bjdGK6eIDhelMSmraRW0vM/7Ml 88ePnOKSa3u0bq36B6SPJh3p2xNL8elkdTojsglU9NLJhXVFuZhEsfss+56hae4rUGCk LxqdfQu/cDAUpUBw91vy78gJ/U4sWsruAOrhzGxjfayUzM6aj0sLk9/XFdLcockU90ri 9Mzg== X-Gm-Message-State: APjAAAW2FEF5QB6K/mji9EcoMhm2l7eyc8UEmcuihTQS7E/uGLMZmYKO z4XPJvYn8GZzMVCTtu5rUYs= X-Google-Smtp-Source: APXvYqw3byR+E/rFXK0tamYcHiDaVtGc/wXLE5AD1XLZECK+RZL9p3RB4bJ/1eDgmu+NgWnNYPZpWg== X-Received: by 2002:a63:5648:: with SMTP id g8mr26329980pgm.81.1566342919199; Tue, 20 Aug 2019 16:15:19 -0700 (PDT) Received: from localhost ([100.118.89.196]) by smtp.gmail.com with ESMTPSA id k22sm21887604pfk.157.2019.08.20.16.15.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Aug 2019 16:15:18 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: Sean Paul , Rob Clark , Rob Clark , Sean Paul , David Airlie , Daniel Vetter , Jeykumar Sankaran , Jordan Crouse , Jayant Shekhar , Bruce Wang , Sravanthi Kollukuduru , Abhinav Kumar , Fritz Koenig , linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH] drm/msm/dpu: fix "frame done" timeouts Date: Tue, 20 Aug 2019 16:12:28 -0700 Message-Id: <20190820231301.28445-1-robdclark@gmail.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org From: Rob Clark Previously, dpu_crtc_frame_event_work() would try to aquire all the modeset locks in order to check whether it can release bandwidth. (If we only have cmd-mode display, bandwidth can be released at frame-done time.) The problem with this is that it is also responsible for signalling frame_done_comp, which dpu_crtc_commit_kickoff() waits on if there is already a frame pending. This is called in the msm_atomic_commit_tail() path.. which means that for non-nonblock commits, at least some of the modeset locks are already held. Re-work this scheme to use a reference count to track our need to have clocks enabled. It is incremented for each atomic commit, and decremented in the corresponding frame-done. Additionally, any crtc used in video mode hold an extra reference while they are enabled. The net effect is that we can determine in frame-done whether it is safe to drop bandwidth without needing to aquire any modeset locks. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 16 +------ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 45 +++++++++++-------- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 2 + drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 8 ++++ 4 files changed, 38 insertions(+), 33 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c index 5cda96875e03..09a49b59bb5b 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c @@ -214,7 +214,6 @@ static int _dpu_core_perf_crtc_update_bus(struct dpu_kms *kms, */ void dpu_core_perf_crtc_release_bw(struct drm_crtc *crtc) { - struct drm_crtc *tmp_crtc; struct dpu_crtc *dpu_crtc; struct dpu_crtc_state *dpu_cstate; struct dpu_kms *kms; @@ -233,22 +232,9 @@ void dpu_core_perf_crtc_release_bw(struct drm_crtc *crtc) dpu_crtc = to_dpu_crtc(crtc); dpu_cstate = to_dpu_crtc_state(crtc->state); - /* only do this for command mode rt client */ - if (dpu_crtc_get_intf_mode(crtc) != INTF_MODE_CMD) + if (atomic_dec_return(&kms->bandwidth_ref) > 0) return; - /* - * If video interface present, cmd panel bandwidth cannot be - * released. - */ - if (dpu_crtc_get_intf_mode(crtc) == INTF_MODE_CMD) - drm_for_each_crtc(tmp_crtc, crtc->dev) { - if (tmp_crtc->enabled && - dpu_crtc_get_intf_mode(tmp_crtc) == - INTF_MODE_VIDEO) - return; - } - /* Release the bandwidth */ if (kms->perf.enable_bw_release) { trace_dpu_cmd_release_bw(crtc->base.id); diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c index b3417d56032d..4e54550c4a80 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -292,19 +292,6 @@ void dpu_crtc_vblank_callback(struct drm_crtc *crtc) trace_dpu_crtc_vblank_cb(DRMID(crtc)); } -static void dpu_crtc_release_bw_unlocked(struct drm_crtc *crtc) -{ - int ret = 0; - struct drm_modeset_acquire_ctx ctx; - - DRM_MODESET_LOCK_ALL_BEGIN(crtc->dev, ctx, 0, ret); - dpu_core_perf_crtc_release_bw(crtc); - DRM_MODESET_LOCK_ALL_END(ctx, ret); - if (ret) - DRM_ERROR("Failed to acquire modeset locks to release bw, %d\n", - ret); -} - static void dpu_crtc_frame_event_work(struct kthread_work *work) { struct dpu_crtc_frame_event *fevent = container_of(work, @@ -334,7 +321,7 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work) /* release bandwidth and other resources */ trace_dpu_crtc_frame_event_done(DRMID(crtc), fevent->event); - dpu_crtc_release_bw_unlocked(crtc); + dpu_core_perf_crtc_release_bw(crtc); } else { trace_dpu_crtc_frame_event_more_pending(DRMID(crtc), fevent->event); @@ -650,7 +637,7 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc, bool async) dpu_encoder_prepare_for_kickoff(encoder, async); if (!async) { - /* wait for frame_event_done completion */ + /* wait for previous frame_event_done completion */ DPU_ATRACE_BEGIN("wait_for_frame_done_event"); ret = _dpu_crtc_wait_for_frame_done(crtc); DPU_ATRACE_END("wait_for_frame_done_event"); @@ -729,6 +716,7 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, struct drm_encoder *encoder; struct msm_drm_private *priv; unsigned long flags; + bool release_bandwidth = false; if (!crtc || !crtc->dev || !crtc->dev->dev_private || !crtc->state) { DPU_ERROR("invalid crtc\n"); @@ -745,8 +733,15 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, drm_crtc_vblank_off(crtc); drm_for_each_encoder_mask(encoder, crtc->dev, - old_crtc_state->encoder_mask) + old_crtc_state->encoder_mask) { + /* in video mode, we hold an extra bandwidth reference + * as we cannot drop bandwidth at frame-done if any + * crtc is being used in video mode. + */ + if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO) + release_bandwidth = true; dpu_encoder_assign_crtc(encoder, NULL); + } /* wait for frame_event_done completion */ if (_dpu_crtc_wait_for_frame_done(crtc)) @@ -760,7 +755,8 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, if (atomic_read(&dpu_crtc->frame_pending)) { trace_dpu_crtc_disable_frame_pending(DRMID(crtc), atomic_read(&dpu_crtc->frame_pending)); - dpu_core_perf_crtc_release_bw(crtc); + if (release_bandwidth) + dpu_core_perf_crtc_release_bw(crtc); atomic_set(&dpu_crtc->frame_pending, 0); } @@ -792,6 +788,7 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, struct dpu_crtc *dpu_crtc; struct drm_encoder *encoder; struct msm_drm_private *priv; + bool request_bandwidth; if (!crtc || !crtc->dev || !crtc->dev->dev_private) { DPU_ERROR("invalid crtc\n"); @@ -804,9 +801,19 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, DRM_DEBUG_KMS("crtc%d\n", crtc->base.id); dpu_crtc = to_dpu_crtc(crtc); - drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) + drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) { + /* in video mode, we hold an extra bandwidth reference + * as we cannot drop bandwidth at frame-done if any + * crtc is being used in video mode. + */ + if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO) + request_bandwidth = true; dpu_encoder_register_frame_event_callback(encoder, dpu_crtc_frame_event_cb, (void *)crtc); + } + + if (request_bandwidth) + atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref); trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc); dpu_crtc->enabled = true; @@ -981,6 +988,8 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc, } } + atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref); + rc = dpu_core_perf_crtc_check(crtc, state); if (rc) { DPU_ERROR("crtc%d failed performance check %d\n", diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index 99d0bd569c38..681955eb286f 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -800,6 +800,8 @@ static int dpu_kms_hw_init(struct msm_kms *kms) return rc; } + atomic_set(&dpu_kms->bandwidth_ref, 0); + dpu_kms->mmio = msm_ioremap(dpu_kms->pdev, "mdp", "mdp"); if (IS_ERR(dpu_kms->mmio)) { rc = PTR_ERR(dpu_kms->mmio); diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h index 9e40f559c51f..fdef016f5ca3 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h @@ -120,6 +120,14 @@ struct dpu_kms { struct platform_device *pdev; bool rpm_enabled; struct dss_module_power mp; + + /* reference count bandwidth requests, so we know when we can + * release bandwidth. Each atomic update increments, and frame- + * done event decrements. Additionally, for video mode, the + * reference is incremented when crtc is enabled, and decremented + * when disabled. + */ + atomic_t bandwidth_ref; }; struct vsync_info { -- 2.21.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Clark Subject: [PATCH] drm/msm/dpu: fix "frame done" timeouts Date: Tue, 20 Aug 2019 16:12:28 -0700 Message-ID: <20190820231301.28445-1-robdclark@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: Rob Clark , Bruce Wang , Fritz Koenig , David Airlie , linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Jordan Crouse , Abhinav Kumar , linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Jayant Shekhar , Rob Clark , Sean Paul , Daniel Vetter , Jeykumar Sankaran , freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Sean Paul , Sravanthi Kollukuduru List-Id: dri-devel@lists.freedesktop.org RnJvbTogUm9iIENsYXJrIDxyb2JkY2xhcmtAY2hyb21pdW0ub3JnPgoKUHJldmlvdXNseSwgZHB1 X2NydGNfZnJhbWVfZXZlbnRfd29yaygpIHdvdWxkIHRyeSB0byBhcXVpcmUgYWxsIHRoZQptb2Rl c2V0IGxvY2tzIGluIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgaXQgY2FuIHJlbGVhc2UgYmFuZHdp ZHRoLiAgKElmCndlIG9ubHkgaGF2ZSBjbWQtbW9kZSBkaXNwbGF5LCBiYW5kd2lkdGggY2FuIGJl IHJlbGVhc2VkIGF0IGZyYW1lLWRvbmUKdGltZS4pCgpUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMg dGhhdCBpdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBzaWduYWxsaW5nCmZyYW1lX2RvbmVfY29t cCwgd2hpY2ggZHB1X2NydGNfY29tbWl0X2tpY2tvZmYoKSB3YWl0cyBvbiBpZiB0aGVyZSBpcwph bHJlYWR5IGEgZnJhbWUgcGVuZGluZy4gIFRoaXMgaXMgY2FsbGVkIGluIHRoZSBtc21fYXRvbWlj X2NvbW1pdF90YWlsKCkKcGF0aC4uIHdoaWNoIG1lYW5zIHRoYXQgZm9yIG5vbi1ub25ibG9jayBj b21taXRzLCBhdCBsZWFzdCBzb21lIG9mIHRoZQptb2Rlc2V0IGxvY2tzIGFyZSBhbHJlYWR5IGhl bGQuCgpSZS13b3JrIHRoaXMgc2NoZW1lIHRvIHVzZSBhIHJlZmVyZW5jZSBjb3VudCB0byB0cmFj ayBvdXIgbmVlZCB0byBoYXZlCmNsb2NrcyBlbmFibGVkLiAgSXQgaXMgaW5jcmVtZW50ZWQgZm9y IGVhY2ggYXRvbWljIGNvbW1pdCwgYW5kCmRlY3JlbWVudGVkIGluIHRoZSBjb3JyZXNwb25kaW5n IGZyYW1lLWRvbmUuICBBZGRpdGlvbmFsbHksIGFueSBjcnRjCnVzZWQgaW4gdmlkZW8gbW9kZSBo b2xkIGFuIGV4dHJhIHJlZmVyZW5jZSB3aGlsZSB0aGV5IGFyZSBlbmFibGVkLiAgVGhlCm5ldCBl ZmZlY3QgaXMgdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGluIGZyYW1lLWRvbmUgd2hldGhlciBpdCBp cyBzYWZlIHRvCmRyb3AgYmFuZHdpZHRoIHdpdGhvdXQgbmVlZGluZyB0byBhcXVpcmUgYW55IG1v ZGVzZXQgbG9ja3MuCgpTaWduZWQtb2ZmLWJ5OiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BjaHJvbWl1 bS5vcmc+Ci0tLQogZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2NvcmVfcGVyZi5j IHwgMTYgKy0tLS0tLQogZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2NydGMuYyAg ICAgIHwgNDUgKysrKysrKysrKystLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2Rw dTEvZHB1X2ttcy5jICAgICAgIHwgIDIgKwogZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEv ZHB1X2ttcy5oICAgICAgIHwgIDggKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAzOCBpbnNlcnRpb25z KCspLCAzMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rp c3AvZHB1MS9kcHVfY29yZV9wZXJmLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvZHB1MS9k cHVfY29yZV9wZXJmLmMKaW5kZXggNWNkYTk2ODc1ZTAzLi4wOWE0OWI1OWJiNWIgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9kcHUxL2RwdV9jb3JlX3BlcmYuYworKysgYi9k cml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvZHB1MS9kcHVfY29yZV9wZXJmLmMKQEAgLTIxNCw3ICsy MTQsNiBAQCBzdGF0aWMgaW50IF9kcHVfY29yZV9wZXJmX2NydGNfdXBkYXRlX2J1cyhzdHJ1Y3Qg ZHB1X2ttcyAqa21zLAogICovCiB2b2lkIGRwdV9jb3JlX3BlcmZfY3J0Y19yZWxlYXNlX2J3KHN0 cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKLQlzdHJ1Y3QgZHJtX2NydGMgKnRtcF9jcnRjOwogCXN0 cnVjdCBkcHVfY3J0YyAqZHB1X2NydGM7CiAJc3RydWN0IGRwdV9jcnRjX3N0YXRlICpkcHVfY3N0 YXRlOwogCXN0cnVjdCBkcHVfa21zICprbXM7CkBAIC0yMzMsMjIgKzIzMiw5IEBAIHZvaWQgZHB1 X2NvcmVfcGVyZl9jcnRjX3JlbGVhc2VfYncoc3RydWN0IGRybV9jcnRjICpjcnRjKQogCWRwdV9j cnRjID0gdG9fZHB1X2NydGMoY3J0Yyk7CiAJZHB1X2NzdGF0ZSA9IHRvX2RwdV9jcnRjX3N0YXRl KGNydGMtPnN0YXRlKTsKIAotCS8qIG9ubHkgZG8gdGhpcyBmb3IgY29tbWFuZCBtb2RlIHJ0IGNs aWVudCAqLwotCWlmIChkcHVfY3J0Y19nZXRfaW50Zl9tb2RlKGNydGMpICE9IElOVEZfTU9ERV9D TUQpCisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZrbXMtPmJhbmR3aWR0aF9yZWYpID4gMCkKIAkJ cmV0dXJuOwogCi0JLyoKLQkgKiBJZiB2aWRlbyBpbnRlcmZhY2UgcHJlc2VudCwgY21kIHBhbmVs IGJhbmR3aWR0aCBjYW5ub3QgYmUKLQkgKiByZWxlYXNlZC4KLQkgKi8KLQlpZiAoZHB1X2NydGNf Z2V0X2ludGZfbW9kZShjcnRjKSA9PSBJTlRGX01PREVfQ01EKQotCQlkcm1fZm9yX2VhY2hfY3J0 Yyh0bXBfY3J0YywgY3J0Yy0+ZGV2KSB7Ci0JCQlpZiAodG1wX2NydGMtPmVuYWJsZWQgJiYKLQkJ CQlkcHVfY3J0Y19nZXRfaW50Zl9tb2RlKHRtcF9jcnRjKSA9PQotCQkJCQkJSU5URl9NT0RFX1ZJ REVPKQotCQkJCXJldHVybjsKLQkJfQotCiAJLyogUmVsZWFzZSB0aGUgYmFuZHdpZHRoICovCiAJ aWYgKGttcy0+cGVyZi5lbmFibGVfYndfcmVsZWFzZSkgewogCQl0cmFjZV9kcHVfY21kX3JlbGVh c2VfYncoY3J0Yy0+YmFzZS5pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rp c3AvZHB1MS9kcHVfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2Ny dGMuYwppbmRleCBiMzQxN2Q1NjAzMmQuLjRlNTQ1NTBjNGE4MCAxMDA2NDQKLS0tIGEvZHJpdmVy cy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v bXNtL2Rpc3AvZHB1MS9kcHVfY3J0Yy5jCkBAIC0yOTIsMTkgKzI5Miw2IEBAIHZvaWQgZHB1X2Ny dGNfdmJsYW5rX2NhbGxiYWNrKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIAl0cmFjZV9kcHVfY3J0 Y192YmxhbmtfY2IoRFJNSUQoY3J0YykpOwogfQogCi1zdGF0aWMgdm9pZCBkcHVfY3J0Y19yZWxl YXNlX2J3X3VubG9ja2VkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlpbnQgcmV0ID0gMDsK LQlzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHggY3R4OwotCi0JRFJNX01PREVTRVRfTE9D S19BTExfQkVHSU4oY3J0Yy0+ZGV2LCBjdHgsIDAsIHJldCk7Ci0JZHB1X2NvcmVfcGVyZl9jcnRj X3JlbGVhc2VfYncoY3J0Yyk7Ci0JRFJNX01PREVTRVRfTE9DS19BTExfRU5EKGN0eCwgcmV0KTsK LQlpZiAocmV0KQotCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhY3F1aXJlIG1vZGVzZXQgbG9ja3Mg dG8gcmVsZWFzZSBidywgJWRcbiIsCi0JCQkgIHJldCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGRwdV9j cnRjX2ZyYW1lX2V2ZW50X3dvcmsoc3RydWN0IGt0aHJlYWRfd29yayAqd29yaykKIHsKIAlzdHJ1 Y3QgZHB1X2NydGNfZnJhbWVfZXZlbnQgKmZldmVudCA9IGNvbnRhaW5lcl9vZih3b3JrLApAQCAt MzM0LDcgKzMyMSw3IEBAIHN0YXRpYyB2b2lkIGRwdV9jcnRjX2ZyYW1lX2V2ZW50X3dvcmsoc3Ry dWN0IGt0aHJlYWRfd29yayAqd29yaykKIAkJCS8qIHJlbGVhc2UgYmFuZHdpZHRoIGFuZCBvdGhl ciByZXNvdXJjZXMgKi8KIAkJCXRyYWNlX2RwdV9jcnRjX2ZyYW1lX2V2ZW50X2RvbmUoRFJNSUQo Y3J0YyksCiAJCQkJCQkJZmV2ZW50LT5ldmVudCk7Ci0JCQlkcHVfY3J0Y19yZWxlYXNlX2J3X3Vu bG9ja2VkKGNydGMpOworCQkJZHB1X2NvcmVfcGVyZl9jcnRjX3JlbGVhc2VfYncoY3J0Yyk7CiAJ CX0gZWxzZSB7CiAJCQl0cmFjZV9kcHVfY3J0Y19mcmFtZV9ldmVudF9tb3JlX3BlbmRpbmcoRFJN SUQoY3J0YyksCiAJCQkJCQkJCWZldmVudC0+ZXZlbnQpOwpAQCAtNjUwLDcgKzYzNyw3IEBAIHZv aWQgZHB1X2NydGNfY29tbWl0X2tpY2tvZmYoc3RydWN0IGRybV9jcnRjICpjcnRjLCBib29sIGFz eW5jKQogCQlkcHVfZW5jb2Rlcl9wcmVwYXJlX2Zvcl9raWNrb2ZmKGVuY29kZXIsIGFzeW5jKTsK IAogCWlmICghYXN5bmMpIHsKLQkJLyogd2FpdCBmb3IgZnJhbWVfZXZlbnRfZG9uZSBjb21wbGV0 aW9uICovCisJCS8qIHdhaXQgZm9yIHByZXZpb3VzIGZyYW1lX2V2ZW50X2RvbmUgY29tcGxldGlv biAqLwogCQlEUFVfQVRSQUNFX0JFR0lOKCJ3YWl0X2Zvcl9mcmFtZV9kb25lX2V2ZW50Iik7CiAJ CXJldCA9IF9kcHVfY3J0Y193YWl0X2Zvcl9mcmFtZV9kb25lKGNydGMpOwogCQlEUFVfQVRSQUNF X0VORCgid2FpdF9mb3JfZnJhbWVfZG9uZV9ldmVudCIpOwpAQCAtNzI5LDYgKzcxNiw3IEBAIHN0 YXRpYyB2b2lkIGRwdV9jcnRjX2Rpc2FibGUoc3RydWN0IGRybV9jcnRjICpjcnRjLAogCXN0cnVj dCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2Owog CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCByZWxlYXNlX2JhbmR3aWR0aCA9IGZhbHNlOwog CiAJaWYgKCFjcnRjIHx8ICFjcnRjLT5kZXYgfHwgIWNydGMtPmRldi0+ZGV2X3ByaXZhdGUgfHwg IWNydGMtPnN0YXRlKSB7CiAJCURQVV9FUlJPUigiaW52YWxpZCBjcnRjXG4iKTsKQEAgLTc0NSw4 ICs3MzMsMTUgQEAgc3RhdGljIHZvaWQgZHB1X2NydGNfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMg KmNydGMsCiAJZHJtX2NydGNfdmJsYW5rX29mZihjcnRjKTsKIAogCWRybV9mb3JfZWFjaF9lbmNv ZGVyX21hc2soZW5jb2RlciwgY3J0Yy0+ZGV2LAotCQkJCSAgb2xkX2NydGNfc3RhdGUtPmVuY29k ZXJfbWFzaykKKwkJCQkgIG9sZF9jcnRjX3N0YXRlLT5lbmNvZGVyX21hc2spIHsKKwkJLyogaW4g dmlkZW8gbW9kZSwgd2UgaG9sZCBhbiBleHRyYSBiYW5kd2lkdGggcmVmZXJlbmNlCisJCSAqIGFz IHdlIGNhbm5vdCBkcm9wIGJhbmR3aWR0aCBhdCBmcmFtZS1kb25lIGlmIGFueQorCQkgKiBjcnRj IGlzIGJlaW5nIHVzZWQgaW4gdmlkZW8gbW9kZS4KKwkJICovCisJCWlmIChkcHVfZW5jb2Rlcl9n ZXRfaW50Zl9tb2RlKGVuY29kZXIpID09IElOVEZfTU9ERV9WSURFTykKKwkJCXJlbGVhc2VfYmFu ZHdpZHRoID0gdHJ1ZTsKIAkJZHB1X2VuY29kZXJfYXNzaWduX2NydGMoZW5jb2RlciwgTlVMTCk7 CisJfQogCiAJLyogd2FpdCBmb3IgZnJhbWVfZXZlbnRfZG9uZSBjb21wbGV0aW9uICovCiAJaWYg KF9kcHVfY3J0Y193YWl0X2Zvcl9mcmFtZV9kb25lKGNydGMpKQpAQCAtNzYwLDcgKzc1NSw4IEBA IHN0YXRpYyB2b2lkIGRwdV9jcnRjX2Rpc2FibGUoc3RydWN0IGRybV9jcnRjICpjcnRjLAogCWlm IChhdG9taWNfcmVhZCgmZHB1X2NydGMtPmZyYW1lX3BlbmRpbmcpKSB7CiAJCXRyYWNlX2RwdV9j cnRjX2Rpc2FibGVfZnJhbWVfcGVuZGluZyhEUk1JRChjcnRjKSwKIAkJCQkgICAgIGF0b21pY19y ZWFkKCZkcHVfY3J0Yy0+ZnJhbWVfcGVuZGluZykpOwotCQlkcHVfY29yZV9wZXJmX2NydGNfcmVs ZWFzZV9idyhjcnRjKTsKKwkJaWYgKHJlbGVhc2VfYmFuZHdpZHRoKQorCQkJZHB1X2NvcmVfcGVy Zl9jcnRjX3JlbGVhc2VfYncoY3J0Yyk7CiAJCWF0b21pY19zZXQoJmRwdV9jcnRjLT5mcmFtZV9w ZW5kaW5nLCAwKTsKIAl9CiAKQEAgLTc5Miw2ICs3ODgsNyBAQCBzdGF0aWMgdm9pZCBkcHVfY3J0 Y19lbmFibGUoc3RydWN0IGRybV9jcnRjICpjcnRjLAogCXN0cnVjdCBkcHVfY3J0YyAqZHB1X2Ny dGM7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCBtc21fZHJtX3ByaXZh dGUgKnByaXY7CisJYm9vbCByZXF1ZXN0X2JhbmR3aWR0aDsKIAogCWlmICghY3J0YyB8fCAhY3J0 Yy0+ZGV2IHx8ICFjcnRjLT5kZXYtPmRldl9wcml2YXRlKSB7CiAJCURQVV9FUlJPUigiaW52YWxp ZCBjcnRjXG4iKTsKQEAgLTgwNCw5ICs4MDEsMTkgQEAgc3RhdGljIHZvaWQgZHB1X2NydGNfZW5h YmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAlEUk1fREVCVUdfS01TKCJjcnRjJWRcbiIsIGNy dGMtPmJhc2UuaWQpOwogCWRwdV9jcnRjID0gdG9fZHB1X2NydGMoY3J0Yyk7CiAKLQlkcm1fZm9y X2VhY2hfZW5jb2Rlcl9tYXNrKGVuY29kZXIsIGNydGMtPmRldiwgY3J0Yy0+c3RhdGUtPmVuY29k ZXJfbWFzaykKKwlkcm1fZm9yX2VhY2hfZW5jb2Rlcl9tYXNrKGVuY29kZXIsIGNydGMtPmRldiwg Y3J0Yy0+c3RhdGUtPmVuY29kZXJfbWFzaykgeworCQkvKiBpbiB2aWRlbyBtb2RlLCB3ZSBob2xk IGFuIGV4dHJhIGJhbmR3aWR0aCByZWZlcmVuY2UKKwkJICogYXMgd2UgY2Fubm90IGRyb3AgYmFu ZHdpZHRoIGF0IGZyYW1lLWRvbmUgaWYgYW55CisJCSAqIGNydGMgaXMgYmVpbmcgdXNlZCBpbiB2 aWRlbyBtb2RlLgorCQkgKi8KKwkJaWYgKGRwdV9lbmNvZGVyX2dldF9pbnRmX21vZGUoZW5jb2Rl cikgPT0gSU5URl9NT0RFX1ZJREVPKQorCQkJcmVxdWVzdF9iYW5kd2lkdGggPSB0cnVlOwogCQlk cHVfZW5jb2Rlcl9yZWdpc3Rlcl9mcmFtZV9ldmVudF9jYWxsYmFjayhlbmNvZGVyLAogCQkJCWRw dV9jcnRjX2ZyYW1lX2V2ZW50X2NiLCAodm9pZCAqKWNydGMpOworCX0KKworCWlmIChyZXF1ZXN0 X2JhbmR3aWR0aCkKKwkJYXRvbWljX2luYygmX2RwdV9jcnRjX2dldF9rbXMoY3J0YyktPmJhbmR3 aWR0aF9yZWYpOwogCiAJdHJhY2VfZHB1X2NydGNfZW5hYmxlKERSTUlEKGNydGMpLCB0cnVlLCBk cHVfY3J0Yyk7CiAJZHB1X2NydGMtPmVuYWJsZWQgPSB0cnVlOwpAQCAtOTgxLDYgKzk4OCw4IEBA IHN0YXRpYyBpbnQgZHB1X2NydGNfYXRvbWljX2NoZWNrKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywK IAkJfQogCX0KIAorCWF0b21pY19pbmMoJl9kcHVfY3J0Y19nZXRfa21zKGNydGMpLT5iYW5kd2lk dGhfcmVmKTsKKwogCXJjID0gZHB1X2NvcmVfcGVyZl9jcnRjX2NoZWNrKGNydGMsIHN0YXRlKTsK IAlpZiAocmMpIHsKIAkJRFBVX0VSUk9SKCJjcnRjJWQgZmFpbGVkIHBlcmZvcm1hbmNlIGNoZWNr ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2tt cy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1X2ttcy5jCmluZGV4IDk5ZDBi ZDU2OWMzOC4uNjgxOTU1ZWIyODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rp c3AvZHB1MS9kcHVfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL2RwdTEvZHB1 X2ttcy5jCkBAIC04MDAsNiArODAwLDggQEAgc3RhdGljIGludCBkcHVfa21zX2h3X2luaXQoc3Ry dWN0IG1zbV9rbXMgKmttcykKIAkJcmV0dXJuIHJjOwogCX0KIAorCWF0b21pY19zZXQoJmRwdV9r bXMtPmJhbmR3aWR0aF9yZWYsIDApOworCiAJZHB1X2ttcy0+bW1pbyA9IG1zbV9pb3JlbWFwKGRw dV9rbXMtPnBkZXYsICJtZHAiLCAibWRwIik7CiAJaWYgKElTX0VSUihkcHVfa21zLT5tbWlvKSkg ewogCQlyYyA9IFBUUl9FUlIoZHB1X2ttcy0+bW1pbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vbXNtL2Rpc3AvZHB1MS9kcHVfa21zLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3Av ZHB1MS9kcHVfa21zLmgKaW5kZXggOWU0MGY1NTljNTFmLi5mZGVmMDE2ZjVjYTMgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9kcHUxL2RwdV9rbXMuaAorKysgYi9kcml2ZXJz L2dwdS9kcm0vbXNtL2Rpc3AvZHB1MS9kcHVfa21zLmgKQEAgLTEyMCw2ICsxMjAsMTQgQEAgc3Ry dWN0IGRwdV9rbXMgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJYm9vbCBycG1f ZW5hYmxlZDsKIAlzdHJ1Y3QgZHNzX21vZHVsZV9wb3dlciBtcDsKKworCS8qIHJlZmVyZW5jZSBj b3VudCBiYW5kd2lkdGggcmVxdWVzdHMsIHNvIHdlIGtub3cgd2hlbiB3ZSBjYW4KKwkgKiByZWxl YXNlIGJhbmR3aWR0aC4gIEVhY2ggYXRvbWljIHVwZGF0ZSBpbmNyZW1lbnRzLCBhbmQgZnJhbWUt CisJICogZG9uZSBldmVudCBkZWNyZW1lbnRzLiAgQWRkaXRpb25hbGx5LCBmb3IgdmlkZW8gbW9k ZSwgdGhlCisJICogcmVmZXJlbmNlIGlzIGluY3JlbWVudGVkIHdoZW4gY3J0YyBpcyBlbmFibGVk LCBhbmQgZGVjcmVtZW50ZWQKKwkgKiB3aGVuIGRpc2FibGVkLgorCSAqLworCWF0b21pY190IGJh bmR3aWR0aF9yZWY7CiB9OwogCiBzdHJ1Y3QgdnN5bmNfaW5mbyB7Ci0tIAoyLjIxLjAKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkZyZWVkcmVubyBtYWls aW5nIGxpc3QKRnJlZWRyZW5vQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZyZWVkcmVubw==