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=-15.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 5B3A4C07E95 for ; Tue, 20 Jul 2021 00:52:06 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1FC68600D1 for ; Tue, 20 Jul 2021 00:52:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1FC68600D1 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6A0706E1E8; Tue, 20 Jul 2021 00:52:05 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6AD0B6E1E8; Tue, 20 Jul 2021 00:52:04 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10050"; a="274980712" X-IronPort-AV: E=Sophos;i="5.84,253,1620716400"; d="scan'208";a="274980712" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jul 2021 17:52:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,253,1620716400"; d="scan'208";a="500109773" Received: from orsmsx606.amr.corp.intel.com ([10.22.229.19]) by FMSMGA003.fm.intel.com with ESMTP; 19 Jul 2021 17:52:03 -0700 Received: from orsmsx607.amr.corp.intel.com (10.22.229.20) by ORSMSX606.amr.corp.intel.com (10.22.229.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10; Mon, 19 Jul 2021 17:52:02 -0700 Received: from ORSEDG601.ED.cps.intel.com (10.7.248.6) by orsmsx607.amr.corp.intel.com (10.22.229.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10 via Frontend Transport; Mon, 19 Jul 2021 17:52:02 -0700 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (104.47.70.106) by edgegateway.intel.com (134.134.137.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.10; Mon, 19 Jul 2021 17:51:59 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=d0S/94HT9ky0vUF/luICAR2gWD0VSKQtkXriHy+CTRGBA8wndqPhazE/r+639M0aYdWlXql9zaZaRn8hsvipuYsSeKsp4T+OELHQ3h0HBq2vJJp8QD2HmxrU514tlVjZGFkGShGee574acDKhOOrox/iJfgRY1NMaQZviX1JBkVJpVyteF/Uaffr6P/I4SWaUVn95kltH/fOzTCLIQYVeNvKo6cLaySd4r7w9sCsu/zzJHJAgu3LHJ/fVKhwLImWCSt6t/UXrHXSNbvCMkVQN2SFbG4rTVhkJqbRJNwypT1RjbAY3f6UE4ZaA5upxKcdls5xRGEFpucslGui8yC9wg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=A3gs9ALdqlwz8BLXsulOfto+ztSM4GUaYpuCcC4VpWI=; b=Xute1YwAJY1n5qON9VqMSo3iPWWQNVDTsMtRFxV72SXJz5fRFcmBBvmuz9epVo+pCUz7o3UxWO2Wd3n1iVsB4eDJf7t+CwlmghFP5d9sNPYDjNbF+ADtFCaonNTHOudbxD+lYHRNrfHbD8IiK6g/iTdXfO6jN23WbPFBAAqS2uTqq5Uh2k9lEQHQ0rFzhoOhvFnkNH/3lw22FtuaLSWUTNx8tbAH6oLncM9PffUWAMQPjkId2nFBj+Ts8SYBx30lxg9Cado5+o5mC07HqvCPwI424kPvIK4+MSnzRWjsb2bI/0UAFV2CtzbkkIp1jJrpzH1l89RLqIwcMP4Gvn8o6g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=A3gs9ALdqlwz8BLXsulOfto+ztSM4GUaYpuCcC4VpWI=; b=dF85uFbie33Dr1lc1lsjraE3yRQwA/KftB6OKtXK5Zi4wtKZTvsAmgslqTg/E63t9Bab1oL5dQIKOuDT+Lrhnu598A1IxWHspIw6lq5+LfziOufJY4CJg9di34A55Aiu54AkKusrj4uebuJC8gsfRbwyvsTjns7eUOV9ZEDV1dw= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; Received: from DM4PR11MB5488.namprd11.prod.outlook.com (2603:10b6:5:39d::5) by DM6PR11MB4266.namprd11.prod.outlook.com (2603:10b6:5:1da::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.23; Tue, 20 Jul 2021 00:51:49 +0000 Received: from DM4PR11MB5488.namprd11.prod.outlook.com ([fe80::4017:e7ce:ef66:48d7]) by DM4PR11MB5488.namprd11.prod.outlook.com ([fe80::4017:e7ce:ef66:48d7%9]) with mapi id 15.20.4331.032; Tue, 20 Jul 2021 00:51:49 +0000 Subject: Re: [PATCH 06/51] drm/i915/guc: Implement GuC context operations for new inteface To: Matthew Brost , , References: <20210716201724.54804-1-matthew.brost@intel.com> <20210716201724.54804-7-matthew.brost@intel.com> From: Daniele Ceraolo Spurio Message-ID: <2a40e75b-55ce-acb8-533e-6c5c21c7910e@intel.com> Date: Mon, 19 Jul 2021 17:51:46 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 Thunderbird/78.11.0 In-Reply-To: <20210716201724.54804-7-matthew.brost@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-ClientProxiedBy: BYAPR08CA0066.namprd08.prod.outlook.com (2603:10b6:a03:117::43) To DM4PR11MB5488.namprd11.prod.outlook.com (2603:10b6:5:39d::5) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [192.168.1.65] (99.72.232.53) by BYAPR08CA0066.namprd08.prod.outlook.com (2603:10b6:a03:117::43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.21 via Frontend Transport; Tue, 20 Jul 2021 00:51:48 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 196fb2e2-81e1-4a3b-1b7b-08d94b188e6f X-MS-TrafficTypeDiagnostic: DM6PR11MB4266: X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: NssRqWmQ5JwlXgKutl1wxak5I+8YpOHMsC+qVHNObnQ4LHtWxKNKTfPG5XSHwp5AML8zZc3AsWlza6iZFoTrlEvwbNH68fiDFRabzJtPhL1c2uxCM8Wh/Ng03kddLsoZfr+Xq2QY9pjRJUX/TvL25mM1pYXljJYEpYh1niI4oHlUhJ6qlyezpfiAVQFBFA+xL0e1lNKHIF5wvZJuPP4bn6eKP69uR1Vc3EeBn9ISg+rqYGNEDjXVDqQv9u5pQcFVpSnK25KWejcveahknNXPYg19yTl2tQGCydeopNuLs4tvcABWsct/2FFfouCwmk+6rqhGjtubaJIe7kr6ftT1fMxK8bnogywvxR88Kk8FB0LHgeD0OXUJA+9/N7F4qWyhDyHIEi+DFNcBt2w8ASDUlW20AqTLpZVVws5ZVzjplADgfqqb0PeNFSpmJjEJktc09k9hYkK+YxZcPAciS3ccMQ42173AmEpQxaHDPO66iKRXJ2qyk8/KNlDBXJRDf0DhsQBX5qKGyCBWslizRjilk6qCCrAFSMr8YmZ0kL+DKNpyz1A/6OvSpySuev29CFXfpDvjOY7KMuuvgeRNvznfjc7GGkIXk2OLx54iK6knYv45SYIb3QHS4dzZ0SzpgN0DT/f3vcUMJPng4eaCq34DTZy3I4hgcP2naiyFzTrjdnJ7WwXUQNeTYi3tydZiJR0iWeiLhjLR027w1ndhlsqraO/dq+Z6Q1CfGZXefYzfSj9oB+xh486U8OFnxPZi0KkX0UrW5IezWxzGIfclF8h19CT/0lEGmrFDDu7Q939Nau25cFU6AKEALLk9jJoXguZL X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM4PR11MB5488.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(16576012)(8676002)(508600001)(107886003)(83380400001)(8936002)(30864003)(316002)(31696002)(26005)(86362001)(38100700002)(36756003)(53546011)(66946007)(4326008)(5660300002)(450100002)(2906002)(186003)(956004)(31686004)(2616005)(6486002)(66556008)(66476007)(87944003)(21314003)(45980500001)(43740500002)(309714004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UHhDcGlUL1Fqc3huN3JGclBDb1JBeGJSZ2NGbGJIb1JrY2k3NCtYYmlScno2?= =?utf-8?B?N2hDWEpqampBZGRhZm5JUk1CZFFBaWRYZjYvM0gvZUw0YzdFeDdNb0NmaGVO?= =?utf-8?B?cnB6TUd4M1RyQzEvcXA3UGZ3OEtKeGQrb2hzaE5LREh1RG96WG1tR3VoaFNB?= =?utf-8?B?U0lxZmtVaTJ4bUdFTFIwN2JTdzhHWTA4blJ6aHhCcFhGenZOdXMvTTJkMVVR?= =?utf-8?B?dWtRdFRSb01jaUNaRzlBZHZUMnd6WGNSdkR0aHNNanFwYVNLbTZrVjdSaEhV?= =?utf-8?B?QUhtTVExQnZhekRQMmI1Tmxla2VvZ2k4VzRFeGdhSUNZZCtjekF3aWg2VVd2?= =?utf-8?B?QWo1bHMySnRUOVd1STZQZ1lwUFpqK09iNWVYTEszRWlMUlBvTGlpRFNhdk02?= =?utf-8?B?VnBaSkRYdjR4cW1pdmpydnIvazU2RmtZRnFuNUJtTjdRN3NiSDU2MDRiZVRH?= =?utf-8?B?blR1bHl2NmNTeU05L1dzdlY3dnBFMGt1djFEWm43RkVGZ0VoQ0RLMGZzdXJS?= =?utf-8?B?a3ZvU1NndUxNRTAyOW5oaXJ3eTN0NU0zYzlFdlN3NU1YN1o2YUVwNWwrb2J5?= =?utf-8?B?Nzlhalg3elBGY3IyL0xGczd4VFl6UHI5Y1lsdXdNdHNUMVpBWGdHWENkS1lU?= =?utf-8?B?ZnNoYXRBM2NtU1Z1cGEwWHFWNlgySGlTYlpjNGQrZENmOUVQZTdXUy9xczRI?= =?utf-8?B?dkFoQ0xFUWk4ZUlZVXF3VXp0dldVVzljRmc3THhUOG5WOWlvQ0hmRG4zaG50?= =?utf-8?B?MVpZNmMxczJKWkFQeURsWHpMdFAwTzZrWkdSR1NNby9EWGdIVFBBQkRqQUhw?= =?utf-8?B?a0R2MWhhTW9yMms5VVZBMTVxOUQ5clNmY3dva3EwUzZpWExDcGhScnVQZHdW?= =?utf-8?B?VFVsbGd0ZjdmaThIVExGN05vRzFqOUFrV1Q3Wnh0QzdEaElmZUM4andwM3Mx?= =?utf-8?B?L2dkd0dVajZaTHVJVXVRTGNQbFRHWlJ5Nmg2Q1Rmdkp5THFMN3lFZ0h0cVlM?= =?utf-8?B?djNCZGlqbFRHQVI4N3RrdDU3SFA2dVk2Zjk0YW9TSjB6cWZhY3FzVlozdTho?= =?utf-8?B?bVArSE1YdmIwSk9tdExaUVNpcFAxS2JXYlVsaFNkOEo1UW1QRnh0Tk1NeGZ0?= =?utf-8?B?UDFxTENRcDdIZ1h4dzNDRmY2bmorZFpnVHlleHlwQjZRcHpOckV6RWEvcGZh?= =?utf-8?B?WUFFUmpCdDlMWGtrR0pGVVl1bTk5MDF6YWVFcEFNNWRvQmVyUVlDMzRjQmEz?= =?utf-8?B?L1lEUFlzMUs4UDY4bUtzOHQ4RTh0TzQ0UHZWZ2s1WjhhWVo4VUIvU0JYeU1w?= =?utf-8?B?WjFxSkRmNkRDbUJHL3NLVjdaanFXOU1hMVRSSGR5TXpXWkJIaWF2Z2xJTUg5?= =?utf-8?B?Q2kzNitFNVVQV3VUWnJCQzZPTnNQWGtmM2hwcUxGMHN6NkFNUzErZGRSejVv?= =?utf-8?B?VWFneWZDMEc5UERmdldwS2RYQmhaWk5nUU5nUjJJeWtxTFhpeVQ4R3l1czNE?= =?utf-8?B?TmJPbXd1bDh5enJnUjExSyszQ0dwWDRuWTYxL0RCZnRBYnJkYytCN3puOVUz?= =?utf-8?B?Vm1hVWFEeTZra3kwMThMQjVWSHlTVTNOTzViYlF4QzRpTWI1THlBd1cyYVp3?= =?utf-8?B?RWtNdzJndzM4SmF2S0daWW1YYjQ5N2tBZFU2Q3BVREdqcHliMDlraiszY3Zk?= =?utf-8?B?VnBUUWY1VGJPaDN0Z3N1RTVtNnhMY2ZFdUlLRCtUN0VLL0FrSXpNZnloU05v?= =?utf-8?Q?GuKfXaSYk02GC0CHyXcHsqHocsc/VmqopCmeXl4?= X-MS-Exchange-CrossTenant-Network-Message-Id: 196fb2e2-81e1-4a3b-1b7b-08d94b188e6f X-MS-Exchange-CrossTenant-AuthSource: DM4PR11MB5488.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jul 2021 00:51:49.2352 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5IEWz05VPfScrv6pckG4f4qAN4B7EvbZQr0JNsZhlheGluFKuAuXA8PrFLzHXXRI+CAhxe9QGqWJvH2KWemeNC5g1RH8ie0fl9vI/BizGSg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB4266 X-OriginatorOrg: intel.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: john.c.harrison@intel.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 7/16/2021 1:16 PM, Matthew Brost wrote: > Implement GuC context operations which includes GuC specific operations > alloc, pin, unpin, and destroy. > > v2: > (Daniel Vetter) > - Use msleep_interruptible rather than cond_resched in busy loop > (Michal) > - Remove C++ style comment > > Signed-off-by: John Harrison > Signed-off-by: Matthew Brost > --- > drivers/gpu/drm/i915/gt/intel_context.c | 5 + > drivers/gpu/drm/i915/gt/intel_context_types.h | 22 +- > drivers/gpu/drm/i915/gt/intel_lrc_reg.h | 1 - > drivers/gpu/drm/i915/gt/uc/intel_guc.h | 40 ++ > drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c | 4 + > .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 666 ++++++++++++++++-- > drivers/gpu/drm/i915/i915_reg.h | 1 + > drivers/gpu/drm/i915/i915_request.c | 1 + > 8 files changed, 685 insertions(+), 55 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gt/intel_context.c b/drivers/gpu/drm/i915/gt/intel_context.c > index bd63813c8a80..32fd6647154b 100644 > --- a/drivers/gpu/drm/i915/gt/intel_context.c > +++ b/drivers/gpu/drm/i915/gt/intel_context.c > @@ -384,6 +384,11 @@ intel_context_init(struct intel_context *ce, struct intel_engine_cs *engine) > > mutex_init(&ce->pin_mutex); > > + spin_lock_init(&ce->guc_state.lock); > + > + ce->guc_id = GUC_INVALID_LRC_ID; > + INIT_LIST_HEAD(&ce->guc_id_link); > + > i915_active_init(&ce->active, > __intel_context_active, __intel_context_retire, 0); > } > diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h b/drivers/gpu/drm/i915/gt/intel_context_types.h > index 6d99631d19b9..606c480aec26 100644 > --- a/drivers/gpu/drm/i915/gt/intel_context_types.h > +++ b/drivers/gpu/drm/i915/gt/intel_context_types.h > @@ -96,6 +96,7 @@ struct intel_context { > #define CONTEXT_BANNED 6 > #define CONTEXT_FORCE_SINGLE_SUBMISSION 7 > #define CONTEXT_NOPREEMPT 8 > +#define CONTEXT_LRCA_DIRTY 9 > > struct { > u64 timeout_us; > @@ -138,14 +139,29 @@ struct intel_context { > > u8 wa_bb_page; /* if set, page num reserved for context workarounds */ > > + struct { > + /** lock: protects everything in guc_state */ > + spinlock_t lock; > + /** > + * sched_state: scheduling state of this context using GuC > + * submission > + */ > + u8 sched_state; > + } guc_state; > + > /* GuC scheduling state flags that do not require a lock. */ > atomic_t guc_sched_state_no_lock; > > + /* GuC LRC descriptor ID */ > + u16 guc_id; > + > + /* GuC LRC descriptor reference count */ > + atomic_t guc_id_ref; > + > /* > - * GuC LRC descriptor ID - Not assigned in this patch but future patches > - * in the series will. > + * GuC ID link - in list when unpinned but guc_id still valid in GuC > */ > - u16 guc_id; > + struct list_head guc_id_link; > }; > > #endif /* __INTEL_CONTEXT_TYPES__ */ > diff --git a/drivers/gpu/drm/i915/gt/intel_lrc_reg.h b/drivers/gpu/drm/i915/gt/intel_lrc_reg.h > index 41e5350a7a05..49d4857ad9b7 100644 > --- a/drivers/gpu/drm/i915/gt/intel_lrc_reg.h > +++ b/drivers/gpu/drm/i915/gt/intel_lrc_reg.h > @@ -87,7 +87,6 @@ > #define GEN11_CSB_WRITE_PTR_MASK (GEN11_CSB_PTR_MASK << 0) > > #define MAX_CONTEXT_HW_ID (1 << 21) /* exclusive */ > -#define MAX_GUC_CONTEXT_HW_ID (1 << 20) /* exclusive */ > #define GEN11_MAX_CONTEXT_HW_ID (1 << 11) /* exclusive */ > /* in Gen12 ID 0x7FF is reserved to indicate idle */ > #define GEN12_MAX_CONTEXT_HW_ID (GEN11_MAX_CONTEXT_HW_ID - 1) > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.h b/drivers/gpu/drm/i915/gt/uc/intel_guc.h > index 8c7b92f699f1..30773cd699f5 100644 > --- a/drivers/gpu/drm/i915/gt/uc/intel_guc.h > +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.h > @@ -7,6 +7,7 @@ > #define _INTEL_GUC_H_ > > #include > +#include > > #include "intel_uncore.h" > #include "intel_guc_fw.h" > @@ -44,6 +45,14 @@ struct intel_guc { > void (*disable)(struct intel_guc *guc); > } interrupts; > > + /* > + * contexts_lock protects the pool of free guc ids and a linked list of > + * guc ids available to be stolen > + */ > + spinlock_t contexts_lock; > + struct ida guc_ids; > + struct list_head guc_id_list; > + > bool submission_selected; > > struct i915_vma *ads_vma; > @@ -101,6 +110,34 @@ intel_guc_send_and_receive(struct intel_guc *guc, const u32 *action, u32 len, > response_buf, response_buf_size, 0); > } > > +static inline int intel_guc_send_busy_loop(struct intel_guc* guc, > + const u32 *action, > + u32 len, > + bool loop) > +{ > + int err; > + unsigned int sleep_period_ms = 1; > + bool not_atomic = !in_atomic() && !irqs_disabled(); > + > + /* No sleeping with spin locks, just busy loop */ > + might_sleep_if(loop && not_atomic); > + > +retry: > + err = intel_guc_send_nb(guc, action, len); > + if (unlikely(err == -EBUSY && loop)) { > + if (likely(not_atomic)) { > + if (msleep_interruptible(sleep_period_ms)) > + return -EINTR; > + sleep_period_ms = sleep_period_ms << 1; > + } else { > + cpu_relax(); Potentially something we can change later, but if we're in atomic context we can't keep looping without a timeout while we get -EBUSY, we need to bail out early. > + } > + goto retry; > + } > + > + return err; > +} > + > static inline void intel_guc_to_host_event_handler(struct intel_guc *guc) > { > intel_guc_ct_event_handler(&guc->ct); > @@ -202,6 +239,9 @@ static inline void intel_guc_disable_msg(struct intel_guc *guc, u32 mask) > int intel_guc_reset_engine(struct intel_guc *guc, > struct intel_engine_cs *engine); > > +int intel_guc_deregister_done_process_msg(struct intel_guc *guc, > + const u32 *msg, u32 len); > + > void intel_guc_load_status(struct intel_guc *guc, struct drm_printer *p); > > #endif > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c > index 83ec60ea3f89..28ff82c5be45 100644 > --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c > +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c > @@ -928,6 +928,10 @@ static int ct_process_request(struct intel_guc_ct *ct, struct ct_incoming_msg *r > case INTEL_GUC_ACTION_DEFAULT: > ret = intel_guc_to_host_process_recv_msg(guc, payload, len); > break; > + case INTEL_GUC_ACTION_DEREGISTER_CONTEXT_DONE: > + ret = intel_guc_deregister_done_process_msg(guc, payload, > + len); > + break; > default: > ret = -EOPNOTSUPP; > break; > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c > index 53b4a5eb4a85..a47b3813b4d0 100644 > --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c > +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c > @@ -13,7 +13,9 @@ > #include "gt/intel_gt.h" > #include "gt/intel_gt_irq.h" > #include "gt/intel_gt_pm.h" > +#include "gt/intel_gt_requests.h" > #include "gt/intel_lrc.h" > +#include "gt/intel_lrc_reg.h" > #include "gt/intel_mocs.h" > #include "gt/intel_ring.h" > > @@ -85,6 +87,73 @@ static inline void clr_context_enabled(struct intel_context *ce) > &ce->guc_sched_state_no_lock); > } > > +/* > + * Below is a set of functions which control the GuC scheduling state which > + * require a lock, aside from the special case where the functions are called > + * from guc_lrc_desc_pin(). In that case it isn't possible for any other code > + * path to be executing on the context. > + */ Is there a reason to avoid taking the lock in guc_lrc_desc_pin, even if it isn't strictly needed? I'd prefer to avoid the asymmetry in the locking scheme if possible, as that might case trouble if thing change in the future. > +#define SCHED_STATE_WAIT_FOR_DEREGISTER_TO_REGISTER BIT(0) > +#define SCHED_STATE_DESTROYED BIT(1) > +static inline void init_sched_state(struct intel_context *ce) > +{ > + /* Only should be called from guc_lrc_desc_pin() */ > + atomic_set(&ce->guc_sched_state_no_lock, 0); > + ce->guc_state.sched_state = 0; > +} > + > +static inline bool > +context_wait_for_deregister_to_register(struct intel_context *ce) > +{ > + return (ce->guc_state.sched_state & > + SCHED_STATE_WAIT_FOR_DEREGISTER_TO_REGISTER); No need for (). Below as well. > +} > + > +static inline void > +set_context_wait_for_deregister_to_register(struct intel_context *ce) > +{ > + /* Only should be called from guc_lrc_desc_pin() */ > + ce->guc_state.sched_state |= > + SCHED_STATE_WAIT_FOR_DEREGISTER_TO_REGISTER; > +} > + > +static inline void > +clr_context_wait_for_deregister_to_register(struct intel_context *ce) > +{ > + lockdep_assert_held(&ce->guc_state.lock); > + ce->guc_state.sched_state = > + (ce->guc_state.sched_state & > + ~SCHED_STATE_WAIT_FOR_DEREGISTER_TO_REGISTER); nit: can also use ce->guc_state.sched_state &= ~SCHED_STATE_WAIT_FOR_DEREGISTER_TO_REGISTER > +} > + > +static inline bool > +context_destroyed(struct intel_context *ce) > +{ > + return (ce->guc_state.sched_state & SCHED_STATE_DESTROYED); > +} > + > +static inline void > +set_context_destroyed(struct intel_context *ce) > +{ > + lockdep_assert_held(&ce->guc_state.lock); > + ce->guc_state.sched_state |= SCHED_STATE_DESTROYED; > +} > + > +static inline bool context_guc_id_invalid(struct intel_context *ce) > +{ > + return (ce->guc_id == GUC_INVALID_LRC_ID); > +} > + > +static inline void set_context_guc_id_invalid(struct intel_context *ce) > +{ > + ce->guc_id = GUC_INVALID_LRC_ID; > +} > + > +static inline struct intel_guc *ce_to_guc(struct intel_context *ce) > +{ > + return &ce->engine->gt->uc.guc; > +} > + > static inline struct i915_priolist *to_priolist(struct rb_node *rb) > { > return rb_entry(rb, struct i915_priolist, node); > @@ -155,6 +224,9 @@ static int guc_add_request(struct intel_guc *guc, struct i915_request *rq) > int len = 0; > bool enabled = context_enabled(ce); > > + GEM_BUG_ON(!atomic_read(&ce->guc_id_ref)); > + GEM_BUG_ON(context_guc_id_invalid(ce)); > + > if (!enabled) { > action[len++] = INTEL_GUC_ACTION_SCHED_CONTEXT_MODE_SET; > action[len++] = ce->guc_id; > @@ -417,6 +489,10 @@ int intel_guc_submission_init(struct intel_guc *guc) > > xa_init_flags(&guc->context_lookup, XA_FLAGS_LOCK_IRQ); > > + spin_lock_init(&guc->contexts_lock); > + INIT_LIST_HEAD(&guc->guc_id_list); > + ida_init(&guc->guc_ids); > + > return 0; > } > > @@ -429,9 +505,303 @@ void intel_guc_submission_fini(struct intel_guc *guc) > i915_sched_engine_put(guc->sched_engine); > } > > -static int guc_context_alloc(struct intel_context *ce) > +static inline void queue_request(struct i915_sched_engine *sched_engine, > + struct i915_request *rq, > + int prio) > { > - return lrc_alloc(ce, ce->engine); > + GEM_BUG_ON(!list_empty(&rq->sched.link)); > + list_add_tail(&rq->sched.link, > + i915_sched_lookup_priolist(sched_engine, prio)); > + set_bit(I915_FENCE_FLAG_PQUEUE, &rq->fence.flags); > +} > + > +static int guc_bypass_tasklet_submit(struct intel_guc *guc, > + struct i915_request *rq) > +{ > + int ret; > + > + __i915_request_submit(rq); > + > + trace_i915_request_in(rq, 0); > + > + guc_set_lrc_tail(rq); > + ret = guc_add_request(guc, rq); > + if (ret == -EBUSY) > + guc->stalled_request = rq; > + > + return ret; > +} > + > +static void guc_submit_request(struct i915_request *rq) > +{ > + struct i915_sched_engine *sched_engine = rq->engine->sched_engine; > + struct intel_guc *guc = &rq->engine->gt->uc.guc; > + unsigned long flags; > + > + /* Will be called from irq-context when using foreign fences. */ > + spin_lock_irqsave(&sched_engine->lock, flags); > + > + if (guc->stalled_request || !i915_sched_engine_is_empty(sched_engine)) > + queue_request(sched_engine, rq, rq_prio(rq)); > + else if (guc_bypass_tasklet_submit(guc, rq) == -EBUSY) > + tasklet_hi_schedule(&sched_engine->tasklet); > + > + spin_unlock_irqrestore(&sched_engine->lock, flags); > +} > + > +#define GUC_ID_START 64 /* First 64 guc_ids reserved */ > +static int new_guc_id(struct intel_guc *guc) > +{ > + return ida_simple_get(&guc->guc_ids, GUC_ID_START, > + GUC_MAX_LRC_DESCRIPTORS, GFP_KERNEL | > + __GFP_RETRY_MAYFAIL | __GFP_NOWARN); > +} > + > +static void __release_guc_id(struct intel_guc *guc, struct intel_context *ce) > +{ > + if (!context_guc_id_invalid(ce)) { > + ida_simple_remove(&guc->guc_ids, ce->guc_id); > + reset_lrc_desc(guc, ce->guc_id); > + set_context_guc_id_invalid(ce); > + } > + if (!list_empty(&ce->guc_id_link)) > + list_del_init(&ce->guc_id_link); > +} > + > +static void release_guc_id(struct intel_guc *guc, struct intel_context *ce) > +{ > + unsigned long flags; > + > + spin_lock_irqsave(&guc->contexts_lock, flags); > + __release_guc_id(guc, ce); > + spin_unlock_irqrestore(&guc->contexts_lock, flags); > +} > + > +static int steal_guc_id(struct intel_guc *guc) > +{ > + struct intel_context *ce; > + int guc_id; > + > + if (!list_empty(&guc->guc_id_list)) { > + ce = list_first_entry(&guc->guc_id_list, > + struct intel_context, > + guc_id_link); > + > + GEM_BUG_ON(atomic_read(&ce->guc_id_ref)); > + GEM_BUG_ON(context_guc_id_invalid(ce)); > + > + list_del_init(&ce->guc_id_link); > + guc_id = ce->guc_id; > + set_context_guc_id_invalid(ce); > + return guc_id; > + } else { > + return -EAGAIN; > + } > +} > + > +static int assign_guc_id(struct intel_guc *guc, u16 *out) > +{ > + int ret; > + > + ret = new_guc_id(guc); > + if (unlikely(ret < 0)) { > + ret = steal_guc_id(guc); > + if (ret < 0) > + return ret; > + } > + > + *out = ret; > + return 0; Is it worth adding spinlock_held asserts for guc->contexts_lock in these ID functions? Doubles up as a documentation of what locking we expect. > +} > + > +#define PIN_GUC_ID_TRIES 4 > +static int pin_guc_id(struct intel_guc *guc, struct intel_context *ce) > +{ > + int ret = 0; > + unsigned long flags, tries = PIN_GUC_ID_TRIES; > + > + GEM_BUG_ON(atomic_read(&ce->guc_id_ref)); > + > +try_again: > + spin_lock_irqsave(&guc->contexts_lock, flags); > + > + if (context_guc_id_invalid(ce)) { > + ret = assign_guc_id(guc, &ce->guc_id); > + if (ret) > + goto out_unlock; > + ret = 1; /* Indidcates newly assigned guc_id */ > + } > + if (!list_empty(&ce->guc_id_link)) > + list_del_init(&ce->guc_id_link); > + atomic_inc(&ce->guc_id_ref); > + > +out_unlock: > + spin_unlock_irqrestore(&guc->contexts_lock, flags); > + > + /* > + * -EAGAIN indicates no guc_ids are available, let's retire any > + * outstanding requests to see if that frees up a guc_id. If the first > + * retire didn't help, insert a sleep with the timeslice duration before > + * attempting to retire more requests. Double the sleep period each > + * subsequent pass before finally giving up. The sleep period has max of > + * 100ms and minimum of 1ms. > + */ > + if (ret == -EAGAIN && --tries) { > + if (PIN_GUC_ID_TRIES - tries > 1) { > + unsigned int timeslice_shifted = > + ce->engine->props.timeslice_duration_ms << > + (PIN_GUC_ID_TRIES - tries - 2); > + unsigned int max = min_t(unsigned int, 100, > + timeslice_shifted); > + > + msleep(max_t(unsigned int, max, 1)); > + } > + intel_gt_retire_requests(guc_to_gt(guc)); > + goto try_again; > + } > + > + return ret; > +} > + > +static void unpin_guc_id(struct intel_guc *guc, struct intel_context *ce) > +{ > + unsigned long flags; > + > + GEM_BUG_ON(atomic_read(&ce->guc_id_ref) < 0); > + > + spin_lock_irqsave(&guc->contexts_lock, flags); > + if (!context_guc_id_invalid(ce) && list_empty(&ce->guc_id_link) && > + !atomic_read(&ce->guc_id_ref)) > + list_add_tail(&ce->guc_id_link, &guc->guc_id_list); > + spin_unlock_irqrestore(&guc->contexts_lock, flags); > +} > + > +static int __guc_action_register_context(struct intel_guc *guc, > + u32 guc_id, > + u32 offset) > +{ > + u32 action[] = { > + INTEL_GUC_ACTION_REGISTER_CONTEXT, > + guc_id, > + offset, > + }; > + > + return intel_guc_send_busy_loop(guc, action, ARRAY_SIZE(action), true); > +} > + > +static int register_context(struct intel_context *ce) > +{ > + struct intel_guc *guc = ce_to_guc(ce); > + u32 offset = intel_guc_ggtt_offset(guc, guc->lrc_desc_pool) + > + ce->guc_id * sizeof(struct guc_lrc_desc); > + > + return __guc_action_register_context(guc, ce->guc_id, offset); > +} > + > +static int __guc_action_deregister_context(struct intel_guc *guc, > + u32 guc_id) > +{ > + u32 action[] = { > + INTEL_GUC_ACTION_DEREGISTER_CONTEXT, > + guc_id, > + }; > + > + return intel_guc_send_busy_loop(guc, action, ARRAY_SIZE(action), true); > +} > + > +static int deregister_context(struct intel_context *ce, u32 guc_id) > +{ > + struct intel_guc *guc = ce_to_guc(ce); > + > + return __guc_action_deregister_context(guc, guc_id); > +} > + > +static intel_engine_mask_t adjust_engine_mask(u8 class, intel_engine_mask_t mask) > +{ > + switch (class) { > + case RENDER_CLASS: > + return mask >> RCS0; > + case VIDEO_ENHANCEMENT_CLASS: > + return mask >> VECS0; > + case VIDEO_DECODE_CLASS: > + return mask >> VCS0; > + case COPY_ENGINE_CLASS: > + return mask >> BCS0; > + default: > + GEM_BUG_ON("Invalid Class"); we usually use MISSING_CASE for this type of errors. > + return 0; > + } > +} > + > +static void guc_context_policy_init(struct intel_engine_cs *engine, > + struct guc_lrc_desc *desc) > +{ > + desc->policy_flags = 0; > + > + desc->execution_quantum = CONTEXT_POLICY_DEFAULT_EXECUTION_QUANTUM_US; > + desc->preemption_timeout = CONTEXT_POLICY_DEFAULT_PREEMPTION_TIME_US; > +} > + > +static int guc_lrc_desc_pin(struct intel_context *ce) > +{ > + struct intel_runtime_pm *runtime_pm = > + &ce->engine->gt->i915->runtime_pm; If you move this after the engine var below you can skip the ce->engine jump. Also, you can shorten the pointer chasing by using engine->uncore->rpm. > + struct intel_engine_cs *engine = ce->engine; > + struct intel_guc *guc = &engine->gt->uc.guc; > + u32 desc_idx = ce->guc_id; > + struct guc_lrc_desc *desc; > + bool context_registered; > + intel_wakeref_t wakeref; > + int ret = 0; > + > + GEM_BUG_ON(!engine->mask); > + > + /* > + * Ensure LRC + CT vmas are is same region as write barrier is done > + * based on CT vma region. > + */ > + GEM_BUG_ON(i915_gem_object_is_lmem(guc->ct.vma->obj) != > + i915_gem_object_is_lmem(ce->ring->vma->obj)); > + > + context_registered = lrc_desc_registered(guc, desc_idx); > + > + reset_lrc_desc(guc, desc_idx); > + set_lrc_desc_registered(guc, desc_idx, ce); > + > + desc = __get_lrc_desc(guc, desc_idx); > + desc->engine_class = engine_class_to_guc_class(engine->class); > + desc->engine_submit_mask = adjust_engine_mask(engine->class, > + engine->mask); > + desc->hw_context_desc = ce->lrc.lrca; > + desc->priority = GUC_CLIENT_PRIORITY_KMD_NORMAL; > + desc->context_flags = CONTEXT_REGISTRATION_FLAG_KMD; > + guc_context_policy_init(engine, desc); > + init_sched_state(ce); > + > + /* > + * The context_lookup xarray is used to determine if the hardware > + * context is currently registered. There are two cases in which it > + * could be regisgered either the guc_id has been stole from from typo regisgered > + * another context or the lrc descriptor address of this context has > + * changed. In either case the context needs to be deregistered with the > + * GuC before registering this context. > + */ > + if (context_registered) { > + set_context_wait_for_deregister_to_register(ce); > + intel_context_get(ce); > + > + /* > + * If stealing the guc_id, this ce has the same guc_id as the > + * context whos guc_id was stole. > + */ > + with_intel_runtime_pm(runtime_pm, wakeref) > + ret = deregister_context(ce, ce->guc_id); > + } else { > + with_intel_runtime_pm(runtime_pm, wakeref) > + ret = register_context(ce); > + } > + > + return ret; > } > > static int guc_context_pre_pin(struct intel_context *ce, > @@ -443,36 +813,139 @@ static int guc_context_pre_pin(struct intel_context *ce, > > static int guc_context_pin(struct intel_context *ce, void *vaddr) > { > + if (i915_ggtt_offset(ce->state) != > + (ce->lrc.lrca & CTX_GTT_ADDRESS_MASK)) > + set_bit(CONTEXT_LRCA_DIRTY, &ce->flags); Shouldn't this be set after lrc_pin()? I can see ce->lrc.lrca being re-assigned in there; it looks like it can only change if the context is new, but for future-proofing IMO better to re-order here. > + > return lrc_pin(ce, ce->engine, vaddr); Could use a comment to say that the GuC context pinning call is delayed until request alloc and to look at the comment in the latter function for details (or move the explanation here and refer here from request alloc). > } > > +static void guc_context_unpin(struct intel_context *ce) > +{ > + struct intel_guc *guc = ce_to_guc(ce); > + > + unpin_guc_id(guc, ce); > + lrc_unpin(ce); > +} > + > +static void guc_context_post_unpin(struct intel_context *ce) > +{ > + lrc_post_unpin(ce); why do we need this function? we can just pass lrc_post_unpin to the ops (like we already do). > +} > + > +static inline void guc_lrc_desc_unpin(struct intel_context *ce) > +{ > + struct intel_engine_cs *engine = ce->engine; > + struct intel_guc *guc = &engine->gt->uc.guc; > + unsigned long flags; > + > + GEM_BUG_ON(!lrc_desc_registered(guc, ce->guc_id)); > + GEM_BUG_ON(ce != __get_context(guc, ce->guc_id)); > + > + spin_lock_irqsave(&ce->guc_state.lock, flags); > + set_context_destroyed(ce); > + spin_unlock_irqrestore(&ce->guc_state.lock, flags); > + > + deregister_context(ce, ce->guc_id); > +} > + > +static void guc_context_destroy(struct kref *kref) > +{ > + struct intel_context *ce = container_of(kref, typeof(*ce), ref); > + struct intel_runtime_pm *runtime_pm = &ce->engine->gt->i915->runtime_pm; same as above, going through engine->uncore->rpm is shorter > + struct intel_guc *guc = &ce->engine->gt->uc.guc; > + intel_wakeref_t wakeref; > + unsigned long flags; > + > + /* > + * If the guc_id is invalid this context has been stolen and we can free > + * it immediately. Also can be freed immediately if the context is not > + * registered with the GuC. > + */ > + if (context_guc_id_invalid(ce) || > + !lrc_desc_registered(guc, ce->guc_id)) { > + release_guc_id(guc, ce); it feels a bit weird that we call release_guc_id in the case where the id is invalid. The code handles it fine, but still the flow doesn't feel clean. Not a blocker. > + lrc_destroy(kref); > + return; > + } > + > + /* > + * We have to acquire the context spinlock and check guc_id again, if it > + * is valid it hasn't been stolen and needs to be deregistered. We > + * delete this context from the list of unpinned guc_ids available to > + * stole to seal a race with guc_lrc_desc_pin(). When the G2H CTB > + * returns indicating this context has been deregistered the guc_id is > + * returned to the pool of available guc_ids. > + */ > + spin_lock_irqsave(&guc->contexts_lock, flags); > + if (context_guc_id_invalid(ce)) { > + __release_guc_id(guc, ce); But here the call to __release_guc_id is unneded, right? the ce doesn't own the ID anymore and both the steal and the release function already clean ce->guc_id_link, so there should be nothing left to clean. > + spin_unlock_irqrestore(&guc->contexts_lock, flags); > + lrc_destroy(kref); > + return; > + } > + > + if (!list_empty(&ce->guc_id_link)) > + list_del_init(&ce->guc_id_link); > + spin_unlock_irqrestore(&guc->contexts_lock, flags); > + > + /* > + * We defer GuC context deregistration until the context is destroyed > + * in order to save on CTBs. With this optimization ideally we only need > + * 1 CTB to register the context during the first pin and 1 CTB to > + * deregister the context when the context is destroyed. Without this > + * optimization, a CTB would be needed every pin & unpin. > + * > + * XXX: Need to acqiure the runtime wakeref as this can be triggered > + * from context_free_worker when not runtime wakeref is held. > + * guc_lrc_desc_unpin requires the runtime as a GuC register is written > + * in H2G CTB to deregister the context. A future patch may defer this > + * H2G CTB if the runtime wakeref is zero. > + */ > + with_intel_runtime_pm(runtime_pm, wakeref) > + guc_lrc_desc_unpin(ce); > +} > + > +static int guc_context_alloc(struct intel_context *ce) > +{ > + return lrc_alloc(ce, ce->engine); > +} > + > static const struct intel_context_ops guc_context_ops = { > .alloc = guc_context_alloc, > > .pre_pin = guc_context_pre_pin, > .pin = guc_context_pin, > - .unpin = lrc_unpin, > - .post_unpin = lrc_post_unpin, > + .unpin = guc_context_unpin, > + .post_unpin = guc_context_post_unpin, > > .enter = intel_context_enter_engine, > .exit = intel_context_exit_engine, > > .reset = lrc_reset, > - .destroy = lrc_destroy, > + .destroy = guc_context_destroy, > }; > > -static int guc_request_alloc(struct i915_request *request) > +static bool context_needs_register(struct intel_context *ce, bool new_guc_id) > { > + return new_guc_id || test_bit(CONTEXT_LRCA_DIRTY, &ce->flags) || > + !lrc_desc_registered(ce_to_guc(ce), ce->guc_id); > +} > + > +static int guc_request_alloc(struct i915_request *rq) > +{ > + struct intel_context *ce = rq->context; > + struct intel_guc *guc = ce_to_guc(ce); > int ret; > > - GEM_BUG_ON(!intel_context_is_pinned(request->context)); > + GEM_BUG_ON(!intel_context_is_pinned(rq->context)); > > /* > * Flush enough space to reduce the likelihood of waiting after > * we start building the request - in which case we will just > * have to repeat work. > */ > - request->reserved_space += GUC_REQUEST_SIZE; > + rq->reserved_space += GUC_REQUEST_SIZE; > > /* > * Note that after this point, we have committed to using > @@ -483,56 +956,47 @@ static int guc_request_alloc(struct i915_request *request) > */ > > /* Unconditionally invalidate GPU caches and TLBs. */ > - ret = request->engine->emit_flush(request, EMIT_INVALIDATE); > + ret = rq->engine->emit_flush(rq, EMIT_INVALIDATE); > if (ret) > return ret; > > - request->reserved_space -= GUC_REQUEST_SIZE; > - return 0; > -} > + rq->reserved_space -= GUC_REQUEST_SIZE; > > -static inline void queue_request(struct i915_sched_engine *sched_engine, > - struct i915_request *rq, > - int prio) > -{ > - GEM_BUG_ON(!list_empty(&rq->sched.link)); > - list_add_tail(&rq->sched.link, > - i915_sched_lookup_priolist(sched_engine, prio)); > - set_bit(I915_FENCE_FLAG_PQUEUE, &rq->fence.flags); > -} > - > -static int guc_bypass_tasklet_submit(struct intel_guc *guc, > - struct i915_request *rq) > -{ > - int ret; > - > - __i915_request_submit(rq); > - > - trace_i915_request_in(rq, 0); > - > - guc_set_lrc_tail(rq); > - ret = guc_add_request(guc, rq); > - if (ret == -EBUSY) > - guc->stalled_request = rq; > - > - return ret; > -} > - > -static void guc_submit_request(struct i915_request *rq) > -{ > - struct i915_sched_engine *sched_engine = rq->engine->sched_engine; > - struct intel_guc *guc = &rq->engine->gt->uc.guc; > - unsigned long flags; > + /* > + * Call pin_guc_id here rather than in the pinning step as with > + * dma_resv, contexts can be repeatedly pinned / unpinned trashing the > + * guc_ids and creating horrible race conditions. This is especially bad > + * when guc_ids are being stolen due to over subscription. By the time > + * this function is reached, it is guaranteed that the guc_id will be > + * persistent until the generated request is retired. Thus, sealing these > + * race conditions. It is still safe to fail here if guc_ids are > + * exhausted and return -EAGAIN to the user indicating that they can try > + * again in the future. > + * > + * There is no need for a lock here as the timeline mutex ensures at > + * most one context can be executing this code path at once. The > + * guc_id_ref is incremented once for every request in flight and > + * decremented on each retire. When it is zero, a lock around the > + * increment (in pin_guc_id) is needed to seal a race with unpin_guc_id. > + */ > + if (atomic_add_unless(&ce->guc_id_ref, 1, 0)) > + return 0; > > - /* Will be called from irq-context when using foreign fences. */ > - spin_lock_irqsave(&sched_engine->lock, flags); > + ret = pin_guc_id(guc, ce); /* returns 1 if new guc_id assigned */ > + if (unlikely(ret < 0)) > + return ret;; typo ";;" > + if (context_needs_register(ce, !!ret)) { > + ret = guc_lrc_desc_pin(ce); > + if (unlikely(ret)) { /* unwind */ > + atomic_dec(&ce->guc_id_ref); > + unpin_guc_id(guc, ce); > + return ret; > + } > + } > > - if (guc->stalled_request || !i915_sched_engine_is_empty(sched_engine)) > - queue_request(sched_engine, rq, rq_prio(rq)); > - else if (guc_bypass_tasklet_submit(guc, rq) == -EBUSY) > - tasklet_hi_schedule(&sched_engine->tasklet); > + clear_bit(CONTEXT_LRCA_DIRTY, &ce->flags); Might be worth moving the pinning to a separate function to keep the request_alloc focused on the request. Can be done as a follow up. > > - spin_unlock_irqrestore(&sched_engine->lock, flags); > + return 0; > } > > static void sanitize_hwsp(struct intel_engine_cs *engine) > @@ -606,6 +1070,46 @@ static void guc_set_default_submission(struct intel_engine_cs *engine) > engine->submit_request = guc_submit_request; > } > > +static inline void guc_kernel_context_pin(struct intel_guc *guc, > + struct intel_context *ce) > +{ > + if (context_guc_id_invalid(ce)) > + pin_guc_id(guc, ce); > + guc_lrc_desc_pin(ce); > +} > + > +static inline void guc_init_lrc_mapping(struct intel_guc *guc) > +{ > + struct intel_gt *gt = guc_to_gt(guc); > + struct intel_engine_cs *engine; > + enum intel_engine_id id; > + > + /* make sure all descriptors are clean... */ > + xa_destroy(&guc->context_lookup); > + > + /* > + * Some contexts might have been pinned before we enabled GuC > + * submission, so we need to add them to the GuC bookeeping. > + * Also, after a reset the GuC we want to make sure that the information > + * shared with GuC is properly reset. The kernel lrcs are not attached > + * to the gem_context, so they need to be added separately. > + * > + * Note: we purposely do not check the error return of > + * guc_lrc_desc_pin, because that function can only fail in two cases. > + * One, if there aren't enough free IDs, but we're guaranteed to have > + * enough here (we're either only pinning a handful of lrc on first boot > + * or we're re-pinning lrcs that were already pinned before the reset). > + * Two, if the GuC has died and CTBs can't make forward progress. > + * Presumably, the GuC should be alive as this function is called on > + * driver load or after a reset. Even if it is dead, another full GPU > + * reset will be triggered and this function would be called again. > + */ > + > + for_each_engine(engine, gt, id) > + if (engine->kernel_context) > + guc_kernel_context_pin(guc, engine->kernel_context); > +} > + > static void guc_release(struct intel_engine_cs *engine) > { > engine->sanitize = NULL; /* no longer in control, nothing to sanitize */ > @@ -718,6 +1222,7 @@ int intel_guc_submission_setup(struct intel_engine_cs *engine) > > void intel_guc_submission_enable(struct intel_guc *guc) > { > + guc_init_lrc_mapping(guc); > } > > void intel_guc_submission_disable(struct intel_guc *guc) > @@ -743,3 +1248,62 @@ void intel_guc_submission_init_early(struct intel_guc *guc) > { > guc->submission_selected = __guc_submission_selected(guc); > } > + > +static inline struct intel_context * > +g2h_context_lookup(struct intel_guc *guc, u32 desc_idx) > +{ > + struct intel_context *ce; > + > + if (unlikely(desc_idx >= GUC_MAX_LRC_DESCRIPTORS)) { > + drm_dbg(&guc_to_gt(guc)->i915->drm, > + "Invalid desc_idx %u", desc_idx); > + return NULL; > + } > + > + ce = __get_context(guc, desc_idx); > + if (unlikely(!ce)) { > + drm_dbg(&guc_to_gt(guc)->i915->drm, > + "Context is NULL, desc_idx %u", desc_idx); > + return NULL; > + } > + > + return ce; > +} > + > +int intel_guc_deregister_done_process_msg(struct intel_guc *guc, > + const u32 *msg, > + u32 len) > +{ > + struct intel_context *ce; > + u32 desc_idx = msg[0]; > + > + if (unlikely(len < 1)) { > + drm_dbg(&guc_to_gt(guc)->i915->drm, "Invalid length %u", len); > + return -EPROTO; > + } > + > + ce = g2h_context_lookup(guc, desc_idx); > + if (unlikely(!ce)) > + return -EPROTO; > + > + if (context_wait_for_deregister_to_register(ce)) { > + struct intel_runtime_pm *runtime_pm = > + &ce->engine->gt->i915->runtime_pm; > + intel_wakeref_t wakeref; > + > + /* > + * Previous owner of this guc_id has been deregistered, now safe > + * register this context. > + */ > + with_intel_runtime_pm(runtime_pm, wakeref) > + register_context(ce); > + clr_context_wait_for_deregister_to_register(ce); > + intel_context_put(ce); > + } else if (context_destroyed(ce)) { > + /* Context has been destroyed */ > + release_guc_id(guc, ce); > + lrc_destroy(&ce->ref); > + } > + > + return 0; > +} > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index 943fe485c662..204c95c39353 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -4142,6 +4142,7 @@ enum { > FAULT_AND_CONTINUE /* Unsupported */ > }; > > +#define CTX_GTT_ADDRESS_MASK GENMASK(31, 12) > #define GEN8_CTX_VALID (1 << 0) > #define GEN8_CTX_FORCE_PD_RESTORE (1 << 1) > #define GEN8_CTX_FORCE_RESTORE (1 << 2) > diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c > index 86b4c9f2613d..b48c4905d3fc 100644 > --- a/drivers/gpu/drm/i915/i915_request.c > +++ b/drivers/gpu/drm/i915/i915_request.c > @@ -407,6 +407,7 @@ bool i915_request_retire(struct i915_request *rq) > */ > if (!list_empty(&rq->sched.link)) > remove_from_engine(rq); > + atomic_dec(&rq->context->guc_id_ref); Does this work/make senseĀ  if GuC is disabled? Daniele > GEM_BUG_ON(!llist_empty(&rq->execute_cb)); > > __list_del_entry(&rq->link); /* poison neither prev/next (RCU walks) */ 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=-15.0 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 05A42C07E9D for ; Tue, 20 Jul 2021 00:52:10 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9B0DE600D1 for ; Tue, 20 Jul 2021 00:52:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B0DE600D1 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C57976E214; Tue, 20 Jul 2021 00:52:05 +0000 (UTC) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6AD0B6E1E8; Tue, 20 Jul 2021 00:52:04 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10050"; a="274980712" X-IronPort-AV: E=Sophos;i="5.84,253,1620716400"; d="scan'208";a="274980712" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jul 2021 17:52:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,253,1620716400"; d="scan'208";a="500109773" Received: from orsmsx606.amr.corp.intel.com ([10.22.229.19]) by FMSMGA003.fm.intel.com with ESMTP; 19 Jul 2021 17:52:03 -0700 Received: from orsmsx607.amr.corp.intel.com (10.22.229.20) by ORSMSX606.amr.corp.intel.com (10.22.229.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10; Mon, 19 Jul 2021 17:52:02 -0700 Received: from ORSEDG601.ED.cps.intel.com (10.7.248.6) by orsmsx607.amr.corp.intel.com (10.22.229.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10 via Frontend Transport; Mon, 19 Jul 2021 17:52:02 -0700 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (104.47.70.106) by edgegateway.intel.com (134.134.137.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.10; Mon, 19 Jul 2021 17:51:59 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=d0S/94HT9ky0vUF/luICAR2gWD0VSKQtkXriHy+CTRGBA8wndqPhazE/r+639M0aYdWlXql9zaZaRn8hsvipuYsSeKsp4T+OELHQ3h0HBq2vJJp8QD2HmxrU514tlVjZGFkGShGee574acDKhOOrox/iJfgRY1NMaQZviX1JBkVJpVyteF/Uaffr6P/I4SWaUVn95kltH/fOzTCLIQYVeNvKo6cLaySd4r7w9sCsu/zzJHJAgu3LHJ/fVKhwLImWCSt6t/UXrHXSNbvCMkVQN2SFbG4rTVhkJqbRJNwypT1RjbAY3f6UE4ZaA5upxKcdls5xRGEFpucslGui8yC9wg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=A3gs9ALdqlwz8BLXsulOfto+ztSM4GUaYpuCcC4VpWI=; b=Xute1YwAJY1n5qON9VqMSo3iPWWQNVDTsMtRFxV72SXJz5fRFcmBBvmuz9epVo+pCUz7o3UxWO2Wd3n1iVsB4eDJf7t+CwlmghFP5d9sNPYDjNbF+ADtFCaonNTHOudbxD+lYHRNrfHbD8IiK6g/iTdXfO6jN23WbPFBAAqS2uTqq5Uh2k9lEQHQ0rFzhoOhvFnkNH/3lw22FtuaLSWUTNx8tbAH6oLncM9PffUWAMQPjkId2nFBj+Ts8SYBx30lxg9Cado5+o5mC07HqvCPwI424kPvIK4+MSnzRWjsb2bI/0UAFV2CtzbkkIp1jJrpzH1l89RLqIwcMP4Gvn8o6g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=A3gs9ALdqlwz8BLXsulOfto+ztSM4GUaYpuCcC4VpWI=; b=dF85uFbie33Dr1lc1lsjraE3yRQwA/KftB6OKtXK5Zi4wtKZTvsAmgslqTg/E63t9Bab1oL5dQIKOuDT+Lrhnu598A1IxWHspIw6lq5+LfziOufJY4CJg9di34A55Aiu54AkKusrj4uebuJC8gsfRbwyvsTjns7eUOV9ZEDV1dw= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; Received: from DM4PR11MB5488.namprd11.prod.outlook.com (2603:10b6:5:39d::5) by DM6PR11MB4266.namprd11.prod.outlook.com (2603:10b6:5:1da::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.23; Tue, 20 Jul 2021 00:51:49 +0000 Received: from DM4PR11MB5488.namprd11.prod.outlook.com ([fe80::4017:e7ce:ef66:48d7]) by DM4PR11MB5488.namprd11.prod.outlook.com ([fe80::4017:e7ce:ef66:48d7%9]) with mapi id 15.20.4331.032; Tue, 20 Jul 2021 00:51:49 +0000 To: Matthew Brost , , References: <20210716201724.54804-1-matthew.brost@intel.com> <20210716201724.54804-7-matthew.brost@intel.com> From: Daniele Ceraolo Spurio Message-ID: <2a40e75b-55ce-acb8-533e-6c5c21c7910e@intel.com> Date: Mon, 19 Jul 2021 17:51:46 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 Thunderbird/78.11.0 In-Reply-To: <20210716201724.54804-7-matthew.brost@intel.com> Content-Language: en-US X-ClientProxiedBy: BYAPR08CA0066.namprd08.prod.outlook.com (2603:10b6:a03:117::43) To DM4PR11MB5488.namprd11.prod.outlook.com (2603:10b6:5:39d::5) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [192.168.1.65] (99.72.232.53) by BYAPR08CA0066.namprd08.prod.outlook.com (2603:10b6:a03:117::43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.21 via Frontend Transport; Tue, 20 Jul 2021 00:51:48 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 196fb2e2-81e1-4a3b-1b7b-08d94b188e6f X-MS-TrafficTypeDiagnostic: DM6PR11MB4266: X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: NssRqWmQ5JwlXgKutl1wxak5I+8YpOHMsC+qVHNObnQ4LHtWxKNKTfPG5XSHwp5AML8zZc3AsWlza6iZFoTrlEvwbNH68fiDFRabzJtPhL1c2uxCM8Wh/Ng03kddLsoZfr+Xq2QY9pjRJUX/TvL25mM1pYXljJYEpYh1niI4oHlUhJ6qlyezpfiAVQFBFA+xL0e1lNKHIF5wvZJuPP4bn6eKP69uR1Vc3EeBn9ISg+rqYGNEDjXVDqQv9u5pQcFVpSnK25KWejcveahknNXPYg19yTl2tQGCydeopNuLs4tvcABWsct/2FFfouCwmk+6rqhGjtubaJIe7kr6ftT1fMxK8bnogywvxR88Kk8FB0LHgeD0OXUJA+9/N7F4qWyhDyHIEi+DFNcBt2w8ASDUlW20AqTLpZVVws5ZVzjplADgfqqb0PeNFSpmJjEJktc09k9hYkK+YxZcPAciS3ccMQ42173AmEpQxaHDPO66iKRXJ2qyk8/KNlDBXJRDf0DhsQBX5qKGyCBWslizRjilk6qCCrAFSMr8YmZ0kL+DKNpyz1A/6OvSpySuev29CFXfpDvjOY7KMuuvgeRNvznfjc7GGkIXk2OLx54iK6knYv45SYIb3QHS4dzZ0SzpgN0DT/f3vcUMJPng4eaCq34DTZy3I4hgcP2naiyFzTrjdnJ7WwXUQNeTYi3tydZiJR0iWeiLhjLR027w1ndhlsqraO/dq+Z6Q1CfGZXefYzfSj9oB+xh486U8OFnxPZi0KkX0UrW5IezWxzGIfclF8h19CT/0lEGmrFDDu7Q939Nau25cFU6AKEALLk9jJoXguZL X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM4PR11MB5488.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(16576012)(8676002)(508600001)(107886003)(83380400001)(8936002)(30864003)(316002)(31696002)(26005)(86362001)(38100700002)(36756003)(53546011)(66946007)(4326008)(5660300002)(450100002)(2906002)(186003)(956004)(31686004)(2616005)(6486002)(66556008)(66476007)(87944003)(21314003)(45980500001)(43740500002)(309714004); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UHhDcGlUL1Fqc3huN3JGclBDb1JBeGJSZ2NGbGJIb1JrY2k3NCtYYmlScno2?= =?utf-8?B?N2hDWEpqampBZGRhZm5JUk1CZFFBaWRYZjYvM0gvZUw0YzdFeDdNb0NmaGVO?= =?utf-8?B?cnB6TUd4M1RyQzEvcXA3UGZ3OEtKeGQrb2hzaE5LREh1RG96WG1tR3VoaFNB?= =?utf-8?B?U0lxZmtVaTJ4bUdFTFIwN2JTdzhHWTA4blJ6aHhCcFhGenZOdXMvTTJkMVVR?= =?utf-8?B?dWtRdFRSb01jaUNaRzlBZHZUMnd6WGNSdkR0aHNNanFwYVNLbTZrVjdSaEhV?= =?utf-8?B?QUhtTVExQnZhekRQMmI1Tmxla2VvZ2k4VzRFeGdhSUNZZCtjekF3aWg2VVd2?= =?utf-8?B?QWo1bHMySnRUOVd1STZQZ1lwUFpqK09iNWVYTEszRWlMUlBvTGlpRFNhdk02?= =?utf-8?B?VnBaSkRYdjR4cW1pdmpydnIvazU2RmtZRnFuNUJtTjdRN3NiSDU2MDRiZVRH?= =?utf-8?B?blR1bHl2NmNTeU05L1dzdlY3dnBFMGt1djFEWm43RkVGZ0VoQ0RLMGZzdXJS?= =?utf-8?B?a3ZvU1NndUxNRTAyOW5oaXJ3eTN0NU0zYzlFdlN3NU1YN1o2YUVwNWwrb2J5?= =?utf-8?B?Nzlhalg3elBGY3IyL0xGczd4VFl6UHI5Y1lsdXdNdHNUMVpBWGdHWENkS1lU?= =?utf-8?B?ZnNoYXRBM2NtU1Z1cGEwWHFWNlgySGlTYlpjNGQrZENmOUVQZTdXUy9xczRI?= =?utf-8?B?dkFoQ0xFUWk4ZUlZVXF3VXp0dldVVzljRmc3THhUOG5WOWlvQ0hmRG4zaG50?= =?utf-8?B?MVpZNmMxczJKWkFQeURsWHpMdFAwTzZrWkdSR1NNby9EWGdIVFBBQkRqQUhw?= =?utf-8?B?a0R2MWhhTW9yMms5VVZBMTVxOUQ5clNmY3dva3EwUzZpWExDcGhScnVQZHdW?= =?utf-8?B?VFVsbGd0ZjdmaThIVExGN05vRzFqOUFrV1Q3Wnh0QzdEaElmZUM4andwM3Mx?= =?utf-8?B?L2dkd0dVajZaTHVJVXVRTGNQbFRHWlJ5Nmg2Q1Rmdkp5THFMN3lFZ0h0cVlM?= =?utf-8?B?djNCZGlqbFRHQVI4N3RrdDU3SFA2dVk2Zjk0YW9TSjB6cWZhY3FzVlozdTho?= =?utf-8?B?bVArSE1YdmIwSk9tdExaUVNpcFAxS2JXYlVsaFNkOEo1UW1QRnh0Tk1NeGZ0?= =?utf-8?B?UDFxTENRcDdIZ1h4dzNDRmY2bmorZFpnVHlleHlwQjZRcHpOckV6RWEvcGZh?= =?utf-8?B?WUFFUmpCdDlMWGtrR0pGVVl1bTk5MDF6YWVFcEFNNWRvQmVyUVlDMzRjQmEz?= =?utf-8?B?L1lEUFlzMUs4UDY4bUtzOHQ4RTh0TzQ0UHZWZ2s1WjhhWVo4VUIvU0JYeU1w?= =?utf-8?B?WjFxSkRmNkRDbUJHL3NLVjdaanFXOU1hMVRSSGR5TXpXWkJIaWF2Z2xJTUg5?= =?utf-8?B?Q2kzNitFNVVQV3VUWnJCQzZPTnNQWGtmM2hwcUxGMHN6NkFNUzErZGRSejVv?= =?utf-8?B?VWFneWZDMEc5UERmdldwS2RYQmhaWk5nUU5nUjJJeWtxTFhpeVQ4R3l1czNE?= =?utf-8?B?TmJPbXd1bDh5enJnUjExSyszQ0dwWDRuWTYxL0RCZnRBYnJkYytCN3puOVUz?= =?utf-8?B?Vm1hVWFEeTZra3kwMThMQjVWSHlTVTNOTzViYlF4QzRpTWI1THlBd1cyYVp3?= =?utf-8?B?RWtNdzJndzM4SmF2S0daWW1YYjQ5N2tBZFU2Q3BVREdqcHliMDlraiszY3Zk?= =?utf-8?B?VnBUUWY1VGJPaDN0Z3N1RTVtNnhMY2ZFdUlLRCtUN0VLL0FrSXpNZnloU05v?= =?utf-8?Q?GuKfXaSYk02GC0CHyXcHsqHocsc/VmqopCmeXl4?= X-MS-Exchange-CrossTenant-Network-Message-Id: 196fb2e2-81e1-4a3b-1b7b-08d94b188e6f X-MS-Exchange-CrossTenant-AuthSource: DM4PR11MB5488.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jul 2021 00:51:49.2352 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5IEWz05VPfScrv6pckG4f4qAN4B7EvbZQr0JNsZhlheGluFKuAuXA8PrFLzHXXRI+CAhxe9QGqWJvH2KWemeNC5g1RH8ie0fl9vI/BizGSg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB4266 X-OriginatorOrg: intel.com Subject: Re: [Intel-gfx] [PATCH 06/51] drm/i915/guc: Implement GuC context operations for new inteface X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" CgpPbiA3LzE2LzIwMjEgMToxNiBQTSwgTWF0dGhldyBCcm9zdCB3cm90ZToKPiBJbXBsZW1lbnQg R3VDIGNvbnRleHQgb3BlcmF0aW9ucyB3aGljaCBpbmNsdWRlcyBHdUMgc3BlY2lmaWMgb3BlcmF0 aW9ucwo+IGFsbG9jLCBwaW4sIHVucGluLCBhbmQgZGVzdHJveS4KPgo+IHYyOgo+ICAgKERhbmll bCBWZXR0ZXIpCj4gICAgLSBVc2UgbXNsZWVwX2ludGVycnVwdGlibGUgcmF0aGVyIHRoYW4gY29u ZF9yZXNjaGVkIGluIGJ1c3kgbG9vcAo+ICAgKE1pY2hhbCkKPiAgICAtIFJlbW92ZSBDKysgc3R5 bGUgY29tbWVudAo+Cj4gU2lnbmVkLW9mZi1ieTogSm9obiBIYXJyaXNvbiA8Sm9obi5DLkhhcnJp c29uQEludGVsLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBNYXR0aGV3IEJyb3N0IDxtYXR0aGV3LmJy b3N0QGludGVsLmNvbT4KPiAtLS0KPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2Nv bnRleHQuYyAgICAgICB8ICAgNSArCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9j b250ZXh0X3R5cGVzLmggfCAgMjIgKy0KPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVs X2xyY19yZWcuaCAgICAgICB8ICAgMSAtCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9p bnRlbF9ndWMuaCAgICAgICAgfCAgNDAgKysKPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3Vj L2ludGVsX2d1Y19jdC5jICAgICB8ICAgNCArCj4gICAuLi4vZ3B1L2RybS9pOTE1L2d0L3VjL2lu dGVsX2d1Y19zdWJtaXNzaW9uLmMgfCA2NjYgKysrKysrKysrKysrKysrKy0tCj4gICBkcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oICAgICAgICAgICAgICAgfCAgIDEgKwo+ICAgZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9yZXF1ZXN0LmMgICAgICAgICAgIHwgICAxICsKPiAgIDggZmls ZXMgY2hhbmdlZCwgNjg1IGluc2VydGlvbnMoKyksIDU1IGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHQuYyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHQuYwo+IGluZGV4IGJkNjM4MTNjOGE4MC4uMzJm ZDY2NDcxNTRiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2Nv bnRleHQuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHQuYwo+ IEBAIC0zODQsNiArMzg0LDExIEBAIGludGVsX2NvbnRleHRfaW5pdChzdHJ1Y3QgaW50ZWxfY29u dGV4dCAqY2UsIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKPiAgIAo+ICAgCW11dGV4 X2luaXQoJmNlLT5waW5fbXV0ZXgpOwo+ICAgCj4gKwlzcGluX2xvY2tfaW5pdCgmY2UtPmd1Y19z dGF0ZS5sb2NrKTsKPiArCj4gKwljZS0+Z3VjX2lkID0gR1VDX0lOVkFMSURfTFJDX0lEOwo+ICsJ SU5JVF9MSVNUX0hFQUQoJmNlLT5ndWNfaWRfbGluayk7Cj4gKwo+ICAgCWk5MTVfYWN0aXZlX2lu aXQoJmNlLT5hY3RpdmUsCj4gICAJCQkgX19pbnRlbF9jb250ZXh0X2FjdGl2ZSwgX19pbnRlbF9j b250ZXh0X3JldGlyZSwgMCk7Cj4gICB9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2d0L2ludGVsX2NvbnRleHRfdHlwZXMuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2lu dGVsX2NvbnRleHRfdHlwZXMuaAo+IGluZGV4IDZkOTk2MzFkMTliOS4uNjA2YzQ4MGFlYzI2IDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHRfdHlwZXMu aAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHRfdHlwZXMuaAo+ IEBAIC05Niw2ICs5Niw3IEBAIHN0cnVjdCBpbnRlbF9jb250ZXh0IHsKPiAgICNkZWZpbmUgQ09O VEVYVF9CQU5ORUQJCQk2Cj4gICAjZGVmaW5lIENPTlRFWFRfRk9SQ0VfU0lOR0xFX1NVQk1JU1NJ T04JNwo+ICAgI2RlZmluZSBDT05URVhUX05PUFJFRU1QVAkJOAo+ICsjZGVmaW5lIENPTlRFWFRf TFJDQV9ESVJUWQkJOQo+ICAgCj4gICAJc3RydWN0IHsKPiAgIAkJdTY0IHRpbWVvdXRfdXM7Cj4g QEAgLTEzOCwxNCArMTM5LDI5IEBAIHN0cnVjdCBpbnRlbF9jb250ZXh0IHsKPiAgIAo+ICAgCXU4 IHdhX2JiX3BhZ2U7IC8qIGlmIHNldCwgcGFnZSBudW0gcmVzZXJ2ZWQgZm9yIGNvbnRleHQgd29y a2Fyb3VuZHMgKi8KPiAgIAo+ICsJc3RydWN0IHsKPiArCQkvKiogbG9jazogcHJvdGVjdHMgZXZl cnl0aGluZyBpbiBndWNfc3RhdGUgKi8KPiArCQlzcGlubG9ja190IGxvY2s7Cj4gKwkJLyoqCj4g KwkJICogc2NoZWRfc3RhdGU6IHNjaGVkdWxpbmcgc3RhdGUgb2YgdGhpcyBjb250ZXh0IHVzaW5n IEd1Qwo+ICsJCSAqIHN1Ym1pc3Npb24KPiArCQkgKi8KPiArCQl1OCBzY2hlZF9zdGF0ZTsKPiAr CX0gZ3VjX3N0YXRlOwo+ICsKPiAgIAkvKiBHdUMgc2NoZWR1bGluZyBzdGF0ZSBmbGFncyB0aGF0 IGRvIG5vdCByZXF1aXJlIGEgbG9jay4gKi8KPiAgIAlhdG9taWNfdCBndWNfc2NoZWRfc3RhdGVf bm9fbG9jazsKPiAgIAo+ICsJLyogR3VDIExSQyBkZXNjcmlwdG9yIElEICovCj4gKwl1MTYgZ3Vj X2lkOwo+ICsKPiArCS8qIEd1QyBMUkMgZGVzY3JpcHRvciByZWZlcmVuY2UgY291bnQgKi8KPiAr CWF0b21pY190IGd1Y19pZF9yZWY7Cj4gKwo+ICAgCS8qCj4gLQkgKiBHdUMgTFJDIGRlc2NyaXB0 b3IgSUQgLSBOb3QgYXNzaWduZWQgaW4gdGhpcyBwYXRjaCBidXQgZnV0dXJlIHBhdGNoZXMKPiAt CSAqIGluIHRoZSBzZXJpZXMgd2lsbC4KPiArCSAqIEd1QyBJRCBsaW5rIC0gaW4gbGlzdCB3aGVu IHVucGlubmVkIGJ1dCBndWNfaWQgc3RpbGwgdmFsaWQgaW4gR3VDCj4gICAJICovCj4gLQl1MTYg Z3VjX2lkOwo+ICsJc3RydWN0IGxpc3RfaGVhZCBndWNfaWRfbGluazsKPiAgIH07Cj4gICAKPiAg ICNlbmRpZiAvKiBfX0lOVEVMX0NPTlRFWFRfVFlQRVNfXyAqLwo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9scmNfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9ndC9pbnRlbF9scmNfcmVnLmgKPiBpbmRleCA0MWU1MzUwYTdhMDUuLjQ5ZDQ4NTdhZDliNyAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9scmNfcmVnLmgKPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9scmNfcmVnLmgKPiBAQCAtODcsNyAr ODcsNiBAQAo+ICAgI2RlZmluZSBHRU4xMV9DU0JfV1JJVEVfUFRSX01BU0sJKEdFTjExX0NTQl9Q VFJfTUFTSyA8PCAwKQo+ICAgCj4gICAjZGVmaW5lIE1BWF9DT05URVhUX0hXX0lECSgxIDw8IDIx KSAvKiBleGNsdXNpdmUgKi8KPiAtI2RlZmluZSBNQVhfR1VDX0NPTlRFWFRfSFdfSUQJKDEgPDwg MjApIC8qIGV4Y2x1c2l2ZSAqLwo+ICAgI2RlZmluZSBHRU4xMV9NQVhfQ09OVEVYVF9IV19JRAko MSA8PCAxMSkgLyogZXhjbHVzaXZlICovCj4gICAvKiBpbiBHZW4xMiBJRCAweDdGRiBpcyByZXNl cnZlZCB0byBpbmRpY2F0ZSBpZGxlICovCj4gICAjZGVmaW5lIEdFTjEyX01BWF9DT05URVhUX0hX X0lECShHRU4xMV9NQVhfQ09OVEVYVF9IV19JRCAtIDEpCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Yy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv dWMvaW50ZWxfZ3VjLmgKPiBpbmRleCA4YzdiOTJmNjk5ZjEuLjMwNzczY2Q2OTlmNSAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWMuaAo+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Yy5oCj4gQEAgLTcsNiArNyw3IEBACj4g ICAjZGVmaW5lIF9JTlRFTF9HVUNfSF8KPiAgIAo+ICAgI2luY2x1ZGUgPGxpbnV4L3hhcnJheS5o Pgo+ICsjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPiAgIAo+ICAgI2luY2x1ZGUgImludGVsX3Vu Y29yZS5oIgo+ICAgI2luY2x1ZGUgImludGVsX2d1Y19mdy5oIgo+IEBAIC00NCw2ICs0NSwxNCBA QCBzdHJ1Y3QgaW50ZWxfZ3VjIHsKPiAgIAkJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBpbnRlbF9n dWMgKmd1Yyk7Cj4gICAJfSBpbnRlcnJ1cHRzOwo+ICAgCj4gKwkvKgo+ICsJICogY29udGV4dHNf bG9jayBwcm90ZWN0cyB0aGUgcG9vbCBvZiBmcmVlIGd1YyBpZHMgYW5kIGEgbGlua2VkIGxpc3Qg b2YKPiArCSAqIGd1YyBpZHMgYXZhaWxhYmxlIHRvIGJlIHN0b2xlbgo+ICsJICovCj4gKwlzcGlu bG9ja190IGNvbnRleHRzX2xvY2s7Cj4gKwlzdHJ1Y3QgaWRhIGd1Y19pZHM7Cj4gKwlzdHJ1Y3Qg bGlzdF9oZWFkIGd1Y19pZF9saXN0Owo+ICsKPiAgIAlib29sIHN1Ym1pc3Npb25fc2VsZWN0ZWQ7 Cj4gICAKPiAgIAlzdHJ1Y3QgaTkxNV92bWEgKmFkc192bWE7Cj4gQEAgLTEwMSw2ICsxMTAsMzQg QEAgaW50ZWxfZ3VjX3NlbmRfYW5kX3JlY2VpdmUoc3RydWN0IGludGVsX2d1YyAqZ3VjLCBjb25z dCB1MzIgKmFjdGlvbiwgdTMyIGxlbiwKPiAgIAkJCQkgcmVzcG9uc2VfYnVmLCByZXNwb25zZV9i dWZfc2l6ZSwgMCk7Cj4gICB9Cj4gICAKPiArc3RhdGljIGlubGluZSBpbnQgaW50ZWxfZ3VjX3Nl bmRfYnVzeV9sb29wKHN0cnVjdCBpbnRlbF9ndWMqIGd1YywKPiArCQkJCQkgICBjb25zdCB1MzIg KmFjdGlvbiwKPiArCQkJCQkgICB1MzIgbGVuLAo+ICsJCQkJCSAgIGJvb2wgbG9vcCkKPiArewo+ ICsJaW50IGVycjsKPiArCXVuc2lnbmVkIGludCBzbGVlcF9wZXJpb2RfbXMgPSAxOwo+ICsJYm9v bCBub3RfYXRvbWljID0gIWluX2F0b21pYygpICYmICFpcnFzX2Rpc2FibGVkKCk7Cj4gKwo+ICsJ LyogTm8gc2xlZXBpbmcgd2l0aCBzcGluIGxvY2tzLCBqdXN0IGJ1c3kgbG9vcCAqLwo+ICsJbWln aHRfc2xlZXBfaWYobG9vcCAmJiBub3RfYXRvbWljKTsKPiArCj4gK3JldHJ5Ogo+ICsJZXJyID0g aW50ZWxfZ3VjX3NlbmRfbmIoZ3VjLCBhY3Rpb24sIGxlbik7Cj4gKwlpZiAodW5saWtlbHkoZXJy ID09IC1FQlVTWSAmJiBsb29wKSkgewo+ICsJCWlmIChsaWtlbHkobm90X2F0b21pYykpIHsKPiAr CQkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKHNsZWVwX3BlcmlvZF9tcykpCj4gKwkJCQlyZXR1 cm4gLUVJTlRSOwo+ICsJCQlzbGVlcF9wZXJpb2RfbXMgPSBzbGVlcF9wZXJpb2RfbXMgPDwgMTsK PiArCQl9IGVsc2Ugewo+ICsJCQljcHVfcmVsYXgoKTsKClBvdGVudGlhbGx5IHNvbWV0aGluZyB3 ZSBjYW4gY2hhbmdlIGxhdGVyLCBidXQgaWYgd2UncmUgaW4gYXRvbWljIApjb250ZXh0IHdlIGNh bid0IGtlZXAgbG9vcGluZyB3aXRob3V0IGEgdGltZW91dCB3aGlsZSB3ZSBnZXQgLUVCVVNZLCB3 ZSAKbmVlZCB0byBiYWlsIG91dCBlYXJseS4KCj4gKwkJfQo+ICsJCWdvdG8gcmV0cnk7Cj4gKwl9 Cj4gKwo+ICsJcmV0dXJuIGVycjsKPiArfQo+ICsKPiAgIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnRl bF9ndWNfdG9faG9zdF9ldmVudF9oYW5kbGVyKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPiAgIHsK PiAgIAlpbnRlbF9ndWNfY3RfZXZlbnRfaGFuZGxlcigmZ3VjLT5jdCk7Cj4gQEAgLTIwMiw2ICsy MzksOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfZ3VjX2Rpc2FibGVfbXNnKHN0cnVjdCBp bnRlbF9ndWMgKmd1YywgdTMyIG1hc2spCj4gICBpbnQgaW50ZWxfZ3VjX3Jlc2V0X2VuZ2luZShz dHJ1Y3QgaW50ZWxfZ3VjICpndWMsCj4gICAJCQkgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpl bmdpbmUpOwo+ICAgCj4gK2ludCBpbnRlbF9ndWNfZGVyZWdpc3Rlcl9kb25lX3Byb2Nlc3NfbXNn KHN0cnVjdCBpbnRlbF9ndWMgKmd1YywKPiArCQkJCQkgIGNvbnN0IHUzMiAqbXNnLCB1MzIgbGVu KTsKPiArCj4gICB2b2lkIGludGVsX2d1Y19sb2FkX3N0YXR1cyhzdHJ1Y3QgaW50ZWxfZ3VjICpn dWMsIHN0cnVjdCBkcm1fcHJpbnRlciAqcCk7Cj4gICAKPiAgICNlbmRpZgo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfY3QuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19jdC5jCj4gaW5kZXggODNlYzYwZWEzZjg5Li4yOGZm ODJjNWJlNDUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxf Z3VjX2N0LmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfY3Qu Ywo+IEBAIC05MjgsNiArOTI4LDEwIEBAIHN0YXRpYyBpbnQgY3RfcHJvY2Vzc19yZXF1ZXN0KHN0 cnVjdCBpbnRlbF9ndWNfY3QgKmN0LCBzdHJ1Y3QgY3RfaW5jb21pbmdfbXNnICpyCj4gICAJY2Fz ZSBJTlRFTF9HVUNfQUNUSU9OX0RFRkFVTFQ6Cj4gICAJCXJldCA9IGludGVsX2d1Y190b19ob3N0 X3Byb2Nlc3NfcmVjdl9tc2coZ3VjLCBwYXlsb2FkLCBsZW4pOwo+ICAgCQlicmVhazsKPiArCWNh c2UgSU5URUxfR1VDX0FDVElPTl9ERVJFR0lTVEVSX0NPTlRFWFRfRE9ORToKPiArCQlyZXQgPSBp bnRlbF9ndWNfZGVyZWdpc3Rlcl9kb25lX3Byb2Nlc3NfbXNnKGd1YywgcGF5bG9hZCwKPiArCQkJ CQkJCSAgICBsZW4pOwo+ICsJCWJyZWFrOwo+ICAgCWRlZmF1bHQ6Cj4gICAJCXJldCA9IC1FT1BO T1RTVVBQOwo+ICAgCQlicmVhazsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv Z3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3Vj L2ludGVsX2d1Y19zdWJtaXNzaW9uLmMKPiBpbmRleCA1M2I0YTVlYjRhODUuLmE0N2IzODEzYjRk MCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfc3Vi bWlzc2lvbi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1 Ym1pc3Npb24uYwo+IEBAIC0xMyw3ICsxMyw5IEBACj4gICAjaW5jbHVkZSAiZ3QvaW50ZWxfZ3Qu aCIKPiAgICNpbmNsdWRlICJndC9pbnRlbF9ndF9pcnEuaCIKPiAgICNpbmNsdWRlICJndC9pbnRl bF9ndF9wbS5oIgo+ICsjaW5jbHVkZSAiZ3QvaW50ZWxfZ3RfcmVxdWVzdHMuaCIKPiAgICNpbmNs dWRlICJndC9pbnRlbF9scmMuaCIKPiArI2luY2x1ZGUgImd0L2ludGVsX2xyY19yZWcuaCIKPiAg ICNpbmNsdWRlICJndC9pbnRlbF9tb2NzLmgiCj4gICAjaW5jbHVkZSAiZ3QvaW50ZWxfcmluZy5o Igo+ICAgCj4gQEAgLTg1LDYgKzg3LDczIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHJfY29udGV4 dF9lbmFibGVkKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKPiAgIAkJICAgJmNlLT5ndWNfc2No ZWRfc3RhdGVfbm9fbG9jayk7Cj4gICB9Cj4gICAKPiArLyoKPiArICogQmVsb3cgaXMgYSBzZXQg b2YgZnVuY3Rpb25zIHdoaWNoIGNvbnRyb2wgdGhlIEd1QyBzY2hlZHVsaW5nIHN0YXRlIHdoaWNo Cj4gKyAqIHJlcXVpcmUgYSBsb2NrLCBhc2lkZSBmcm9tIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUg dGhlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkCj4gKyAqIGZyb20gZ3VjX2xyY19kZXNjX3BpbigpLiBJ biB0aGF0IGNhc2UgaXQgaXNuJ3QgcG9zc2libGUgZm9yIGFueSBvdGhlciBjb2RlCj4gKyAqIHBh dGggdG8gYmUgZXhlY3V0aW5nIG9uIHRoZSBjb250ZXh0Lgo+ICsgKi8KCklzIHRoZXJlIGEgcmVh c29uIHRvIGF2b2lkIHRha2luZyB0aGUgbG9jayBpbiBndWNfbHJjX2Rlc2NfcGluLCBldmVuIGlm IAppdCBpc24ndCBzdHJpY3RseSBuZWVkZWQ/IEknZCBwcmVmZXIgdG8gYXZvaWQgdGhlIGFzeW1t ZXRyeSBpbiB0aGUgCmxvY2tpbmcgc2NoZW1lIGlmIHBvc3NpYmxlLCBhcyB0aGF0IG1pZ2h0IGNh c2UgdHJvdWJsZSBpZiB0aGluZyBjaGFuZ2UgCmluIHRoZSBmdXR1cmUuCgo+ICsjZGVmaW5lIFND SEVEX1NUQVRFX1dBSVRfRk9SX0RFUkVHSVNURVJfVE9fUkVHSVNURVIJQklUKDApCj4gKyNkZWZp bmUgU0NIRURfU1RBVEVfREVTVFJPWUVECQkJCUJJVCgxKQo+ICtzdGF0aWMgaW5saW5lIHZvaWQg aW5pdF9zY2hlZF9zdGF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCj4gK3sKPiArCS8qIE9u bHkgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGd1Y19scmNfZGVzY19waW4oKSAqLwo+ICsJYXRvbWlj X3NldCgmY2UtPmd1Y19zY2hlZF9zdGF0ZV9ub19sb2NrLCAwKTsKPiArCWNlLT5ndWNfc3RhdGUu c2NoZWRfc3RhdGUgPSAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGJvb2wKPiArY29udGV4 dF93YWl0X2Zvcl9kZXJlZ2lzdGVyX3RvX3JlZ2lzdGVyKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpj ZSkKPiArewo+ICsJcmV0dXJuIChjZS0+Z3VjX3N0YXRlLnNjaGVkX3N0YXRlICYKPiArCQlTQ0hF RF9TVEFURV9XQUlUX0ZPUl9ERVJFR0lTVEVSX1RPX1JFR0lTVEVSKTsKCk5vIG5lZWQgZm9yICgp LiBCZWxvdyBhcyB3ZWxsLgoKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkCj4gK3NldF9j b250ZXh0X3dhaXRfZm9yX2RlcmVnaXN0ZXJfdG9fcmVnaXN0ZXIoc3RydWN0IGludGVsX2NvbnRl eHQgKmNlKQo+ICt7Cj4gKwkvKiBPbmx5IHNob3VsZCBiZSBjYWxsZWQgZnJvbSBndWNfbHJjX2Rl c2NfcGluKCkgKi8KPiArCWNlLT5ndWNfc3RhdGUuc2NoZWRfc3RhdGUgfD0KPiArCQlTQ0hFRF9T VEFURV9XQUlUX0ZPUl9ERVJFR0lTVEVSX1RPX1JFR0lTVEVSOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW5saW5lIHZvaWQKPiArY2xyX2NvbnRleHRfd2FpdF9mb3JfZGVyZWdpc3Rlcl90b19yZWdpc3Rl cihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCj4gK3sKPiArCWxvY2tkZXBfYXNzZXJ0X2hlbGQo JmNlLT5ndWNfc3RhdGUubG9jayk7Cj4gKwljZS0+Z3VjX3N0YXRlLnNjaGVkX3N0YXRlID0KPiAr CQkoY2UtPmd1Y19zdGF0ZS5zY2hlZF9zdGF0ZSAmCj4gKwkJIH5TQ0hFRF9TVEFURV9XQUlUX0ZP Ul9ERVJFR0lTVEVSX1RPX1JFR0lTVEVSKTsKCm5pdDogY2FuIGFsc28gdXNlCgpjZS0+Z3VjX3N0 YXRlLnNjaGVkX3N0YXRlICY9Cgl+U0NIRURfU1RBVEVfV0FJVF9GT1JfREVSRUdJU1RFUl9UT19S RUdJU1RFUgoKCj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgYm9vbAo+ICtjb250ZXh0X2Rlc3Ry b3llZChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCj4gK3sKPiArCXJldHVybiAoY2UtPmd1Y19z dGF0ZS5zY2hlZF9zdGF0ZSAmIFNDSEVEX1NUQVRFX0RFU1RST1lFRCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbmxpbmUgdm9pZAo+ICtzZXRfY29udGV4dF9kZXN0cm95ZWQoc3RydWN0IGludGVsX2Nv bnRleHQgKmNlKQo+ICt7Cj4gKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjZS0+Z3VjX3N0YXRlLmxv Y2spOwo+ICsJY2UtPmd1Y19zdGF0ZS5zY2hlZF9zdGF0ZSB8PSBTQ0hFRF9TVEFURV9ERVNUUk9Z RUQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgYm9vbCBjb250ZXh0X2d1Y19pZF9pbnZhbGlk KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKPiArewo+ICsJcmV0dXJuIChjZS0+Z3VjX2lkID09 IEdVQ19JTlZBTElEX0xSQ19JRCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRf Y29udGV4dF9ndWNfaWRfaW52YWxpZChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCj4gK3sKPiAr CWNlLT5ndWNfaWQgPSBHVUNfSU5WQUxJRF9MUkNfSUQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxp bmUgc3RydWN0IGludGVsX2d1YyAqY2VfdG9fZ3VjKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkK PiArewo+ICsJcmV0dXJuICZjZS0+ZW5naW5lLT5ndC0+dWMuZ3VjOwo+ICt9Cj4gKwo+ICAgc3Rh dGljIGlubGluZSBzdHJ1Y3QgaTkxNV9wcmlvbGlzdCAqdG9fcHJpb2xpc3Qoc3RydWN0IHJiX25v ZGUgKnJiKQo+ICAgewo+ICAgCXJldHVybiByYl9lbnRyeShyYiwgc3RydWN0IGk5MTVfcHJpb2xp c3QsIG5vZGUpOwo+IEBAIC0xNTUsNiArMjI0LDkgQEAgc3RhdGljIGludCBndWNfYWRkX3JlcXVl c3Qoc3RydWN0IGludGVsX2d1YyAqZ3VjLCBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKPiAgIAlp bnQgbGVuID0gMDsKPiAgIAlib29sIGVuYWJsZWQgPSBjb250ZXh0X2VuYWJsZWQoY2UpOwo+ICAg Cj4gKwlHRU1fQlVHX09OKCFhdG9taWNfcmVhZCgmY2UtPmd1Y19pZF9yZWYpKTsKPiArCUdFTV9C VUdfT04oY29udGV4dF9ndWNfaWRfaW52YWxpZChjZSkpOwo+ICsKPiAgIAlpZiAoIWVuYWJsZWQp IHsKPiAgIAkJYWN0aW9uW2xlbisrXSA9IElOVEVMX0dVQ19BQ1RJT05fU0NIRURfQ09OVEVYVF9N T0RFX1NFVDsKPiAgIAkJYWN0aW9uW2xlbisrXSA9IGNlLT5ndWNfaWQ7Cj4gQEAgLTQxNyw2ICs0 ODksMTAgQEAgaW50IGludGVsX2d1Y19zdWJtaXNzaW9uX2luaXQoc3RydWN0IGludGVsX2d1YyAq Z3VjKQo+ICAgCj4gICAJeGFfaW5pdF9mbGFncygmZ3VjLT5jb250ZXh0X2xvb2t1cCwgWEFfRkxB R1NfTE9DS19JUlEpOwo+ICAgCj4gKwlzcGluX2xvY2tfaW5pdCgmZ3VjLT5jb250ZXh0c19sb2Nr KTsKPiArCUlOSVRfTElTVF9IRUFEKCZndWMtPmd1Y19pZF9saXN0KTsKPiArCWlkYV9pbml0KCZn dWMtPmd1Y19pZHMpOwo+ICsKPiAgIAlyZXR1cm4gMDsKPiAgIH0KPiAgIAo+IEBAIC00MjksOSAr NTA1LDMwMyBAQCB2b2lkIGludGVsX2d1Y19zdWJtaXNzaW9uX2Zpbmkoc3RydWN0IGludGVsX2d1 YyAqZ3VjKQo+ICAgCWk5MTVfc2NoZWRfZW5naW5lX3B1dChndWMtPnNjaGVkX2VuZ2luZSk7Cj4g ICB9Cj4gICAKPiAtc3RhdGljIGludCBndWNfY29udGV4dF9hbGxvYyhzdHJ1Y3QgaW50ZWxfY29u dGV4dCAqY2UpCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV9yZXF1ZXN0KHN0cnVjdCBpOTE1 X3NjaGVkX2VuZ2luZSAqc2NoZWRfZW5naW5lLAo+ICsJCQkJIHN0cnVjdCBpOTE1X3JlcXVlc3Qg KnJxLAo+ICsJCQkJIGludCBwcmlvKQo+ICAgewo+IC0JcmV0dXJuIGxyY19hbGxvYyhjZSwgY2Ut PmVuZ2luZSk7Cj4gKwlHRU1fQlVHX09OKCFsaXN0X2VtcHR5KCZycS0+c2NoZWQubGluaykpOwo+ ICsJbGlzdF9hZGRfdGFpbCgmcnEtPnNjaGVkLmxpbmssCj4gKwkJICAgICAgaTkxNV9zY2hlZF9s b29rdXBfcHJpb2xpc3Qoc2NoZWRfZW5naW5lLCBwcmlvKSk7Cj4gKwlzZXRfYml0KEk5MTVfRkVO Q0VfRkxBR19QUVVFVUUsICZycS0+ZmVuY2UuZmxhZ3MpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGd1Y19ieXBhc3NfdGFza2xldF9zdWJtaXQoc3RydWN0IGludGVsX2d1YyAqZ3VjLAo+ICsJCQkJ ICAgICBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKPiArewo+ICsJaW50IHJldDsKPiArCj4gKwlf X2k5MTVfcmVxdWVzdF9zdWJtaXQocnEpOwo+ICsKPiArCXRyYWNlX2k5MTVfcmVxdWVzdF9pbihy cSwgMCk7Cj4gKwo+ICsJZ3VjX3NldF9scmNfdGFpbChycSk7Cj4gKwlyZXQgPSBndWNfYWRkX3Jl cXVlc3QoZ3VjLCBycSk7Cj4gKwlpZiAocmV0ID09IC1FQlVTWSkKPiArCQlndWMtPnN0YWxsZWRf cmVxdWVzdCA9IHJxOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk IGd1Y19zdWJtaXRfcmVxdWVzdChzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKPiArewo+ICsJc3Ry dWN0IGk5MTVfc2NoZWRfZW5naW5lICpzY2hlZF9lbmdpbmUgPSBycS0+ZW5naW5lLT5zY2hlZF9l bmdpbmU7Cj4gKwlzdHJ1Y3QgaW50ZWxfZ3VjICpndWMgPSAmcnEtPmVuZ2luZS0+Z3QtPnVjLmd1 YzsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJLyogV2lsbCBiZSBjYWxsZWQgZnJv bSBpcnEtY29udGV4dCB3aGVuIHVzaW5nIGZvcmVpZ24gZmVuY2VzLiAqLwo+ICsJc3Bpbl9sb2Nr X2lycXNhdmUoJnNjaGVkX2VuZ2luZS0+bG9jaywgZmxhZ3MpOwo+ICsKPiArCWlmIChndWMtPnN0 YWxsZWRfcmVxdWVzdCB8fCAhaTkxNV9zY2hlZF9lbmdpbmVfaXNfZW1wdHkoc2NoZWRfZW5naW5l KSkKPiArCQlxdWV1ZV9yZXF1ZXN0KHNjaGVkX2VuZ2luZSwgcnEsIHJxX3ByaW8ocnEpKTsKPiAr CWVsc2UgaWYgKGd1Y19ieXBhc3NfdGFza2xldF9zdWJtaXQoZ3VjLCBycSkgPT0gLUVCVVNZKQo+ ICsJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnNjaGVkX2VuZ2luZS0+dGFza2xldCk7Cj4gKwo+ICsJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NoZWRfZW5naW5lLT5sb2NrLCBmbGFncyk7Cj4gK30K PiArCj4gKyNkZWZpbmUgR1VDX0lEX1NUQVJUCTY0CS8qIEZpcnN0IDY0IGd1Y19pZHMgcmVzZXJ2 ZWQgKi8KPiArc3RhdGljIGludCBuZXdfZ3VjX2lkKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPiAr ewo+ICsJcmV0dXJuIGlkYV9zaW1wbGVfZ2V0KCZndWMtPmd1Y19pZHMsIEdVQ19JRF9TVEFSVCwK PiArCQkJICAgICAgR1VDX01BWF9MUkNfREVTQ1JJUFRPUlMsIEdGUF9LRVJORUwgfAo+ICsJCQkg ICAgICBfX0dGUF9SRVRSWV9NQVlGQUlMIHwgX19HRlBfTk9XQVJOKTsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgX19yZWxlYXNlX2d1Y19pZChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHN0cnVjdCBp bnRlbF9jb250ZXh0ICpjZSkKPiArewo+ICsJaWYgKCFjb250ZXh0X2d1Y19pZF9pbnZhbGlkKGNl KSkgewo+ICsJCWlkYV9zaW1wbGVfcmVtb3ZlKCZndWMtPmd1Y19pZHMsIGNlLT5ndWNfaWQpOwo+ ICsJCXJlc2V0X2xyY19kZXNjKGd1YywgY2UtPmd1Y19pZCk7Cj4gKwkJc2V0X2NvbnRleHRfZ3Vj X2lkX2ludmFsaWQoY2UpOwo+ICsJfQo+ICsJaWYgKCFsaXN0X2VtcHR5KCZjZS0+Z3VjX2lkX2xp bmspKQo+ICsJCWxpc3RfZGVsX2luaXQoJmNlLT5ndWNfaWRfbGluayk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIHJlbGVhc2VfZ3VjX2lkKHN0cnVjdCBpbnRlbF9ndWMgKmd1Yywgc3RydWN0IGlu dGVsX2NvbnRleHQgKmNlKQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsKPiArCXNw aW5fbG9ja19pcnFzYXZlKCZndWMtPmNvbnRleHRzX2xvY2ssIGZsYWdzKTsKPiArCV9fcmVsZWFz ZV9ndWNfaWQoZ3VjLCBjZSk7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndWMtPmNvbnRl eHRzX2xvY2ssIGZsYWdzKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBzdGVhbF9ndWNfaWQoc3Ry dWN0IGludGVsX2d1YyAqZ3VjKQo+ICt7Cj4gKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2U7Cj4g KwlpbnQgZ3VjX2lkOwo+ICsKPiArCWlmICghbGlzdF9lbXB0eSgmZ3VjLT5ndWNfaWRfbGlzdCkp IHsKPiArCQljZSA9IGxpc3RfZmlyc3RfZW50cnkoJmd1Yy0+Z3VjX2lkX2xpc3QsCj4gKwkJCQkg ICAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCwKPiArCQkJCSAgICAgIGd1Y19pZF9saW5rKTsKPiAr Cj4gKwkJR0VNX0JVR19PTihhdG9taWNfcmVhZCgmY2UtPmd1Y19pZF9yZWYpKTsKPiArCQlHRU1f QlVHX09OKGNvbnRleHRfZ3VjX2lkX2ludmFsaWQoY2UpKTsKPiArCj4gKwkJbGlzdF9kZWxfaW5p dCgmY2UtPmd1Y19pZF9saW5rKTsKPiArCQlndWNfaWQgPSBjZS0+Z3VjX2lkOwo+ICsJCXNldF9j b250ZXh0X2d1Y19pZF9pbnZhbGlkKGNlKTsKPiArCQlyZXR1cm4gZ3VjX2lkOwo+ICsJfSBlbHNl IHsKPiArCQlyZXR1cm4gLUVBR0FJTjsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIGludCBhc3Np Z25fZ3VjX2lkKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywgdTE2ICpvdXQpCj4gK3sKPiArCWludCBy ZXQ7Cj4gKwo+ICsJcmV0ID0gbmV3X2d1Y19pZChndWMpOwo+ICsJaWYgKHVubGlrZWx5KHJldCA8 IDApKSB7Cj4gKwkJcmV0ID0gc3RlYWxfZ3VjX2lkKGd1Yyk7Cj4gKwkJaWYgKHJldCA8IDApCj4g KwkJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJKm91dCA9IHJldDsKPiArCXJldHVybiAwOwoK SXMgaXQgd29ydGggYWRkaW5nIHNwaW5sb2NrX2hlbGQgYXNzZXJ0cyBmb3IgZ3VjLT5jb250ZXh0 c19sb2NrIGluIHRoZXNlIApJRCBmdW5jdGlvbnM/IERvdWJsZXMgdXAgYXMgYSBkb2N1bWVudGF0 aW9uIG9mIHdoYXQgbG9ja2luZyB3ZSBleHBlY3QuCgo+ICt9Cj4gKwo+ICsjZGVmaW5lIFBJTl9H VUNfSURfVFJJRVMJNAo+ICtzdGF0aWMgaW50IHBpbl9ndWNfaWQoc3RydWN0IGludGVsX2d1YyAq Z3VjLCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsJ dW5zaWduZWQgbG9uZyBmbGFncywgdHJpZXMgPSBQSU5fR1VDX0lEX1RSSUVTOwo+ICsKPiArCUdF TV9CVUdfT04oYXRvbWljX3JlYWQoJmNlLT5ndWNfaWRfcmVmKSk7Cj4gKwo+ICt0cnlfYWdhaW46 Cj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VjLT5jb250ZXh0c19sb2NrLCBmbGFncyk7Cj4gKwo+ ICsJaWYgKGNvbnRleHRfZ3VjX2lkX2ludmFsaWQoY2UpKSB7Cj4gKwkJcmV0ID0gYXNzaWduX2d1 Y19pZChndWMsICZjZS0+Z3VjX2lkKTsKPiArCQlpZiAocmV0KQo+ICsJCQlnb3RvIG91dF91bmxv Y2s7Cj4gKwkJcmV0ID0gMTsJLyogSW5kaWRjYXRlcyBuZXdseSBhc3NpZ25lZCBndWNfaWQgKi8K PiArCX0KPiArCWlmICghbGlzdF9lbXB0eSgmY2UtPmd1Y19pZF9saW5rKSkKPiArCQlsaXN0X2Rl bF9pbml0KCZjZS0+Z3VjX2lkX2xpbmspOwo+ICsJYXRvbWljX2luYygmY2UtPmd1Y19pZF9yZWYp Owo+ICsKPiArb3V0X3VubG9jazoKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1Yy0+Y29u dGV4dHNfbG9jaywgZmxhZ3MpOwo+ICsKPiArCS8qCj4gKwkgKiAtRUFHQUlOIGluZGljYXRlcyBu byBndWNfaWRzIGFyZSBhdmFpbGFibGUsIGxldCdzIHJldGlyZSBhbnkKPiArCSAqIG91dHN0YW5k aW5nIHJlcXVlc3RzIHRvIHNlZSBpZiB0aGF0IGZyZWVzIHVwIGEgZ3VjX2lkLiBJZiB0aGUgZmly c3QKPiArCSAqIHJldGlyZSBkaWRuJ3QgaGVscCwgaW5zZXJ0IGEgc2xlZXAgd2l0aCB0aGUgdGlt ZXNsaWNlIGR1cmF0aW9uIGJlZm9yZQo+ICsJICogYXR0ZW1wdGluZyB0byByZXRpcmUgbW9yZSBy ZXF1ZXN0cy4gRG91YmxlIHRoZSBzbGVlcCBwZXJpb2QgZWFjaAo+ICsJICogc3Vic2VxdWVudCBw YXNzIGJlZm9yZSBmaW5hbGx5IGdpdmluZyB1cC4gVGhlIHNsZWVwIHBlcmlvZCBoYXMgbWF4IG9m Cj4gKwkgKiAxMDBtcyBhbmQgbWluaW11bSBvZiAxbXMuCj4gKwkgKi8KPiArCWlmIChyZXQgPT0g LUVBR0FJTiAmJiAtLXRyaWVzKSB7Cj4gKwkJaWYgKFBJTl9HVUNfSURfVFJJRVMgLSB0cmllcyA+ IDEpIHsKPiArCQkJdW5zaWduZWQgaW50IHRpbWVzbGljZV9zaGlmdGVkID0KPiArCQkJCWNlLT5l bmdpbmUtPnByb3BzLnRpbWVzbGljZV9kdXJhdGlvbl9tcyA8PAo+ICsJCQkJKFBJTl9HVUNfSURf VFJJRVMgLSB0cmllcyAtIDIpOwo+ICsJCQl1bnNpZ25lZCBpbnQgbWF4ID0gbWluX3QodW5zaWdu ZWQgaW50LCAxMDAsCj4gKwkJCQkJCSB0aW1lc2xpY2Vfc2hpZnRlZCk7Cj4gKwo+ICsJCQltc2xl ZXAobWF4X3QodW5zaWduZWQgaW50LCBtYXgsIDEpKTsKPiArCQl9Cj4gKwkJaW50ZWxfZ3RfcmV0 aXJlX3JlcXVlc3RzKGd1Y190b19ndChndWMpKTsKPiArCQlnb3RvIHRyeV9hZ2FpbjsKPiArCX0K PiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB1bnBpbl9ndWNfaWQo c3RydWN0IGludGVsX2d1YyAqZ3VjLCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCj4gK3sKPiAr CXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJR0VNX0JVR19PTihhdG9taWNfcmVhZCgmY2Ut Pmd1Y19pZF9yZWYpIDwgMCk7Cj4gKwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmd1Yy0+Y29udGV4 dHNfbG9jaywgZmxhZ3MpOwo+ICsJaWYgKCFjb250ZXh0X2d1Y19pZF9pbnZhbGlkKGNlKSAmJiBs aXN0X2VtcHR5KCZjZS0+Z3VjX2lkX2xpbmspICYmCj4gKwkgICAgIWF0b21pY19yZWFkKCZjZS0+ Z3VjX2lkX3JlZikpCj4gKwkJbGlzdF9hZGRfdGFpbCgmY2UtPmd1Y19pZF9saW5rLCAmZ3VjLT5n dWNfaWRfbGlzdCk7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndWMtPmNvbnRleHRzX2xv Y2ssIGZsYWdzKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBfX2d1Y19hY3Rpb25fcmVnaXN0ZXJf Y29udGV4dChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsCj4gKwkJCQkJIHUzMiBndWNfaWQsCj4gKwkJ CQkJIHUzMiBvZmZzZXQpCj4gK3sKPiArCXUzMiBhY3Rpb25bXSA9IHsKPiArCQlJTlRFTF9HVUNf QUNUSU9OX1JFR0lTVEVSX0NPTlRFWFQsCj4gKwkJZ3VjX2lkLAo+ICsJCW9mZnNldCwKPiArCX07 Cj4gKwo+ICsJcmV0dXJuIGludGVsX2d1Y19zZW5kX2J1c3lfbG9vcChndWMsIGFjdGlvbiwgQVJS QVlfU0laRShhY3Rpb24pLCB0cnVlKTsKPiArfQo+ICsKPiArc3RhdGljIGludCByZWdpc3Rlcl9j b250ZXh0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKPiArewo+ICsJc3RydWN0IGludGVsX2d1 YyAqZ3VjID0gY2VfdG9fZ3VjKGNlKTsKPiArCXUzMiBvZmZzZXQgPSBpbnRlbF9ndWNfZ2d0dF9v ZmZzZXQoZ3VjLCBndWMtPmxyY19kZXNjX3Bvb2wpICsKPiArCQljZS0+Z3VjX2lkICogc2l6ZW9m KHN0cnVjdCBndWNfbHJjX2Rlc2MpOwo+ICsKPiArCXJldHVybiBfX2d1Y19hY3Rpb25fcmVnaXN0 ZXJfY29udGV4dChndWMsIGNlLT5ndWNfaWQsIG9mZnNldCk7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgX19ndWNfYWN0aW9uX2RlcmVnaXN0ZXJfY29udGV4dChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMs Cj4gKwkJCQkJICAgdTMyIGd1Y19pZCkKPiArewo+ICsJdTMyIGFjdGlvbltdID0gewo+ICsJCUlO VEVMX0dVQ19BQ1RJT05fREVSRUdJU1RFUl9DT05URVhULAo+ICsJCWd1Y19pZCwKPiArCX07Cj4g Kwo+ICsJcmV0dXJuIGludGVsX2d1Y19zZW5kX2J1c3lfbG9vcChndWMsIGFjdGlvbiwgQVJSQVlf U0laRShhY3Rpb24pLCB0cnVlKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBkZXJlZ2lzdGVyX2Nv bnRleHQoc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCB1MzIgZ3VjX2lkKQo+ICt7Cj4gKwlzdHJ1 Y3QgaW50ZWxfZ3VjICpndWMgPSBjZV90b19ndWMoY2UpOwo+ICsKPiArCXJldHVybiBfX2d1Y19h Y3Rpb25fZGVyZWdpc3Rlcl9jb250ZXh0KGd1YywgZ3VjX2lkKTsKPiArfQo+ICsKPiArc3RhdGlj IGludGVsX2VuZ2luZV9tYXNrX3QgYWRqdXN0X2VuZ2luZV9tYXNrKHU4IGNsYXNzLCBpbnRlbF9l bmdpbmVfbWFza190IG1hc2spCj4gK3sKPiArCXN3aXRjaCAoY2xhc3MpIHsKPiArCWNhc2UgUkVO REVSX0NMQVNTOgo+ICsJCXJldHVybiBtYXNrID4+IFJDUzA7Cj4gKwljYXNlIFZJREVPX0VOSEFO Q0VNRU5UX0NMQVNTOgo+ICsJCXJldHVybiBtYXNrID4+IFZFQ1MwOwo+ICsJY2FzZSBWSURFT19E RUNPREVfQ0xBU1M6Cj4gKwkJcmV0dXJuIG1hc2sgPj4gVkNTMDsKPiArCWNhc2UgQ09QWV9FTkdJ TkVfQ0xBU1M6Cj4gKwkJcmV0dXJuIG1hc2sgPj4gQkNTMDsKPiArCWRlZmF1bHQ6Cj4gKwkJR0VN X0JVR19PTigiSW52YWxpZCBDbGFzcyIpOwoKd2UgdXN1YWxseSB1c2UgTUlTU0lOR19DQVNFIGZv ciB0aGlzIHR5cGUgb2YgZXJyb3JzLgoKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgZ3VjX2NvbnRleHRfcG9saWN5X2luaXQoc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lLAo+ICsJCQkJICAgIHN0cnVjdCBndWNfbHJjX2Rlc2MgKmRlc2MpCj4gK3sKPiAr CWRlc2MtPnBvbGljeV9mbGFncyA9IDA7Cj4gKwo+ICsJZGVzYy0+ZXhlY3V0aW9uX3F1YW50dW0g PSBDT05URVhUX1BPTElDWV9ERUZBVUxUX0VYRUNVVElPTl9RVUFOVFVNX1VTOwo+ICsJZGVzYy0+ cHJlZW1wdGlvbl90aW1lb3V0ID0gQ09OVEVYVF9QT0xJQ1lfREVGQVVMVF9QUkVFTVBUSU9OX1RJ TUVfVVM7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZ3VjX2xyY19kZXNjX3BpbihzdHJ1Y3QgaW50 ZWxfY29udGV4dCAqY2UpCj4gK3sKPiArCXN0cnVjdCBpbnRlbF9ydW50aW1lX3BtICpydW50aW1l X3BtID0KPiArCQkmY2UtPmVuZ2luZS0+Z3QtPmk5MTUtPnJ1bnRpbWVfcG07CgpJZiB5b3UgbW92 ZSB0aGlzIGFmdGVyIHRoZSBlbmdpbmUgdmFyIGJlbG93IHlvdSBjYW4gc2tpcCB0aGUgY2UtPmVu Z2luZSAKanVtcC4gQWxzbywgeW91IGNhbiBzaG9ydGVuIHRoZSBwb2ludGVyIGNoYXNpbmcgYnkg dXNpbmcgCmVuZ2luZS0+dW5jb3JlLT5ycG0uCgo+ICsJc3RydWN0IGludGVsX2VuZ2luZV9jcyAq ZW5naW5lID0gY2UtPmVuZ2luZTsKPiArCXN0cnVjdCBpbnRlbF9ndWMgKmd1YyA9ICZlbmdpbmUt Pmd0LT51Yy5ndWM7Cj4gKwl1MzIgZGVzY19pZHggPSBjZS0+Z3VjX2lkOwo+ICsJc3RydWN0IGd1 Y19scmNfZGVzYyAqZGVzYzsKPiArCWJvb2wgY29udGV4dF9yZWdpc3RlcmVkOwo+ICsJaW50ZWxf d2FrZXJlZl90IHdha2VyZWY7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlHRU1fQlVHX09OKCFl bmdpbmUtPm1hc2spOwo+ICsKPiArCS8qCj4gKwkgKiBFbnN1cmUgTFJDICsgQ1Qgdm1hcyBhcmUg aXMgc2FtZSByZWdpb24gYXMgd3JpdGUgYmFycmllciBpcyBkb25lCj4gKwkgKiBiYXNlZCBvbiBD VCB2bWEgcmVnaW9uLgo+ICsJICovCj4gKwlHRU1fQlVHX09OKGk5MTVfZ2VtX29iamVjdF9pc19s bWVtKGd1Yy0+Y3Qudm1hLT5vYmopICE9Cj4gKwkJICAgaTkxNV9nZW1fb2JqZWN0X2lzX2xtZW0o Y2UtPnJpbmctPnZtYS0+b2JqKSk7Cj4gKwo+ICsJY29udGV4dF9yZWdpc3RlcmVkID0gbHJjX2Rl c2NfcmVnaXN0ZXJlZChndWMsIGRlc2NfaWR4KTsKPiArCj4gKwlyZXNldF9scmNfZGVzYyhndWMs IGRlc2NfaWR4KTsKPiArCXNldF9scmNfZGVzY19yZWdpc3RlcmVkKGd1YywgZGVzY19pZHgsIGNl KTsKPiArCj4gKwlkZXNjID0gX19nZXRfbHJjX2Rlc2MoZ3VjLCBkZXNjX2lkeCk7Cj4gKwlkZXNj LT5lbmdpbmVfY2xhc3MgPSBlbmdpbmVfY2xhc3NfdG9fZ3VjX2NsYXNzKGVuZ2luZS0+Y2xhc3Mp Owo+ICsJZGVzYy0+ZW5naW5lX3N1Ym1pdF9tYXNrID0gYWRqdXN0X2VuZ2luZV9tYXNrKGVuZ2lu ZS0+Y2xhc3MsCj4gKwkJCQkJCSAgICAgIGVuZ2luZS0+bWFzayk7Cj4gKwlkZXNjLT5od19jb250 ZXh0X2Rlc2MgPSBjZS0+bHJjLmxyY2E7Cj4gKwlkZXNjLT5wcmlvcml0eSA9IEdVQ19DTElFTlRf UFJJT1JJVFlfS01EX05PUk1BTDsKPiArCWRlc2MtPmNvbnRleHRfZmxhZ3MgPSBDT05URVhUX1JF R0lTVFJBVElPTl9GTEFHX0tNRDsKPiArCWd1Y19jb250ZXh0X3BvbGljeV9pbml0KGVuZ2luZSwg ZGVzYyk7Cj4gKwlpbml0X3NjaGVkX3N0YXRlKGNlKTsKPiArCj4gKwkvKgo+ICsJICogVGhlIGNv bnRleHRfbG9va3VwIHhhcnJheSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgaGFyZHdhcmUK PiArCSAqIGNvbnRleHQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQuIFRoZXJlIGFyZSB0d28gY2Fz ZXMgaW4gd2hpY2ggaXQKPiArCSAqIGNvdWxkIGJlIHJlZ2lzZ2VyZWQgZWl0aGVyIHRoZSBndWNf aWQgaGFzIGJlZW4gc3RvbGUgZnJvbSBmcm9tCgp0eXBvIHJlZ2lzZ2VyZWQKCj4gKwkgKiBhbm90 aGVyIGNvbnRleHQgb3IgdGhlIGxyYyBkZXNjcmlwdG9yIGFkZHJlc3Mgb2YgdGhpcyBjb250ZXh0 IGhhcwo+ICsJICogY2hhbmdlZC4gSW4gZWl0aGVyIGNhc2UgdGhlIGNvbnRleHQgbmVlZHMgdG8g YmUgZGVyZWdpc3RlcmVkIHdpdGggdGhlCj4gKwkgKiBHdUMgYmVmb3JlIHJlZ2lzdGVyaW5nIHRo aXMgY29udGV4dC4KPiArCSAqLwo+ICsJaWYgKGNvbnRleHRfcmVnaXN0ZXJlZCkgewo+ICsJCXNl dF9jb250ZXh0X3dhaXRfZm9yX2RlcmVnaXN0ZXJfdG9fcmVnaXN0ZXIoY2UpOwo+ICsJCWludGVs X2NvbnRleHRfZ2V0KGNlKTsKPiArCj4gKwkJLyoKPiArCQkgKiBJZiBzdGVhbGluZyB0aGUgZ3Vj X2lkLCB0aGlzIGNlIGhhcyB0aGUgc2FtZSBndWNfaWQgYXMgdGhlCj4gKwkJICogY29udGV4dCB3 aG9zIGd1Y19pZCB3YXMgc3RvbGUuCj4gKwkJICovCj4gKwkJd2l0aF9pbnRlbF9ydW50aW1lX3Bt KHJ1bnRpbWVfcG0sIHdha2VyZWYpCj4gKwkJCXJldCA9IGRlcmVnaXN0ZXJfY29udGV4dChjZSwg Y2UtPmd1Y19pZCk7Cj4gKwl9IGVsc2Ugewo+ICsJCXdpdGhfaW50ZWxfcnVudGltZV9wbShydW50 aW1lX3BtLCB3YWtlcmVmKQo+ICsJCQlyZXQgPSByZWdpc3Rlcl9jb250ZXh0KGNlKTsKPiArCX0K PiArCj4gKwlyZXR1cm4gcmV0Owo+ICAgfQo+ICAgCj4gICBzdGF0aWMgaW50IGd1Y19jb250ZXh0 X3ByZV9waW4oc3RydWN0IGludGVsX2NvbnRleHQgKmNlLAo+IEBAIC00NDMsMzYgKzgxMywxMzkg QEAgc3RhdGljIGludCBndWNfY29udGV4dF9wcmVfcGluKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpj ZSwKPiAgIAo+ICAgc3RhdGljIGludCBndWNfY29udGV4dF9waW4oc3RydWN0IGludGVsX2NvbnRl eHQgKmNlLCB2b2lkICp2YWRkcikKPiAgIHsKPiArCWlmIChpOTE1X2dndHRfb2Zmc2V0KGNlLT5z dGF0ZSkgIT0KPiArCSAgICAoY2UtPmxyYy5scmNhICYgQ1RYX0dUVF9BRERSRVNTX01BU0spKQo+ ICsJCXNldF9iaXQoQ09OVEVYVF9MUkNBX0RJUlRZLCAmY2UtPmZsYWdzKTsKClNob3VsZG4ndCB0 aGlzIGJlIHNldCBhZnRlciBscmNfcGluKCk/IEkgY2FuIHNlZSBjZS0+bHJjLmxyY2EgYmVpbmcg CnJlLWFzc2lnbmVkIGluIHRoZXJlOyBpdCBsb29rcyBsaWtlIGl0IGNhbiBvbmx5IGNoYW5nZSBp ZiB0aGUgY29udGV4dCBpcyAKbmV3LCBidXQgZm9yIGZ1dHVyZS1wcm9vZmluZyBJTU8gYmV0dGVy IHRvIHJlLW9yZGVyIGhlcmUuCgo+ICsKPiAgIAlyZXR1cm4gbHJjX3BpbihjZSwgY2UtPmVuZ2lu ZSwgdmFkZHIpOwoKQ291bGQgdXNlIGEgY29tbWVudCB0byBzYXkgdGhhdCB0aGUgR3VDIGNvbnRl eHQgcGlubmluZyBjYWxsIGlzIGRlbGF5ZWQgCnVudGlsIHJlcXVlc3QgYWxsb2MgYW5kIHRvIGxv b2sgYXQgdGhlIGNvbW1lbnQgaW4gdGhlIGxhdHRlciBmdW5jdGlvbiAKZm9yIGRldGFpbHMgKG9y IG1vdmUgdGhlIGV4cGxhbmF0aW9uIGhlcmUgYW5kIHJlZmVyIGhlcmUgZnJvbSByZXF1ZXN0IAph bGxvYykuCgo+ICAgfQo+ICAgCj4gK3N0YXRpYyB2b2lkIGd1Y19jb250ZXh0X3VucGluKHN0cnVj dCBpbnRlbF9jb250ZXh0ICpjZSkKPiArewo+ICsJc3RydWN0IGludGVsX2d1YyAqZ3VjID0gY2Vf dG9fZ3VjKGNlKTsKPiArCj4gKwl1bnBpbl9ndWNfaWQoZ3VjLCBjZSk7Cj4gKwlscmNfdW5waW4o Y2UpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBndWNfY29udGV4dF9wb3N0X3VucGluKHN0cnVj dCBpbnRlbF9jb250ZXh0ICpjZSkKPiArewo+ICsJbHJjX3Bvc3RfdW5waW4oY2UpOwoKd2h5IGRv IHdlIG5lZWQgdGhpcyBmdW5jdGlvbj8gd2UgY2FuIGp1c3QgcGFzcyBscmNfcG9zdF91bnBpbiB0 byB0aGUgb3BzIAoobGlrZSB3ZSBhbHJlYWR5IGRvKS4KCj4gK30KPiArCj4gK3N0YXRpYyBpbmxp bmUgdm9pZCBndWNfbHJjX2Rlc2NfdW5waW4oc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQo+ICt7 Cj4gKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUgPSBjZS0+ZW5naW5lOwo+ICsJc3Ry dWN0IGludGVsX2d1YyAqZ3VjID0gJmVuZ2luZS0+Z3QtPnVjLmd1YzsKPiArCXVuc2lnbmVkIGxv bmcgZmxhZ3M7Cj4gKwo+ICsJR0VNX0JVR19PTighbHJjX2Rlc2NfcmVnaXN0ZXJlZChndWMsIGNl LT5ndWNfaWQpKTsKPiArCUdFTV9CVUdfT04oY2UgIT0gX19nZXRfY29udGV4dChndWMsIGNlLT5n dWNfaWQpKTsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2UtPmd1Y19zdGF0ZS5sb2NrLCBm bGFncyk7Cj4gKwlzZXRfY29udGV4dF9kZXN0cm95ZWQoY2UpOwo+ICsJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmY2UtPmd1Y19zdGF0ZS5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJZGVyZWdpc3Rlcl9j b250ZXh0KGNlLCBjZS0+Z3VjX2lkKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZ3VjX2NvbnRl eHRfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKPiArewo+ICsJc3RydWN0IGludGVsX2NvbnRl eHQgKmNlID0gY29udGFpbmVyX29mKGtyZWYsIHR5cGVvZigqY2UpLCByZWYpOwo+ICsJc3RydWN0 IGludGVsX3J1bnRpbWVfcG0gKnJ1bnRpbWVfcG0gPSAmY2UtPmVuZ2luZS0+Z3QtPmk5MTUtPnJ1 bnRpbWVfcG07CgpzYW1lIGFzIGFib3ZlLCBnb2luZyB0aHJvdWdoIGVuZ2luZS0+dW5jb3JlLT5y cG0gaXMgc2hvcnRlcgoKPiArCXN0cnVjdCBpbnRlbF9ndWMgKmd1YyA9ICZjZS0+ZW5naW5lLT5n dC0+dWMuZ3VjOwo+ICsJaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Cj4gKwl1bnNpZ25lZCBsb25n IGZsYWdzOwo+ICsKPiArCS8qCj4gKwkgKiBJZiB0aGUgZ3VjX2lkIGlzIGludmFsaWQgdGhpcyBj b250ZXh0IGhhcyBiZWVuIHN0b2xlbiBhbmQgd2UgY2FuIGZyZWUKPiArCSAqIGl0IGltbWVkaWF0 ZWx5LiBBbHNvIGNhbiBiZSBmcmVlZCBpbW1lZGlhdGVseSBpZiB0aGUgY29udGV4dCBpcyBub3QK PiArCSAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUgR3VDLgo+ICsJICovCj4gKwlpZiAoY29udGV4dF9n dWNfaWRfaW52YWxpZChjZSkgfHwKPiArCSAgICAhbHJjX2Rlc2NfcmVnaXN0ZXJlZChndWMsIGNl LT5ndWNfaWQpKSB7Cj4gKwkJcmVsZWFzZV9ndWNfaWQoZ3VjLCBjZSk7CgppdCBmZWVscyBhIGJp dCB3ZWlyZCB0aGF0IHdlIGNhbGwgcmVsZWFzZV9ndWNfaWQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhl IAppZCBpcyBpbnZhbGlkLiBUaGUgY29kZSBoYW5kbGVzIGl0IGZpbmUsIGJ1dCBzdGlsbCB0aGUg ZmxvdyBkb2Vzbid0IGZlZWwgCmNsZWFuLiBOb3QgYSBibG9ja2VyLgoKPiArCQlscmNfZGVzdHJv eShrcmVmKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyoKPiArCSAqIFdlIGhhdmUgdG8g YWNxdWlyZSB0aGUgY29udGV4dCBzcGlubG9jayBhbmQgY2hlY2sgZ3VjX2lkIGFnYWluLCBpZiBp dAo+ICsJICogaXMgdmFsaWQgaXQgaGFzbid0IGJlZW4gc3RvbGVuIGFuZCBuZWVkcyB0byBiZSBk ZXJlZ2lzdGVyZWQuIFdlCj4gKwkgKiBkZWxldGUgdGhpcyBjb250ZXh0IGZyb20gdGhlIGxpc3Qg b2YgdW5waW5uZWQgZ3VjX2lkcyBhdmFpbGFibGUgdG8KPiArCSAqIHN0b2xlIHRvIHNlYWwgYSBy YWNlIHdpdGggZ3VjX2xyY19kZXNjX3BpbigpLiBXaGVuIHRoZSBHMkggQ1RCCj4gKwkgKiByZXR1 cm5zIGluZGljYXRpbmcgdGhpcyBjb250ZXh0IGhhcyBiZWVuIGRlcmVnaXN0ZXJlZCB0aGUgZ3Vj X2lkIGlzCj4gKwkgKiByZXR1cm5lZCB0byB0aGUgcG9vbCBvZiBhdmFpbGFibGUgZ3VjX2lkcy4K PiArCSAqLwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmd1Yy0+Y29udGV4dHNfbG9jaywgZmxhZ3Mp Owo+ICsJaWYgKGNvbnRleHRfZ3VjX2lkX2ludmFsaWQoY2UpKSB7Cj4gKwkJX19yZWxlYXNlX2d1 Y19pZChndWMsIGNlKTsKCkJ1dCBoZXJlIHRoZSBjYWxsIHRvIF9fcmVsZWFzZV9ndWNfaWQgaXMg dW5uZWRlZCwgcmlnaHQ/IHRoZSBjZSBkb2Vzbid0IApvd24gdGhlIElEIGFueW1vcmUgYW5kIGJv dGggdGhlIHN0ZWFsIGFuZCB0aGUgcmVsZWFzZSBmdW5jdGlvbiBhbHJlYWR5IApjbGVhbiBjZS0+ Z3VjX2lkX2xpbmssIHNvIHRoZXJlIHNob3VsZCBiZSBub3RoaW5nIGxlZnQgdG8gY2xlYW4uCgo+ ICsJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1Yy0+Y29udGV4dHNfbG9jaywgZmxhZ3MpOwo+ ICsJCWxyY19kZXN0cm95KGtyZWYpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlpZiAoIWxp c3RfZW1wdHkoJmNlLT5ndWNfaWRfbGluaykpCj4gKwkJbGlzdF9kZWxfaW5pdCgmY2UtPmd1Y19p ZF9saW5rKTsKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1Yy0+Y29udGV4dHNfbG9jaywg ZmxhZ3MpOwo+ICsKPiArCS8qCj4gKwkgKiBXZSBkZWZlciBHdUMgY29udGV4dCBkZXJlZ2lzdHJh dGlvbiB1bnRpbCB0aGUgY29udGV4dCBpcyBkZXN0cm95ZWQKPiArCSAqIGluIG9yZGVyIHRvIHNh dmUgb24gQ1RCcy4gV2l0aCB0aGlzIG9wdGltaXphdGlvbiBpZGVhbGx5IHdlIG9ubHkgbmVlZAo+ ICsJICogMSBDVEIgdG8gcmVnaXN0ZXIgdGhlIGNvbnRleHQgZHVyaW5nIHRoZSBmaXJzdCBwaW4g YW5kIDEgQ1RCIHRvCj4gKwkgKiBkZXJlZ2lzdGVyIHRoZSBjb250ZXh0IHdoZW4gdGhlIGNvbnRl eHQgaXMgZGVzdHJveWVkLiBXaXRob3V0IHRoaXMKPiArCSAqIG9wdGltaXphdGlvbiwgYSBDVEIg d291bGQgYmUgbmVlZGVkIGV2ZXJ5IHBpbiAmIHVucGluLgo+ICsJICoKPiArCSAqIFhYWDogTmVl ZCB0byBhY3FpdXJlIHRoZSBydW50aW1lIHdha2VyZWYgYXMgdGhpcyBjYW4gYmUgdHJpZ2dlcmVk Cj4gKwkgKiBmcm9tIGNvbnRleHRfZnJlZV93b3JrZXIgd2hlbiBub3QgcnVudGltZSB3YWtlcmVm IGlzIGhlbGQuCj4gKwkgKiBndWNfbHJjX2Rlc2NfdW5waW4gcmVxdWlyZXMgdGhlIHJ1bnRpbWUg YXMgYSBHdUMgcmVnaXN0ZXIgaXMgd3JpdHRlbgo+ICsJICogaW4gSDJHIENUQiB0byBkZXJlZ2lz dGVyIHRoZSBjb250ZXh0LiBBIGZ1dHVyZSBwYXRjaCBtYXkgZGVmZXIgdGhpcwo+ICsJICogSDJH IENUQiBpZiB0aGUgcnVudGltZSB3YWtlcmVmIGlzIHplcm8uCj4gKwkgKi8KPiArCXdpdGhfaW50 ZWxfcnVudGltZV9wbShydW50aW1lX3BtLCB3YWtlcmVmKQo+ICsJCWd1Y19scmNfZGVzY191bnBp bihjZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZ3VjX2NvbnRleHRfYWxsb2Moc3RydWN0IGlu dGVsX2NvbnRleHQgKmNlKQo+ICt7Cj4gKwlyZXR1cm4gbHJjX2FsbG9jKGNlLCBjZS0+ZW5naW5l KTsKPiArfQo+ICsKPiAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dF9vcHMgZ3Vj X2NvbnRleHRfb3BzID0gewo+ICAgCS5hbGxvYyA9IGd1Y19jb250ZXh0X2FsbG9jLAo+ICAgCj4g ICAJLnByZV9waW4gPSBndWNfY29udGV4dF9wcmVfcGluLAo+ICAgCS5waW4gPSBndWNfY29udGV4 dF9waW4sCj4gLQkudW5waW4gPSBscmNfdW5waW4sCj4gLQkucG9zdF91bnBpbiA9IGxyY19wb3N0 X3VucGluLAo+ICsJLnVucGluID0gZ3VjX2NvbnRleHRfdW5waW4sCj4gKwkucG9zdF91bnBpbiA9 IGd1Y19jb250ZXh0X3Bvc3RfdW5waW4sCj4gICAKPiAgIAkuZW50ZXIgPSBpbnRlbF9jb250ZXh0 X2VudGVyX2VuZ2luZSwKPiAgIAkuZXhpdCA9IGludGVsX2NvbnRleHRfZXhpdF9lbmdpbmUsCj4g ICAKPiAgIAkucmVzZXQgPSBscmNfcmVzZXQsCj4gLQkuZGVzdHJveSA9IGxyY19kZXN0cm95LAo+ ICsJLmRlc3Ryb3kgPSBndWNfY29udGV4dF9kZXN0cm95LAo+ICAgfTsKPiAgIAo+IC1zdGF0aWMg aW50IGd1Y19yZXF1ZXN0X2FsbG9jKHN0cnVjdCBpOTE1X3JlcXVlc3QgKnJlcXVlc3QpCj4gK3N0 YXRpYyBib29sIGNvbnRleHRfbmVlZHNfcmVnaXN0ZXIoc3RydWN0IGludGVsX2NvbnRleHQgKmNl LCBib29sIG5ld19ndWNfaWQpCj4gICB7Cj4gKwlyZXR1cm4gbmV3X2d1Y19pZCB8fCB0ZXN0X2Jp dChDT05URVhUX0xSQ0FfRElSVFksICZjZS0+ZmxhZ3MpIHx8Cj4gKwkJIWxyY19kZXNjX3JlZ2lz dGVyZWQoY2VfdG9fZ3VjKGNlKSwgY2UtPmd1Y19pZCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg Z3VjX3JlcXVlc3RfYWxsb2Moc3RydWN0IGk5MTVfcmVxdWVzdCAqcnEpCj4gK3sKPiArCXN0cnVj dCBpbnRlbF9jb250ZXh0ICpjZSA9IHJxLT5jb250ZXh0Owo+ICsJc3RydWN0IGludGVsX2d1YyAq Z3VjID0gY2VfdG9fZ3VjKGNlKTsKPiAgIAlpbnQgcmV0Owo+ICAgCj4gLQlHRU1fQlVHX09OKCFp bnRlbF9jb250ZXh0X2lzX3Bpbm5lZChyZXF1ZXN0LT5jb250ZXh0KSk7Cj4gKwlHRU1fQlVHX09O KCFpbnRlbF9jb250ZXh0X2lzX3Bpbm5lZChycS0+Y29udGV4dCkpOwo+ICAgCj4gICAJLyoKPiAg IAkgKiBGbHVzaCBlbm91Z2ggc3BhY2UgdG8gcmVkdWNlIHRoZSBsaWtlbGlob29kIG9mIHdhaXRp bmcgYWZ0ZXIKPiAgIAkgKiB3ZSBzdGFydCBidWlsZGluZyB0aGUgcmVxdWVzdCAtIGluIHdoaWNo IGNhc2Ugd2Ugd2lsbCBqdXN0Cj4gICAJICogaGF2ZSB0byByZXBlYXQgd29yay4KPiAgIAkgKi8K PiAtCXJlcXVlc3QtPnJlc2VydmVkX3NwYWNlICs9IEdVQ19SRVFVRVNUX1NJWkU7Cj4gKwlycS0+ cmVzZXJ2ZWRfc3BhY2UgKz0gR1VDX1JFUVVFU1RfU0laRTsKPiAgIAo+ICAgCS8qCj4gICAJICog Tm90ZSB0aGF0IGFmdGVyIHRoaXMgcG9pbnQsIHdlIGhhdmUgY29tbWl0dGVkIHRvIHVzaW5nCj4g QEAgLTQ4Myw1NiArOTU2LDQ3IEBAIHN0YXRpYyBpbnQgZ3VjX3JlcXVlc3RfYWxsb2Moc3RydWN0 IGk5MTVfcmVxdWVzdCAqcmVxdWVzdCkKPiAgIAkgKi8KPiAgIAo+ICAgCS8qIFVuY29uZGl0aW9u YWxseSBpbnZhbGlkYXRlIEdQVSBjYWNoZXMgYW5kIFRMQnMuICovCj4gLQlyZXQgPSByZXF1ZXN0 LT5lbmdpbmUtPmVtaXRfZmx1c2gocmVxdWVzdCwgRU1JVF9JTlZBTElEQVRFKTsKPiArCXJldCA9 IHJxLT5lbmdpbmUtPmVtaXRfZmx1c2gocnEsIEVNSVRfSU5WQUxJREFURSk7Cj4gICAJaWYgKHJl dCkKPiAgIAkJcmV0dXJuIHJldDsKPiAgIAo+IC0JcmVxdWVzdC0+cmVzZXJ2ZWRfc3BhY2UgLT0g R1VDX1JFUVVFU1RfU0laRTsKPiAtCXJldHVybiAwOwo+IC19Cj4gKwlycS0+cmVzZXJ2ZWRfc3Bh Y2UgLT0gR1VDX1JFUVVFU1RfU0laRTsKPiAgIAo+IC1zdGF0aWMgaW5saW5lIHZvaWQgcXVldWVf cmVxdWVzdChzdHJ1Y3QgaTkxNV9zY2hlZF9lbmdpbmUgKnNjaGVkX2VuZ2luZSwKPiAtCQkJCSBz dHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSwKPiAtCQkJCSBpbnQgcHJpbykKPiAtewo+IC0JR0VNX0JV R19PTighbGlzdF9lbXB0eSgmcnEtPnNjaGVkLmxpbmspKTsKPiAtCWxpc3RfYWRkX3RhaWwoJnJx LT5zY2hlZC5saW5rLAo+IC0JCSAgICAgIGk5MTVfc2NoZWRfbG9va3VwX3ByaW9saXN0KHNjaGVk X2VuZ2luZSwgcHJpbykpOwo+IC0Jc2V0X2JpdChJOTE1X0ZFTkNFX0ZMQUdfUFFVRVVFLCAmcnEt PmZlbmNlLmZsYWdzKTsKPiAtfQo+IC0KPiAtc3RhdGljIGludCBndWNfYnlwYXNzX3Rhc2tsZXRf c3VibWl0KHN0cnVjdCBpbnRlbF9ndWMgKmd1YywKPiAtCQkJCSAgICAgc3RydWN0IGk5MTVfcmVx dWVzdCAqcnEpCj4gLXsKPiAtCWludCByZXQ7Cj4gLQo+IC0JX19pOTE1X3JlcXVlc3Rfc3VibWl0 KHJxKTsKPiAtCj4gLQl0cmFjZV9pOTE1X3JlcXVlc3RfaW4ocnEsIDApOwo+IC0KPiAtCWd1Y19z ZXRfbHJjX3RhaWwocnEpOwo+IC0JcmV0ID0gZ3VjX2FkZF9yZXF1ZXN0KGd1YywgcnEpOwo+IC0J aWYgKHJldCA9PSAtRUJVU1kpCj4gLQkJZ3VjLT5zdGFsbGVkX3JlcXVlc3QgPSBycTsKPiAtCj4g LQlyZXR1cm4gcmV0Owo+IC19Cj4gLQo+IC1zdGF0aWMgdm9pZCBndWNfc3VibWl0X3JlcXVlc3Qo c3RydWN0IGk5MTVfcmVxdWVzdCAqcnEpCj4gLXsKPiAtCXN0cnVjdCBpOTE1X3NjaGVkX2VuZ2lu ZSAqc2NoZWRfZW5naW5lID0gcnEtPmVuZ2luZS0+c2NoZWRfZW5naW5lOwo+IC0Jc3RydWN0IGlu dGVsX2d1YyAqZ3VjID0gJnJxLT5lbmdpbmUtPmd0LT51Yy5ndWM7Cj4gLQl1bnNpZ25lZCBsb25n IGZsYWdzOwo+ICsJLyoKPiArCSAqIENhbGwgcGluX2d1Y19pZCBoZXJlIHJhdGhlciB0aGFuIGlu IHRoZSBwaW5uaW5nIHN0ZXAgYXMgd2l0aAo+ICsJICogZG1hX3Jlc3YsIGNvbnRleHRzIGNhbiBi ZSByZXBlYXRlZGx5IHBpbm5lZCAvIHVucGlubmVkIHRyYXNoaW5nIHRoZQo+ICsJICogZ3VjX2lk cyBhbmQgY3JlYXRpbmcgaG9ycmlibGUgcmFjZSBjb25kaXRpb25zLiBUaGlzIGlzIGVzcGVjaWFs bHkgYmFkCj4gKwkgKiB3aGVuIGd1Y19pZHMgYXJlIGJlaW5nIHN0b2xlbiBkdWUgdG8gb3ZlciBz dWJzY3JpcHRpb24uIEJ5IHRoZSB0aW1lCj4gKwkgKiB0aGlzIGZ1bmN0aW9uIGlzIHJlYWNoZWQs IGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgZ3VjX2lkIHdpbGwgYmUKPiArCSAqIHBlcnNpc3Rl bnQgdW50aWwgdGhlIGdlbmVyYXRlZCByZXF1ZXN0IGlzIHJldGlyZWQuIFRodXMsIHNlYWxpbmcg dGhlc2UKPiArCSAqIHJhY2UgY29uZGl0aW9ucy4gSXQgaXMgc3RpbGwgc2FmZSB0byBmYWlsIGhl cmUgaWYgZ3VjX2lkcyBhcmUKPiArCSAqIGV4aGF1c3RlZCBhbmQgcmV0dXJuIC1FQUdBSU4gdG8g dGhlIHVzZXIgaW5kaWNhdGluZyB0aGF0IHRoZXkgY2FuIHRyeQo+ICsJICogYWdhaW4gaW4gdGhl IGZ1dHVyZS4KPiArCSAqCj4gKwkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIGxvY2sgaGVyZSBh cyB0aGUgdGltZWxpbmUgbXV0ZXggZW5zdXJlcyBhdAo+ICsJICogbW9zdCBvbmUgY29udGV4dCBj YW4gYmUgZXhlY3V0aW5nIHRoaXMgY29kZSBwYXRoIGF0IG9uY2UuIFRoZQo+ICsJICogZ3VjX2lk X3JlZiBpcyBpbmNyZW1lbnRlZCBvbmNlIGZvciBldmVyeSByZXF1ZXN0IGluIGZsaWdodCBhbmQK PiArCSAqIGRlY3JlbWVudGVkIG9uIGVhY2ggcmV0aXJlLiBXaGVuIGl0IGlzIHplcm8sIGEgbG9j ayBhcm91bmQgdGhlCj4gKwkgKiBpbmNyZW1lbnQgKGluIHBpbl9ndWNfaWQpIGlzIG5lZWRlZCB0 byBzZWFsIGEgcmFjZSB3aXRoIHVucGluX2d1Y19pZC4KPiArCSAqLwo+ICsJaWYgKGF0b21pY19h ZGRfdW5sZXNzKCZjZS0+Z3VjX2lkX3JlZiwgMSwgMCkpCj4gKwkJcmV0dXJuIDA7Cj4gICAKPiAt CS8qIFdpbGwgYmUgY2FsbGVkIGZyb20gaXJxLWNvbnRleHQgd2hlbiB1c2luZyBmb3JlaWduIGZl bmNlcy4gKi8KPiAtCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hlZF9lbmdpbmUtPmxvY2ssIGZsYWdz KTsKPiArCXJldCA9IHBpbl9ndWNfaWQoZ3VjLCBjZSk7CS8qIHJldHVybnMgMSBpZiBuZXcgZ3Vj X2lkIGFzc2lnbmVkICovCj4gKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCj4gKwkJcmV0dXJuIHJl dDs7Cgp0eXBvICI7OyIKCj4gKwlpZiAoY29udGV4dF9uZWVkc19yZWdpc3RlcihjZSwgISFyZXQp KSB7Cj4gKwkJcmV0ID0gZ3VjX2xyY19kZXNjX3BpbihjZSk7Cj4gKwkJaWYgKHVubGlrZWx5KHJl dCkpIHsJLyogdW53aW5kICovCj4gKwkJCWF0b21pY19kZWMoJmNlLT5ndWNfaWRfcmVmKTsKPiAr CQkJdW5waW5fZ3VjX2lkKGd1YywgY2UpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiArCX0K PiAgIAo+IC0JaWYgKGd1Yy0+c3RhbGxlZF9yZXF1ZXN0IHx8ICFpOTE1X3NjaGVkX2VuZ2luZV9p c19lbXB0eShzY2hlZF9lbmdpbmUpKQo+IC0JCXF1ZXVlX3JlcXVlc3Qoc2NoZWRfZW5naW5lLCBy cSwgcnFfcHJpbyhycSkpOwo+IC0JZWxzZSBpZiAoZ3VjX2J5cGFzc190YXNrbGV0X3N1Ym1pdChn dWMsIHJxKSA9PSAtRUJVU1kpCj4gLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmc2NoZWRfZW5naW5l LT50YXNrbGV0KTsKPiArCWNsZWFyX2JpdChDT05URVhUX0xSQ0FfRElSVFksICZjZS0+ZmxhZ3Mp OwoKCk1pZ2h0IGJlIHdvcnRoIG1vdmluZyB0aGUgcGlubmluZyB0byBhIHNlcGFyYXRlIGZ1bmN0 aW9uIHRvIGtlZXAgdGhlIApyZXF1ZXN0X2FsbG9jIGZvY3VzZWQgb24gdGhlIHJlcXVlc3QuIENh biBiZSBkb25lIGFzIGEgZm9sbG93IHVwLgoKPiAgIAo+IC0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmc2NoZWRfZW5naW5lLT5sb2NrLCBmbGFncyk7Cj4gKwlyZXR1cm4gMDsKPiAgIH0KPiAgIAo+ ICAgc3RhdGljIHZvaWQgc2FuaXRpemVfaHdzcChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUpCj4gQEAgLTYwNiw2ICsxMDcwLDQ2IEBAIHN0YXRpYyB2b2lkIGd1Y19zZXRfZGVmYXVsdF9z dWJtaXNzaW9uKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKPiAgIAllbmdpbmUtPnN1 Ym1pdF9yZXF1ZXN0ID0gZ3VjX3N1Ym1pdF9yZXF1ZXN0Owo+ICAgfQo+ICAgCj4gK3N0YXRpYyBp bmxpbmUgdm9pZCBndWNfa2VybmVsX2NvbnRleHRfcGluKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywK PiArCQkJCQkgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKPiArewo+ICsJaWYgKGNvbnRleHRf Z3VjX2lkX2ludmFsaWQoY2UpKQo+ICsJCXBpbl9ndWNfaWQoZ3VjLCBjZSk7Cj4gKwlndWNfbHJj X2Rlc2NfcGluKGNlKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIGd1Y19pbml0X2xy Y19tYXBwaW5nKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPiArewo+ICsJc3RydWN0IGludGVsX2d0 ICpndCA9IGd1Y190b19ndChndWMpOwo+ICsJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l Owo+ICsJZW51bSBpbnRlbF9lbmdpbmVfaWQgaWQ7Cj4gKwo+ICsJLyogbWFrZSBzdXJlIGFsbCBk ZXNjcmlwdG9ycyBhcmUgY2xlYW4uLi4gKi8KPiArCXhhX2Rlc3Ryb3koJmd1Yy0+Y29udGV4dF9s b29rdXApOwo+ICsKPiArCS8qCj4gKwkgKiBTb21lIGNvbnRleHRzIG1pZ2h0IGhhdmUgYmVlbiBw aW5uZWQgYmVmb3JlIHdlIGVuYWJsZWQgR3VDCj4gKwkgKiBzdWJtaXNzaW9uLCBzbyB3ZSBuZWVk IHRvIGFkZCB0aGVtIHRvIHRoZSBHdUMgYm9va2VlcGluZy4KPiArCSAqIEFsc28sIGFmdGVyIGEg cmVzZXQgdGhlIEd1QyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbmZvcm1hdGlvbgo+ ICsJICogc2hhcmVkIHdpdGggR3VDIGlzIHByb3Blcmx5IHJlc2V0LiBUaGUga2VybmVsIGxyY3Mg YXJlIG5vdCBhdHRhY2hlZAo+ICsJICogdG8gdGhlIGdlbV9jb250ZXh0LCBzbyB0aGV5IG5lZWQg dG8gYmUgYWRkZWQgc2VwYXJhdGVseS4KPiArCSAqCj4gKwkgKiBOb3RlOiB3ZSBwdXJwb3NlbHkg ZG8gbm90IGNoZWNrIHRoZSBlcnJvciByZXR1cm4gb2YKPiArCSAqIGd1Y19scmNfZGVzY19waW4s IGJlY2F1c2UgdGhhdCBmdW5jdGlvbiBjYW4gb25seSBmYWlsIGluIHR3byBjYXNlcy4KPiArCSAq IE9uZSwgaWYgdGhlcmUgYXJlbid0IGVub3VnaCBmcmVlIElEcywgYnV0IHdlJ3JlIGd1YXJhbnRl ZWQgdG8gaGF2ZQo+ICsJICogZW5vdWdoIGhlcmUgKHdlJ3JlIGVpdGhlciBvbmx5IHBpbm5pbmcg YSBoYW5kZnVsIG9mIGxyYyBvbiBmaXJzdCBib290Cj4gKwkgKiBvciB3ZSdyZSByZS1waW5uaW5n IGxyY3MgdGhhdCB3ZXJlIGFscmVhZHkgcGlubmVkIGJlZm9yZSB0aGUgcmVzZXQpLgo+ICsJICog VHdvLCBpZiB0aGUgR3VDIGhhcyBkaWVkIGFuZCBDVEJzIGNhbid0IG1ha2UgZm9yd2FyZCBwcm9n cmVzcy4KPiArCSAqIFByZXN1bWFibHksIHRoZSBHdUMgc2hvdWxkIGJlIGFsaXZlIGFzIHRoaXMg ZnVuY3Rpb24gaXMgY2FsbGVkIG9uCj4gKwkgKiBkcml2ZXIgbG9hZCBvciBhZnRlciBhIHJlc2V0 LiBFdmVuIGlmIGl0IGlzIGRlYWQsIGFub3RoZXIgZnVsbCBHUFUKPiArCSAqIHJlc2V0IHdpbGwg YmUgdHJpZ2dlcmVkIGFuZCB0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIGNhbGxlZCBhZ2Fpbi4KPiAr CSAqLwo+ICsKPiArCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGd0LCBpZCkKPiArCQlpZiAoZW5n aW5lLT5rZXJuZWxfY29udGV4dCkKPiArCQkJZ3VjX2tlcm5lbF9jb250ZXh0X3BpbihndWMsIGVu Z2luZS0+a2VybmVsX2NvbnRleHQpOwo+ICt9Cj4gKwo+ICAgc3RhdGljIHZvaWQgZ3VjX3JlbGVh c2Uoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQo+ICAgewo+ICAgCWVuZ2luZS0+c2Fu aXRpemUgPSBOVUxMOyAvKiBubyBsb25nZXIgaW4gY29udHJvbCwgbm90aGluZyB0byBzYW5pdGl6 ZSAqLwo+IEBAIC03MTgsNiArMTIyMiw3IEBAIGludCBpbnRlbF9ndWNfc3VibWlzc2lvbl9zZXR1 cChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCj4gICAKPiAgIHZvaWQgaW50ZWxfZ3Vj X3N1Ym1pc3Npb25fZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPiAgIHsKPiArCWd1Y19p bml0X2xyY19tYXBwaW5nKGd1Yyk7Cj4gICB9Cj4gICAKPiAgIHZvaWQgaW50ZWxfZ3VjX3N1Ym1p c3Npb25fZGlzYWJsZShzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpCj4gQEAgLTc0MywzICsxMjQ4LDYy IEBAIHZvaWQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25faW5pdF9lYXJseShzdHJ1Y3QgaW50ZWxfZ3Vj ICpndWMpCj4gICB7Cj4gICAJZ3VjLT5zdWJtaXNzaW9uX3NlbGVjdGVkID0gX19ndWNfc3VibWlz c2lvbl9zZWxlY3RlZChndWMpOwo+ICAgfQo+ICsKPiArc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50 ZWxfY29udGV4dCAqCj4gK2cyaF9jb250ZXh0X2xvb2t1cChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMs IHUzMiBkZXNjX2lkeCkKPiArewo+ICsJc3RydWN0IGludGVsX2NvbnRleHQgKmNlOwo+ICsKPiAr CWlmICh1bmxpa2VseShkZXNjX2lkeCA+PSBHVUNfTUFYX0xSQ19ERVNDUklQVE9SUykpIHsKPiAr CQlkcm1fZGJnKCZndWNfdG9fZ3QoZ3VjKS0+aTkxNS0+ZHJtLAo+ICsJCQkiSW52YWxpZCBkZXNj X2lkeCAldSIsIGRlc2NfaWR4KTsKPiArCQlyZXR1cm4gTlVMTDsKPiArCX0KPiArCj4gKwljZSA9 IF9fZ2V0X2NvbnRleHQoZ3VjLCBkZXNjX2lkeCk7Cj4gKwlpZiAodW5saWtlbHkoIWNlKSkgewo+ ICsJCWRybV9kYmcoJmd1Y190b19ndChndWMpLT5pOTE1LT5kcm0sCj4gKwkJCSJDb250ZXh0IGlz IE5VTEwsIGRlc2NfaWR4ICV1IiwgZGVzY19pZHgpOwo+ICsJCXJldHVybiBOVUxMOwo+ICsJfQo+ ICsKPiArCXJldHVybiBjZTsKPiArfQo+ICsKPiAraW50IGludGVsX2d1Y19kZXJlZ2lzdGVyX2Rv bmVfcHJvY2Vzc19tc2coc3RydWN0IGludGVsX2d1YyAqZ3VjLAo+ICsJCQkJCSAgY29uc3QgdTMy ICptc2csCj4gKwkJCQkJICB1MzIgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAq Y2U7Cj4gKwl1MzIgZGVzY19pZHggPSBtc2dbMF07Cj4gKwo+ICsJaWYgKHVubGlrZWx5KGxlbiA8 IDEpKSB7Cj4gKwkJZHJtX2RiZygmZ3VjX3RvX2d0KGd1YyktPmk5MTUtPmRybSwgIkludmFsaWQg bGVuZ3RoICV1IiwgbGVuKTsKPiArCQlyZXR1cm4gLUVQUk9UTzsKPiArCX0KPiArCj4gKwljZSA9 IGcyaF9jb250ZXh0X2xvb2t1cChndWMsIGRlc2NfaWR4KTsKPiArCWlmICh1bmxpa2VseSghY2Up KQo+ICsJCXJldHVybiAtRVBST1RPOwo+ICsKPiArCWlmIChjb250ZXh0X3dhaXRfZm9yX2RlcmVn aXN0ZXJfdG9fcmVnaXN0ZXIoY2UpKSB7Cj4gKwkJc3RydWN0IGludGVsX3J1bnRpbWVfcG0gKnJ1 bnRpbWVfcG0gPQo+ICsJCQkmY2UtPmVuZ2luZS0+Z3QtPmk5MTUtPnJ1bnRpbWVfcG07Cj4gKwkJ aW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Cj4gKwo+ICsJCS8qCj4gKwkJICogUHJldmlvdXMgb3du ZXIgb2YgdGhpcyBndWNfaWQgaGFzIGJlZW4gZGVyZWdpc3RlcmVkLCBub3cgc2FmZQo+ICsJCSAq IHJlZ2lzdGVyIHRoaXMgY29udGV4dC4KPiArCQkgKi8KPiArCQl3aXRoX2ludGVsX3J1bnRpbWVf cG0ocnVudGltZV9wbSwgd2FrZXJlZikKPiArCQkJcmVnaXN0ZXJfY29udGV4dChjZSk7Cj4gKwkJ Y2xyX2NvbnRleHRfd2FpdF9mb3JfZGVyZWdpc3Rlcl90b19yZWdpc3RlcihjZSk7Cj4gKwkJaW50 ZWxfY29udGV4dF9wdXQoY2UpOwo+ICsJfSBlbHNlIGlmIChjb250ZXh0X2Rlc3Ryb3llZChjZSkp IHsKPiArCQkvKiBDb250ZXh0IGhhcyBiZWVuIGRlc3Ryb3llZCAqLwo+ICsJCXJlbGVhc2VfZ3Vj X2lkKGd1YywgY2UpOwo+ICsJCWxyY19kZXN0cm95KCZjZS0+cmVmKTsKPiArCX0KPiArCj4gKwly ZXR1cm4gMDsKPiArfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3Jl Zy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAo+IGluZGV4IDk0M2ZlNDg1YzY2 Mi4uMjA0Yzk1YzM5MzUzIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf cmVnLmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCj4gQEAgLTQxNDIs NiArNDE0Miw3IEBAIGVudW0gewo+ICAgCUZBVUxUX0FORF9DT05USU5VRSAvKiBVbnN1cHBvcnRl ZCAqLwo+ICAgfTsKPiAgIAo+ICsjZGVmaW5lIENUWF9HVFRfQUREUkVTU19NQVNLIEdFTk1BU0so MzEsIDEyKQo+ICAgI2RlZmluZSBHRU44X0NUWF9WQUxJRCAoMSA8PCAwKQo+ICAgI2RlZmluZSBH RU44X0NUWF9GT1JDRV9QRF9SRVNUT1JFICgxIDw8IDEpCj4gICAjZGVmaW5lIEdFTjhfQ1RYX0ZP UkNFX1JFU1RPUkUgKDEgPDwgMikKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9yZXF1ZXN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlcXVlc3QuYwo+IGlu ZGV4IDg2YjRjOWYyNjEzZC4uYjQ4YzQ5MDVkM2ZjIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfcmVxdWVzdC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9yZXF1ZXN0LmMKPiBAQCAtNDA3LDYgKzQwNyw3IEBAIGJvb2wgaTkxNV9yZXF1ZXN0X3JldGly ZShzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKPiAgIAkgKi8KPiAgIAlpZiAoIWxpc3RfZW1wdHko JnJxLT5zY2hlZC5saW5rKSkKPiAgIAkJcmVtb3ZlX2Zyb21fZW5naW5lKHJxKTsKPiArCWF0b21p Y19kZWMoJnJxLT5jb250ZXh0LT5ndWNfaWRfcmVmKTsKCkRvZXMgdGhpcyB3b3JrL21ha2Ugc2Vu c2XCoCBpZiBHdUMgaXMgZGlzYWJsZWQ/CgpEYW5pZWxlCgo+ICAgCUdFTV9CVUdfT04oIWxsaXN0 X2VtcHR5KCZycS0+ZXhlY3V0ZV9jYikpOwo+ICAgCj4gICAJX19saXN0X2RlbF9lbnRyeSgmcnEt PmxpbmspOyAvKiBwb2lzb24gbmVpdGhlciBwcmV2L25leHQgKFJDVSB3YWxrcykgKi8KCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWls aW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=