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.3 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, 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 CFD1BC12002 for ; Thu, 15 Jul 2021 01:21:37 +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 815AA6115A for ; Thu, 15 Jul 2021 01:21:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 815AA6115A 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 09AF16E4A1; Thu, 15 Jul 2021 01:21:37 +0000 (UTC) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id E9EC16E4A1; Thu, 15 Jul 2021 01:21:35 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10045"; a="210498026" X-IronPort-AV: E=Sophos;i="5.84,240,1620716400"; d="scan'208";a="210498026" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jul 2021 18:21:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,240,1620716400"; d="scan'208";a="494814403" Received: from orsmsx605.amr.corp.intel.com ([10.22.229.18]) by FMSMGA003.fm.intel.com with ESMTP; 14 Jul 2021 18:21:34 -0700 Received: from orsmsx606.amr.corp.intel.com (10.22.229.19) by ORSMSX605.amr.corp.intel.com (10.22.229.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Wed, 14 Jul 2021 18:21:34 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) 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 via Frontend Transport; Wed, 14 Jul 2021 18:21:34 -0700 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (104.47.57.49) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.10; Wed, 14 Jul 2021 18:21:33 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mQybyBuJ/4eXYTFxrsMydqlwid7fkBh1sGFSMrDCkY2XlsT8/X38rjRhqfRiPw8NzKhlxT6LEkW42bHHnVlpTH2trBF5Ecqt7xhhAgppF1124UAXPOytcrUG8y4Sj+FCKS+LZcurhEWNJu3uNKdDQmolmEep1Qz7Cbv0kDHgEz+/h3ZqFyAdHoyNNGcYEBXmPDH1tCgrtF+J9D8eIlIiNj8WAxsjNMJLZPyWL1zYYPMT2j56XC0/T2Uq9cSuPRJmmZvcFOJZdXudEYbqwvajSoRtiM6L3AyOGGRLmmHbCxnSKfgLdnvgzH2Eiqjr2onAjLxah+8OprfBgYReE8a+0w== 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=c1U1etAg9hLEIc+MQPRdohyquYCxAns458HV0zig+4s=; b=aBQSE+OROaWvGrQr1LGnpjMlOCnrRRRhCanIOUdsl7lpC2UZGKygq11CHhgQ6DhpwwvVyreSGATtGCLZCFJ62r+Y2uaY9eEZSdVS8Mx1QDm72xE1khYKxPVciMwqvLgRVBknQhvFi5Kw12gi7GN7vwy8QJR/9tjNjPIbo/lsSxT4efTtUom9ze6M7H8DYOxFSDCAN8VCuJKhqY8it9WHZFHXpmZC9mhzVW89DutoKLHUm4+Q7vWKPKw0ZDZtV3zRchdmV3W8gV+VWHsWpfhHm6YFEfgNBhQePCXN/Rhy60w8WHUfy4p9LAh+0Rqk3zf3xQQPdUFP4OIbqu2g/8jjYQ== 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=c1U1etAg9hLEIc+MQPRdohyquYCxAns458HV0zig+4s=; b=YeyU0+4qKce7C9xva5ZFWsLSxDdWGpa3xJB+Qvrp06sRf58KNCG7XCd/6t+WWkNawSFXwmRCyZuoyVsVgsBY156GY0+ZYXjYtiuoYrvjFv2INHNAIuicyREs0sMjWEFdrZRZVbVe4N30vttRZ1/BmqBXOEdSjhcHiAM6LjwZRfA= 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 DM4PR11MB5488.namprd11.prod.outlook.com (2603:10b6:5:39d::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.22; Thu, 15 Jul 2021 01:21:27 +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.022; Thu, 15 Jul 2021 01:21:27 +0000 Subject: Re: [PATCH 26/47] drm/i915/guc: GuC virtual engines To: Matthew Brost , , References: <20210624070516.21893-1-matthew.brost@intel.com> <20210624070516.21893-27-matthew.brost@intel.com> From: Daniele Ceraolo Spurio Message-ID: <95eba0f3-3710-da4b-5cad-5a6c21e46ca2@intel.com> Date: Wed, 14 Jul 2021 18:21:24 -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: <20210624070516.21893-27-matthew.brost@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-ClientProxiedBy: SJ0PR03CA0324.namprd03.prod.outlook.com (2603:10b6:a03:39d::29) 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 SJ0PR03CA0324.namprd03.prod.outlook.com (2603:10b6:a03:39d::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.21 via Frontend Transport; Thu, 15 Jul 2021 01:21:26 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a6a3dde7-2cbc-4086-26a2-08d9472eddd4 X-MS-TrafficTypeDiagnostic: DM4PR11MB5488: 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: lq3BK1HEyjRWme9nG7gFoqKaJKBs0/4M9CSlMo9OByZ7VmosA0YkKkSHwNEecZMNxaw9V79/3bzE0v0RO8azCxCibO+/vGS6v+L17V45g1dOs6BbNrSynNtpi7Es4aUrk8tV8fxORjyEnXgWoCZILAGLqMXyW/EbVQKefX8dPEEVKQldcjRc048jstkcT4gE/RSK0xbG3/PK88owkOC4JXbAWFfIZtyiJYdlxYAAQSBlgPtIanCfAB5718Xa0Qou2oZU0pbnO1wdX8ZOn8U5F0nLL05CGa4crw/HLcW6yKpKP61fo8aXhpDJ/98B+Fm4OwYixguktgMV+6kCQtWn7vqzyGiJ8lF/50cCnVmZpVgWaTWJQ7kS2py1Iy7k/wvgDX7XCdqRqGOnzitPWEDbK5Bu44ZOuuh1U6PpEV1njvF9VGnjyUVNHQNomZA4EHgfmDTS3on5Nzpkp5z6APojV1XxPmHcRqjXTbs97iLS65eLZCOuYoBvVkTVxJAC6yGEw5RH5CTC+PJN3e9sYRA6eddVH63PtbW3kZSC+1JjmZTwhT/X/g6Sa1fBCCOIko2Lanklbpu0+oHDnXVLozcDtvUw+40zAlbh4iBTICcE6kGALzpgQwxLU/NEA35gHbY1P6EI2pKo7zmb1fDePAw4MUm/HEFkmtaR/XUmxVGtzEgfJJzPC2DBKDb2Mki3SwfWuIBr/KZhUUIf4tEubIUdpWUuQj1jZiMo6nsd7Mz5SeO3Pc68huTAuxykFb+lbTGeDPJvXbG3kGOD4DM+vgWjiQ== 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)(6486002)(53546011)(26005)(186003)(478600001)(36756003)(8676002)(66476007)(86362001)(66556008)(66946007)(31696002)(16576012)(31686004)(8936002)(4326008)(5660300002)(2906002)(30864003)(316002)(107886003)(83380400001)(956004)(38100700002)(2616005)(450100002)(21314003)(43740500002)(45980500001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?K2dDWWFlVXc0Y0grWndQajE3RDhiNUsxMmxJQklER0NoUngwT2dVczQxYnFt?= =?utf-8?B?NlRSeGRBeTJCS0djQkNWYzRDUk82bjJpUmIwZm54YloyWnM3RDhRMjBCVXNV?= =?utf-8?B?ZXBqRXdMVWxtckdweWNjWXJRSVRuejNST1VJeTdEbThsRzAyYmdmZnpyb1Zi?= =?utf-8?B?SHdYc0s3cGtOL2d2QlBONStPbTlWYm1kUjRWamdHOTZZWkNOSDdhZkFIUnBU?= =?utf-8?B?cWJHeVhDN0JaUTVsWFBha00zNjFVemRHSG9lQTI2c3JQTWxCaFBzS2Z4Umll?= =?utf-8?B?RWcxbStHZlNud3RoOHlXWkxEOGpyVVBLem9jc0xIcmkzVms4VGMyYWk2RkRD?= =?utf-8?B?b0REWFYra09BT3QraVFGUmQ4MHZxWk1WSCtRdFAxV1ErVnBkZXExdTRQR1dQ?= =?utf-8?B?ZjlSSGNnMmpVNjYvVXRvL1IyMVVSQlJKZFM2cFYvWW9xQlNISnhUbVNwZUF5?= =?utf-8?B?OVVxSXNFMW5yZ1R1VUNqcklScWF5YUY2M3YwOXBFSkhpekFLVURPTll6dEZh?= =?utf-8?B?SUJVMFAwaFZpd0IxdXhPS2V4WWFSN0pMam1QOU9DOWJtZWNSUjdZRWdMc3RZ?= =?utf-8?B?dkVFWHpES052QnNtVXo1bGtFWG02RHdUOG9FMFlSdTlRYUtRaXNZRGJjZENM?= =?utf-8?B?S0lnWktncndiMkF2WStST1B5Nm5QTVhLaGR0bDZnNURNaVpnYTFEQVAyaThw?= =?utf-8?B?NnpkRC8yRXFBeDIzSkN4SzVBaUdUelphVFNIN3d2ZEMwZmlabnpoTzI3NVMx?= =?utf-8?B?L0pBdGN1MkVWdUIvakFueEkzZkZWZWJjdHNka0g3cjBjVTFGODlKVEtIWjR3?= =?utf-8?B?cXV1dmkwL1dNdXZVYm1ZTmZnRnJDcGJCWFJCWkx0YUlzR3ZMczJYNGN0Rmkv?= =?utf-8?B?Mk9wYnBTaVdJaUhHQktFRkRwMllGYkdHQVZnL0orVFBPOXhGU1I0dkRGYkpR?= =?utf-8?B?YlJjYmZiQ204eUFZTEo0ZzJQMFVuWE1iS0RkaXZOeEpmYVRDSjhVTlBVckFC?= =?utf-8?B?bnRnaTV3SUVGdklRd1duOTV6allzRkErMDQwK3JZWVoyR0EvdzgzeUFyU2F4?= =?utf-8?B?WFJERnFWZlI0eE1oRDQrZFovbGFxTHNZWEhqakkwYnZ6MFJtTnkveVhZVGJQ?= =?utf-8?B?di9sMTNPdzJKdTZXRGIxUm44OEdQQzZ1WUpEcENDeWR5Q0I2MHVBcmpWRy9Q?= =?utf-8?B?WTNndGw1bzlJS0ZpY3Q0S0hEMnZtcFRuVDNobXE0RlpWUkphRWprWXo0YTd0?= =?utf-8?B?N1UwSnVjTmQrN1FiT2E3Q0w2QkwyK1NsTGZrTkNYMjdKcGlaNE5LRzJrNlNQ?= =?utf-8?B?SWtudDd5L1VSUVpKMGJNelA3a0ZCdmUwTVVpbVpFa1hLZkIrMHBOWHo5WGF3?= =?utf-8?B?WW1KcUo3M2xYYVFjMnJQWVBsQWNHSlY3VFdRalNucUp5Z1hCVkxvYkhISkdu?= =?utf-8?B?WHJKeHg3QUNFTWpKWlBNNFhpS09TWjVrMEZJS0ppcS81L0NMalFQL25VY0pR?= =?utf-8?B?Y1NDTzNLK05wZ1Z1eTl3OW9ORTI0MkJPOWR0ei9PM0dCc1R1aUdxa09zQXEz?= =?utf-8?B?eDJ2ZXN1ZTZFUW82SXRoSHRDczJoMU1DUW5JV0pDdVRSSWRaQ2pJZ2Z1eEpH?= =?utf-8?B?NW5Rb0lvRjc3SEpNZ2c2NlpWWkRWaDNTa0dIMFdCeS9ScWRFaHZCczhtMlRu?= =?utf-8?B?N1lubHJpSnNXQzRFbVZ0YlRrZlNpcXdUQnFxOW13Y0NMUEUxMVg1aUhORWdO?= =?utf-8?Q?PWJ+NJlTDkbF6fD2WtDzX0qyv9qdYiNbvrVk4pM?= X-MS-Exchange-CrossTenant-Network-Message-Id: a6a3dde7-2cbc-4086-26a2-08d9472eddd4 X-MS-Exchange-CrossTenant-AuthSource: DM4PR11MB5488.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Jul 2021 01:21:26.7223 (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: PLztLtpRGmRX1pSrHNoz8s8dMBffx+o3MCZ5zU9EX/tG2nQpOWAmRJRU0kbU7ESkgIY5mhRQjFRsT99BMx6zk0NL7tBZWvOT5k5Zo1tPJvM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR11MB5488 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 6/24/2021 12:04 AM, Matthew Brost wrote: > Implement GuC virtual engines. Rather simple implementation, basically > just allocate an engine, setup context enter / exit function to virtual > engine specific functions, set all other variables / functions to guc > versions, and set the engine mask to that of all the siblings. > > Cc: Daniele Ceraolo Spurio > Signed-off-by: Matthew Brost > --- > drivers/gpu/drm/i915/gem/i915_gem_context.c | 19 +- > drivers/gpu/drm/i915/gem/i915_gem_context.h | 1 + > drivers/gpu/drm/i915/gt/intel_context_types.h | 10 + > drivers/gpu/drm/i915/gt/intel_engine.h | 45 +++- > drivers/gpu/drm/i915/gt/intel_engine_cs.c | 14 + > .../drm/i915/gt/intel_execlists_submission.c | 186 +++++++------ > .../drm/i915/gt/intel_execlists_submission.h | 11 - > drivers/gpu/drm/i915/gt/selftest_execlists.c | 20 +- > .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 253 +++++++++++++++++- > .../gpu/drm/i915/gt/uc/intel_guc_submission.h | 2 + > 10 files changed, 429 insertions(+), 132 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c > index 5c07e6abf16a..8a9293e0ca92 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c > @@ -72,7 +72,6 @@ > #include "gt/intel_context_param.h" > #include "gt/intel_engine_heartbeat.h" > #include "gt/intel_engine_user.h" > -#include "gt/intel_execlists_submission.h" /* virtual_engine */ > #include "gt/intel_gpu_commands.h" > #include "gt/intel_ring.h" > > @@ -1568,9 +1567,6 @@ set_engines__load_balance(struct i915_user_extension __user *base, void *data) > if (!HAS_EXECLISTS(i915)) > return -ENODEV; > > - if (intel_uc_uses_guc_submission(&i915->gt.uc)) > - return -ENODEV; /* not implement yet */ > - > if (get_user(idx, &ext->engine_index)) > return -EFAULT; > > @@ -1627,7 +1623,7 @@ set_engines__load_balance(struct i915_user_extension __user *base, void *data) > } > } > > - ce = intel_execlists_create_virtual(siblings, n); > + ce = intel_engine_create_virtual(siblings, n); > if (IS_ERR(ce)) { > err = PTR_ERR(ce); > goto out_siblings; > @@ -1723,13 +1719,9 @@ set_engines__bond(struct i915_user_extension __user *base, void *data) > * A non-virtual engine has no siblings to choose between; and > * a submit fence will always be directed to the one engine. > */ > - if (intel_engine_is_virtual(virtual)) { > - err = intel_virtual_engine_attach_bond(virtual, > - master, > - bond); > - if (err) > - return err; > - } > + err = intel_engine_attach_bond(virtual, master, bond); > + if (err) > + return err; > } > > return 0; > @@ -2116,8 +2108,7 @@ static int clone_engines(struct i915_gem_context *dst, > * the virtual engine instead. > */ > if (intel_engine_is_virtual(engine)) > - clone->engines[n] = > - intel_execlists_clone_virtual(engine); > + clone->engines[n] = intel_engine_clone_virtual(engine); > else > clone->engines[n] = intel_context_create(engine); > if (IS_ERR_OR_NULL(clone->engines[n])) { > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.h b/drivers/gpu/drm/i915/gem/i915_gem_context.h > index b5c908f3f4f2..ba772762f7b9 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_context.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.h > @@ -10,6 +10,7 @@ > #include "i915_gem_context_types.h" > > #include "gt/intel_context.h" > +#include "gt/intel_engine.h" > > #include "i915_drv.h" > #include "i915_gem.h" > diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h b/drivers/gpu/drm/i915/gt/intel_context_types.h > index e7af6a2368f8..6945963a31ba 100644 > --- a/drivers/gpu/drm/i915/gt/intel_context_types.h > +++ b/drivers/gpu/drm/i915/gt/intel_context_types.h > @@ -47,6 +47,16 @@ struct intel_context_ops { > > void (*reset)(struct intel_context *ce); > void (*destroy)(struct kref *kref); > + > + /* virtual engine/context interface */ > + struct intel_context *(*create_virtual)(struct intel_engine_cs **engine, > + unsigned int count); > + struct intel_context *(*clone_virtual)(struct intel_engine_cs *engine); > + struct intel_engine_cs *(*get_sibling)(struct intel_engine_cs *engine, > + unsigned int sibling); > + int (*attach_bond)(struct intel_engine_cs *engine, > + const struct intel_engine_cs *master, > + const struct intel_engine_cs *sibling); Cloning and bonding for VE have been removed, so can be dropped. I'll skip reviewing all the related code in this patch. > }; > > struct intel_context { > diff --git a/drivers/gpu/drm/i915/gt/intel_engine.h b/drivers/gpu/drm/i915/gt/intel_engine.h > index f911c1224ab2..923eaee627b3 100644 > --- a/drivers/gpu/drm/i915/gt/intel_engine.h > +++ b/drivers/gpu/drm/i915/gt/intel_engine.h > @@ -273,13 +273,56 @@ intel_engine_has_preempt_reset(const struct intel_engine_cs *engine) > return intel_engine_has_preemption(engine); > } > > +struct intel_context * > +intel_engine_create_virtual(struct intel_engine_cs **siblings, > + unsigned int count); > + > +static inline bool > +intel_virtual_engine_has_heartbeat(const struct intel_engine_cs *engine) > +{ > + if (intel_engine_uses_guc(engine)) > + return intel_guc_virtual_engine_has_heartbeat(engine); > + else > + GEM_BUG_ON("Only should be called in GuC submission"); > + > + return false; > +} This could use a better explanation. Maybe something like: static inline bool intel_virtual_engine_has_heartbeat(const struct intel_engine_cs *engine) { /* * For non-GuC submission we expect the back-end to look at the * heartbeat status of the actual physical engine that the work * has been (or is being) scheduled on, so we should only reach * here with GuC submission enabled.   */ GEM_BUG_ON(!intel_engine_uses_guc(engine)); return intel_guc_virtual_engine_has_heartbeat(engine); } > + > static inline bool > intel_engine_has_heartbeat(const struct intel_engine_cs *engine) > { > if (!IS_ACTIVE(CONFIG_DRM_I915_HEARTBEAT_INTERVAL)) > return false; > > - return READ_ONCE(engine->props.heartbeat_interval_ms); > + if (intel_engine_is_virtual(engine)) > + return intel_virtual_engine_has_heartbeat(engine); > + else > + return READ_ONCE(engine->props.heartbeat_interval_ms); > +} > + > +static inline struct intel_context * > +intel_engine_clone_virtual(struct intel_engine_cs *src) > +{ > + GEM_BUG_ON(!intel_engine_is_virtual(src)); > + return src->cops->clone_virtual(src); > +} > + > +static inline int > +intel_engine_attach_bond(struct intel_engine_cs *engine, > + const struct intel_engine_cs *master, > + const struct intel_engine_cs *sibling) > +{ > + if (!engine->cops->attach_bond) > + return 0; > + > + return engine->cops->attach_bond(engine, master, sibling); > +} > + > +static inline struct intel_engine_cs * > +intel_engine_get_sibling(struct intel_engine_cs *engine, unsigned int sibling) > +{ > + GEM_BUG_ON(!intel_engine_is_virtual(engine)); > + return engine->cops->get_sibling(engine, sibling); > } > > #endif /* _INTEL_RINGBUFFER_H_ */ > diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c > index 88694822716a..d13b1716c29e 100644 > --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c > +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c > @@ -1736,6 +1736,20 @@ ktime_t intel_engine_get_busy_time(struct intel_engine_cs *engine, ktime_t *now) > return total; > } > > +struct intel_context * > +intel_engine_create_virtual(struct intel_engine_cs **siblings, > + unsigned int count) > +{ > + if (count == 0) > + return ERR_PTR(-EINVAL); > + > + if (count == 1) > + return intel_context_create(siblings[0]); > + > + GEM_BUG_ON(!siblings[0]->cops->create_virtual); > + return siblings[0]->cops->create_virtual(siblings, count); > +} > + > static bool match_ring(struct i915_request *rq) > { > u32 ring = ENGINE_READ(rq->engine, RING_START); > diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c > index cdb2126a159a..bd4ced794ff9 100644 > --- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c > +++ b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c > @@ -205,6 +205,9 @@ static struct virtual_engine *to_virtual_engine(struct intel_engine_cs *engine) > return container_of(engine, struct virtual_engine, base); > } > > +static struct intel_context * > +execlists_create_virtual(struct intel_engine_cs **siblings, unsigned int count); > + > static struct i915_request * > __active_request(const struct intel_timeline * const tl, > struct i915_request *rq, > @@ -2560,6 +2563,8 @@ static const struct intel_context_ops execlists_context_ops = { > > .reset = lrc_reset, > .destroy = lrc_destroy, > + > + .create_virtual = execlists_create_virtual, > }; > > static int emit_pdps(struct i915_request *rq) > @@ -3506,6 +3511,94 @@ static void virtual_context_exit(struct intel_context *ce) > intel_engine_pm_put(ve->siblings[n]); > } > > +static struct intel_engine_cs * > +virtual_get_sibling(struct intel_engine_cs *engine, unsigned int sibling) > +{ > + struct virtual_engine *ve = to_virtual_engine(engine); > + > + if (sibling >= ve->num_siblings) > + return NULL; > + > + return ve->siblings[sibling]; > +} > + > +static struct intel_context * > +virtual_clone(struct intel_engine_cs *src) > +{ > + struct virtual_engine *se = to_virtual_engine(src); > + struct intel_context *dst; > + > + dst = execlists_create_virtual(se->siblings, se->num_siblings); > + if (IS_ERR(dst)) > + return dst; > + > + if (se->num_bonds) { > + struct virtual_engine *de = to_virtual_engine(dst->engine); > + > + de->bonds = kmemdup(se->bonds, > + sizeof(*se->bonds) * se->num_bonds, > + GFP_KERNEL); > + if (!de->bonds) { > + intel_context_put(dst); > + return ERR_PTR(-ENOMEM); > + } > + > + de->num_bonds = se->num_bonds; > + } > + > + return dst; > +} > + > +static struct ve_bond * > +virtual_find_bond(struct virtual_engine *ve, > + const struct intel_engine_cs *master) > +{ > + int i; > + > + for (i = 0; i < ve->num_bonds; i++) { > + if (ve->bonds[i].master == master) > + return &ve->bonds[i]; > + } > + > + return NULL; > +} > + > +static int virtual_attach_bond(struct intel_engine_cs *engine, > + const struct intel_engine_cs *master, > + const struct intel_engine_cs *sibling) > +{ > + struct virtual_engine *ve = to_virtual_engine(engine); > + struct ve_bond *bond; > + int n; > + > + /* Sanity check the sibling is part of the virtual engine */ > + for (n = 0; n < ve->num_siblings; n++) > + if (sibling == ve->siblings[n]) > + break; > + if (n == ve->num_siblings) > + return -EINVAL; > + > + bond = virtual_find_bond(ve, master); > + if (bond) { > + bond->sibling_mask |= sibling->mask; > + return 0; > + } > + > + bond = krealloc(ve->bonds, > + sizeof(*bond) * (ve->num_bonds + 1), > + GFP_KERNEL); > + if (!bond) > + return -ENOMEM; > + > + bond[ve->num_bonds].master = master; > + bond[ve->num_bonds].sibling_mask = sibling->mask; > + > + ve->bonds = bond; > + ve->num_bonds++; > + > + return 0; > +} > + > static const struct intel_context_ops virtual_context_ops = { > .flags = COPS_HAS_INFLIGHT, > > @@ -3520,6 +3613,10 @@ static const struct intel_context_ops virtual_context_ops = { > .exit = virtual_context_exit, > > .destroy = virtual_context_destroy, > + > + .clone_virtual = virtual_clone, > + .get_sibling = virtual_get_sibling, > + .attach_bond = virtual_attach_bond, > }; > > static intel_engine_mask_t virtual_submission_mask(struct virtual_engine *ve) > @@ -3668,20 +3765,6 @@ static void virtual_submit_request(struct i915_request *rq) > spin_unlock_irqrestore(&ve->base.sched_engine->lock, flags); > } > > -static struct ve_bond * > -virtual_find_bond(struct virtual_engine *ve, > - const struct intel_engine_cs *master) > -{ > - int i; > - > - for (i = 0; i < ve->num_bonds; i++) { > - if (ve->bonds[i].master == master) > - return &ve->bonds[i]; > - } > - > - return NULL; > -} > - > static void > virtual_bond_execute(struct i915_request *rq, struct dma_fence *signal) > { > @@ -3704,20 +3787,13 @@ virtual_bond_execute(struct i915_request *rq, struct dma_fence *signal) > to_request(signal)->execution_mask &= ~allowed; > } > > -struct intel_context * > -intel_execlists_create_virtual(struct intel_engine_cs **siblings, > - unsigned int count) > +static struct intel_context * > +execlists_create_virtual(struct intel_engine_cs **siblings, unsigned int count) > { > struct virtual_engine *ve; > unsigned int n; > int err; > > - if (count == 0) > - return ERR_PTR(-EINVAL); > - > - if (count == 1) > - return intel_context_create(siblings[0]); > - > ve = kzalloc(struct_size(ve, siblings, count), GFP_KERNEL); > if (!ve) > return ERR_PTR(-ENOMEM); > @@ -3850,70 +3926,6 @@ intel_execlists_create_virtual(struct intel_engine_cs **siblings, > return ERR_PTR(err); > } > > -struct intel_context * > -intel_execlists_clone_virtual(struct intel_engine_cs *src) > -{ > - struct virtual_engine *se = to_virtual_engine(src); > - struct intel_context *dst; > - > - dst = intel_execlists_create_virtual(se->siblings, > - se->num_siblings); > - if (IS_ERR(dst)) > - return dst; > - > - if (se->num_bonds) { > - struct virtual_engine *de = to_virtual_engine(dst->engine); > - > - de->bonds = kmemdup(se->bonds, > - sizeof(*se->bonds) * se->num_bonds, > - GFP_KERNEL); > - if (!de->bonds) { > - intel_context_put(dst); > - return ERR_PTR(-ENOMEM); > - } > - > - de->num_bonds = se->num_bonds; > - } > - > - return dst; > -} > - > -int intel_virtual_engine_attach_bond(struct intel_engine_cs *engine, > - const struct intel_engine_cs *master, > - const struct intel_engine_cs *sibling) > -{ > - struct virtual_engine *ve = to_virtual_engine(engine); > - struct ve_bond *bond; > - int n; > - > - /* Sanity check the sibling is part of the virtual engine */ > - for (n = 0; n < ve->num_siblings; n++) > - if (sibling == ve->siblings[n]) > - break; > - if (n == ve->num_siblings) > - return -EINVAL; > - > - bond = virtual_find_bond(ve, master); > - if (bond) { > - bond->sibling_mask |= sibling->mask; > - return 0; > - } > - > - bond = krealloc(ve->bonds, > - sizeof(*bond) * (ve->num_bonds + 1), > - GFP_KERNEL); > - if (!bond) > - return -ENOMEM; > - > - bond[ve->num_bonds].master = master; > - bond[ve->num_bonds].sibling_mask = sibling->mask; > - > - ve->bonds = bond; > - ve->num_bonds++; > - > - return 0; > -} > - > void intel_execlists_show_requests(struct intel_engine_cs *engine, > struct drm_printer *m, > void (*show_request)(struct drm_printer *m, > diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.h b/drivers/gpu/drm/i915/gt/intel_execlists_submission.h > index 4ca9b475e252..74041b1994af 100644 > --- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.h > +++ b/drivers/gpu/drm/i915/gt/intel_execlists_submission.h > @@ -32,15 +32,4 @@ void intel_execlists_show_requests(struct intel_engine_cs *engine, > int indent), > unsigned int max); > > -struct intel_context * > -intel_execlists_create_virtual(struct intel_engine_cs **siblings, > - unsigned int count); > - > -struct intel_context * > -intel_execlists_clone_virtual(struct intel_engine_cs *src); > - > -int intel_virtual_engine_attach_bond(struct intel_engine_cs *engine, > - const struct intel_engine_cs *master, > - const struct intel_engine_cs *sibling); > - > #endif /* __INTEL_EXECLISTS_SUBMISSION_H__ */ > diff --git a/drivers/gpu/drm/i915/gt/selftest_execlists.c b/drivers/gpu/drm/i915/gt/selftest_execlists.c > index 08896ae027d5..88aac9977e09 100644 > --- a/drivers/gpu/drm/i915/gt/selftest_execlists.c > +++ b/drivers/gpu/drm/i915/gt/selftest_execlists.c > @@ -3727,7 +3727,7 @@ static int nop_virtual_engine(struct intel_gt *gt, > GEM_BUG_ON(!nctx || nctx > ARRAY_SIZE(ve)); > > for (n = 0; n < nctx; n++) { > - ve[n] = intel_execlists_create_virtual(siblings, nsibling); > + ve[n] = intel_engine_create_virtual(siblings, nsibling); > if (IS_ERR(ve[n])) { > err = PTR_ERR(ve[n]); > nctx = n; > @@ -3923,7 +3923,7 @@ static int mask_virtual_engine(struct intel_gt *gt, > * restrict it to our desired engine within the virtual engine. > */ > > - ve = intel_execlists_create_virtual(siblings, nsibling); > + ve = intel_engine_create_virtual(siblings, nsibling); > if (IS_ERR(ve)) { > err = PTR_ERR(ve); > goto out_close; > @@ -4054,7 +4054,7 @@ static int slicein_virtual_engine(struct intel_gt *gt, > i915_request_add(rq); > } > > - ce = intel_execlists_create_virtual(siblings, nsibling); > + ce = intel_engine_create_virtual(siblings, nsibling); > if (IS_ERR(ce)) { > err = PTR_ERR(ce); > goto out; > @@ -4106,7 +4106,7 @@ static int sliceout_virtual_engine(struct intel_gt *gt, > > /* XXX We do not handle oversubscription and fairness with normal rq */ > for (n = 0; n < nsibling; n++) { > - ce = intel_execlists_create_virtual(siblings, nsibling); > + ce = intel_engine_create_virtual(siblings, nsibling); > if (IS_ERR(ce)) { > err = PTR_ERR(ce); > goto out; > @@ -4208,7 +4208,7 @@ static int preserved_virtual_engine(struct intel_gt *gt, > if (err) > goto out_scratch; > > - ve = intel_execlists_create_virtual(siblings, nsibling); > + ve = intel_engine_create_virtual(siblings, nsibling); > if (IS_ERR(ve)) { > err = PTR_ERR(ve); > goto out_scratch; > @@ -4431,16 +4431,16 @@ static int bond_virtual_engine(struct intel_gt *gt, > for (n = 0; n < nsibling; n++) { > struct intel_context *ve; > > - ve = intel_execlists_create_virtual(siblings, nsibling); > + ve = intel_engine_create_virtual(siblings, nsibling); > if (IS_ERR(ve)) { > err = PTR_ERR(ve); > onstack_fence_fini(&fence); > goto out; > } > > - err = intel_virtual_engine_attach_bond(ve->engine, > - master, > - siblings[n]); > + err = intel_engine_attach_bond(ve->engine, > + master, > + siblings[n]); > if (err) { > intel_context_put(ve); > onstack_fence_fini(&fence); > @@ -4576,7 +4576,7 @@ static int reset_virtual_engine(struct intel_gt *gt, > if (igt_spinner_init(&spin, gt)) > return -ENOMEM; > > - ve = intel_execlists_create_virtual(siblings, nsibling); > + ve = intel_engine_create_virtual(siblings, nsibling); > if (IS_ERR(ve)) { > err = PTR_ERR(ve); > goto out_spin; > 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 d605af0d66e6..ccbcf024b31b 100644 > --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c > +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c > @@ -60,6 +60,15 @@ > * > */ > > +/* GuC Virtual Engine */ > +struct guc_virtual_engine { > + struct intel_engine_cs base; > + struct intel_context context; > +}; > + > +static struct intel_context * > +guc_create_virtual(struct intel_engine_cs **siblings, unsigned int count); > + > #define GUC_REQUEST_SIZE 64 /* bytes */ > > /* > @@ -928,20 +937,35 @@ static int guc_lrc_desc_pin(struct intel_context *ce) > return ret; > } > > -static int guc_context_pre_pin(struct intel_context *ce, > - struct i915_gem_ww_ctx *ww, > - void **vaddr) > +static int __guc_context_pre_pin(struct intel_context *ce, > + struct intel_engine_cs *engine, > + struct i915_gem_ww_ctx *ww, > + void **vaddr) > { > - return lrc_pre_pin(ce, ce->engine, ww, vaddr); > + return lrc_pre_pin(ce, engine, ww, vaddr); > } > > -static int guc_context_pin(struct intel_context *ce, void *vaddr) > +static int __guc_context_pin(struct intel_context *ce, > + struct intel_engine_cs *engine, > + void *vaddr) > { > if (i915_ggtt_offset(ce->state) != > (ce->lrc.lrca & CTX_GTT_ADDRESS_MASK)) > set_bit(CONTEXT_LRCA_DIRTY, &ce->flags); > > - return lrc_pin(ce, ce->engine, vaddr); > + return lrc_pin(ce, engine, vaddr); > +} > + > +static int guc_context_pre_pin(struct intel_context *ce, > + struct i915_gem_ww_ctx *ww, > + void **vaddr) > +{ > + return __guc_context_pre_pin(ce, ce->engine, ww, vaddr); > +} > + > +static int guc_context_pin(struct intel_context *ce, void *vaddr) > +{ > + return __guc_context_pin(ce, ce->engine, vaddr); > } > > static void guc_context_unpin(struct intel_context *ce) > @@ -1041,6 +1065,21 @@ static inline void guc_lrc_desc_unpin(struct intel_context *ce) > deregister_context(ce, ce->guc_id); > } > > +static void __guc_context_destroy(struct intel_context *ce) > +{ > + lrc_fini(ce); > + intel_context_fini(ce); > + > + if (intel_engine_is_virtual(ce->engine)) { > + struct guc_virtual_engine *ve = > + container_of(ce, typeof(*ve), context); > + > + kfree(ve); > + } else { > + intel_context_free(ce); > + } > +} > + > static void guc_context_destroy(struct kref *kref) > { > struct intel_context *ce = container_of(kref, typeof(*ce), ref); > @@ -1057,7 +1096,7 @@ static void guc_context_destroy(struct kref *kref) > if (context_guc_id_invalid(ce) || > !lrc_desc_registered(guc, ce->guc_id)) { > release_guc_id(guc, ce); > - lrc_destroy(kref); AFAICS after this patch we only have 1 use of lrc_destroy inside the execlists file, while we do have 2 open coded implementations (here and execlists VE). Since lrc_fini and intel_context_fini are still always called as a pair, maybe we can replace lrc_destroy with a function that calls those 2 (i.e basically just remove the free() from lrc_destroy)? Can be done as a follow up. > + __guc_context_destroy(ce); > return; > } > > @@ -1073,7 +1112,7 @@ static void guc_context_destroy(struct kref *kref) > if (context_guc_id_invalid(ce)) { > __release_guc_id(guc, ce); > spin_unlock_irqrestore(&guc->contexts_lock, flags); > - lrc_destroy(kref); > + __guc_context_destroy(ce); > return; > } > > @@ -1118,6 +1157,8 @@ static const struct intel_context_ops guc_context_ops = { > > .reset = lrc_reset, > .destroy = guc_context_destroy, > + > + .create_virtual = guc_create_virtual, > }; > > static void __guc_signal_context_fence(struct intel_context *ce) > @@ -1246,6 +1287,96 @@ static int guc_request_alloc(struct i915_request *rq) > return 0; > } > > +static struct intel_engine_cs * > +guc_virtual_get_sibling(struct intel_engine_cs *ve, unsigned int sibling) > +{ > + struct intel_engine_cs *engine; > + intel_engine_mask_t tmp, mask = ve->mask; > + unsigned int num_siblings = 0; > + > + for_each_engine_masked(engine, ve->gt, mask, tmp) > + if (num_siblings++ == sibling) > + return engine; > + > + return NULL; > +} > + > +static int guc_virtual_context_pre_pin(struct intel_context *ce, > + struct i915_gem_ww_ctx *ww, > + void **vaddr) > +{ > + struct intel_engine_cs *engine = guc_virtual_get_sibling(ce->engine, 0); > + > + return __guc_context_pre_pin(ce, engine, ww, vaddr); > +} > + > +static int guc_virtual_context_pin(struct intel_context *ce, void *vaddr) > +{ > + struct intel_engine_cs *engine = guc_virtual_get_sibling(ce->engine, 0); > + > + return __guc_context_pin(ce, engine, vaddr); > +} > + > +static void guc_virtual_context_enter(struct intel_context *ce) > +{ > + intel_engine_mask_t tmp, mask = ce->engine->mask; > + struct intel_engine_cs *engine; > + > + for_each_engine_masked(engine, ce->engine->gt, mask, tmp) > + intel_engine_pm_get(engine); > + > + intel_timeline_enter(ce->timeline); > +} > + > +static void guc_virtual_context_exit(struct intel_context *ce) > +{ > + intel_engine_mask_t tmp, mask = ce->engine->mask; > + struct intel_engine_cs *engine; > + > + for_each_engine_masked(engine, ce->engine->gt, mask, tmp) > + intel_engine_pm_put(engine); > + > + intel_timeline_exit(ce->timeline); > +} > + > +static int guc_virtual_context_alloc(struct intel_context *ce) > +{ > + struct intel_engine_cs *engine = guc_virtual_get_sibling(ce->engine, 0); > + > + return lrc_alloc(ce, engine); > +} > + > +static struct intel_context *guc_clone_virtual(struct intel_engine_cs *src) > +{ > + struct intel_engine_cs *siblings[GUC_MAX_INSTANCES_PER_CLASS], *engine; > + intel_engine_mask_t tmp, mask = src->mask; > + unsigned int num_siblings = 0; > + > + for_each_engine_masked(engine, src->gt, mask, tmp) > + siblings[num_siblings++] = engine; > + > + return guc_create_virtual(siblings, num_siblings); > +} > + > +static const struct intel_context_ops virtual_guc_context_ops = { > + .alloc = guc_virtual_context_alloc, > + > + .pre_pin = guc_virtual_context_pre_pin, > + .pin = guc_virtual_context_pin, > + .unpin = guc_context_unpin, > + .post_unpin = guc_context_post_unpin, > + > + .enter = guc_virtual_context_enter, > + .exit = guc_virtual_context_exit, > + > + .sched_disable = guc_context_sched_disable, > + > + .destroy = guc_context_destroy, > + > + .clone_virtual = guc_clone_virtual, > + .get_sibling = guc_virtual_get_sibling, > +}; > + > static void sanitize_hwsp(struct intel_engine_cs *engine) > { > struct intel_timeline *tl; > @@ -1557,7 +1688,7 @@ int intel_guc_deregister_done_process_msg(struct intel_guc *guc, > } else if (context_destroyed(ce)) { > /* Context has been destroyed */ > release_guc_id(guc, ce); > - lrc_destroy(&ce->ref); > + __guc_context_destroy(ce); > } > > decr_outstanding_submission_g2h(guc); > @@ -1669,3 +1800,107 @@ void intel_guc_log_context_info(struct intel_guc *guc, > atomic_read(&ce->guc_sched_state_no_lock)); > } > } > + > +static struct intel_context * > +guc_create_virtual(struct intel_engine_cs **siblings, unsigned int count) > +{ > + struct guc_virtual_engine *ve; > + struct intel_guc *guc; > + unsigned int n; > + int err; > + > + ve = kzalloc(sizeof(*ve), GFP_KERNEL); > + if (!ve) > + return ERR_PTR(-ENOMEM); > + > + guc = &siblings[0]->gt->uc.guc; > + > + ve->base.i915 = siblings[0]->i915; > + ve->base.gt = siblings[0]->gt; > + ve->base.uncore = siblings[0]->uncore; > + ve->base.id = -1; > + > + ve->base.uabi_class = I915_ENGINE_CLASS_INVALID; > + ve->base.instance = I915_ENGINE_CLASS_INVALID_VIRTUAL; > + ve->base.uabi_instance = I915_ENGINE_CLASS_INVALID_VIRTUAL; > + ve->base.saturated = ALL_ENGINES; Most of these settings are the same for both execlists and GuC and aren't back-end dependent. Maybe we can have a: intel_virtual_engine_init_early(struct intel_engine_cs *engine,                                 struct intel_engine_cs *sibling); And call that from both places? Can be done as a follow-up > + ve->base.breadcrumbs = intel_breadcrumbs_create(&ve->base); > + if (!ve->base.breadcrumbs) { > + kfree(ve); > + return ERR_PTR(-ENOMEM); > + } > + > + snprintf(ve->base.name, sizeof(ve->base.name), "virtual"); > + > + ve->base.sched_engine = i915_sched_engine_get(guc->sched_engine); > + > + ve->base.cops = &virtual_guc_context_ops; > + ve->base.request_alloc = guc_request_alloc; > + > + ve->base.submit_request = guc_submit_request; > + > + ve->base.flags = I915_ENGINE_IS_VIRTUAL; > + > + intel_context_init(&ve->context, &ve->base); > + > + for (n = 0; n < count; n++) { > + struct intel_engine_cs *sibling = siblings[n]; > + > + GEM_BUG_ON(!is_power_of_2(sibling->mask)); > + if (sibling->mask & ve->base.mask) { > + DRM_DEBUG("duplicate %s entry in load balancer\n", > + sibling->name); > + err = -EINVAL; > + goto err_put; > + } > + > + ve->base.mask |= sibling->mask; > + > + if (n != 0 && ve->base.class != sibling->class) { > + DRM_DEBUG("invalid mixing of engine class, sibling %d, already %d\n", > + sibling->class, ve->base.class); > + err = -EINVAL; > + goto err_put; > + } else if (n == 0) { > + ve->base.class = sibling->class; > + ve->base.uabi_class = sibling->uabi_class; > + snprintf(ve->base.name, sizeof(ve->base.name), > + "v%dx%d", ve->base.class, count); > + ve->base.context_size = sibling->context_size; > + > + ve->base.emit_bb_start = sibling->emit_bb_start; > + ve->base.emit_flush = sibling->emit_flush; > + ve->base.emit_init_breadcrumb = > + sibling->emit_init_breadcrumb; > + ve->base.emit_fini_breadcrumb = > + sibling->emit_fini_breadcrumb; > + ve->base.emit_fini_breadcrumb_dw = > + sibling->emit_fini_breadcrumb_dw; > + > + ve->base.flags |= sibling->flags; > + Same here, most of these setting from the sibling are the same. intel_virtual_engine_inherit_from_sibling()? Apart from the various nits the code LGTM, but I'll wait until the next spin for an r-b since a good chunk of the patch is going away. Daniele > + ve->base.props.timeslice_duration_ms = > + sibling->props.timeslice_duration_ms; > + } > + } > + > + return &ve->context; > + > +err_put: > + intel_context_put(&ve->context); > + return ERR_PTR(err); > +} > + > + > + > +bool intel_guc_virtual_engine_has_heartbeat(const struct intel_engine_cs *ve) > +{ > + struct intel_engine_cs *engine; > + intel_engine_mask_t tmp, mask = ve->mask; > + > + for_each_engine_masked(engine, ve->gt, mask, tmp) > + if (READ_ONCE(engine->props.heartbeat_interval_ms)) > + return true; > + > + return false; > +} > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.h b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.h > index 6453e2bfa151..95df5ab06031 100644 > --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.h > +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.h > @@ -25,6 +25,8 @@ void intel_guc_log_submission_info(struct intel_guc *guc, > struct drm_printer *p); > void intel_guc_log_context_info(struct intel_guc *guc, struct drm_printer *p); > > +bool intel_guc_virtual_engine_has_heartbeat(const struct intel_engine_cs *ve); > + > static inline bool intel_guc_submission_is_supported(struct intel_guc *guc) > { > /* XXX: GuC submission is unavailable for now */ 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.1 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, 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 62907C1B08C for ; Thu, 15 Jul 2021 01:21:42 +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 1B833613C3 for ; Thu, 15 Jul 2021 01:21:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1B833613C3 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 363796E4B6; Thu, 15 Jul 2021 01:21:38 +0000 (UTC) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id E9EC16E4A1; Thu, 15 Jul 2021 01:21:35 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10045"; a="210498026" X-IronPort-AV: E=Sophos;i="5.84,240,1620716400"; d="scan'208";a="210498026" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jul 2021 18:21:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,240,1620716400"; d="scan'208";a="494814403" Received: from orsmsx605.amr.corp.intel.com ([10.22.229.18]) by FMSMGA003.fm.intel.com with ESMTP; 14 Jul 2021 18:21:34 -0700 Received: from orsmsx606.amr.corp.intel.com (10.22.229.19) by ORSMSX605.amr.corp.intel.com (10.22.229.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Wed, 14 Jul 2021 18:21:34 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) 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 via Frontend Transport; Wed, 14 Jul 2021 18:21:34 -0700 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (104.47.57.49) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.10; Wed, 14 Jul 2021 18:21:33 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mQybyBuJ/4eXYTFxrsMydqlwid7fkBh1sGFSMrDCkY2XlsT8/X38rjRhqfRiPw8NzKhlxT6LEkW42bHHnVlpTH2trBF5Ecqt7xhhAgppF1124UAXPOytcrUG8y4Sj+FCKS+LZcurhEWNJu3uNKdDQmolmEep1Qz7Cbv0kDHgEz+/h3ZqFyAdHoyNNGcYEBXmPDH1tCgrtF+J9D8eIlIiNj8WAxsjNMJLZPyWL1zYYPMT2j56XC0/T2Uq9cSuPRJmmZvcFOJZdXudEYbqwvajSoRtiM6L3AyOGGRLmmHbCxnSKfgLdnvgzH2Eiqjr2onAjLxah+8OprfBgYReE8a+0w== 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=c1U1etAg9hLEIc+MQPRdohyquYCxAns458HV0zig+4s=; b=aBQSE+OROaWvGrQr1LGnpjMlOCnrRRRhCanIOUdsl7lpC2UZGKygq11CHhgQ6DhpwwvVyreSGATtGCLZCFJ62r+Y2uaY9eEZSdVS8Mx1QDm72xE1khYKxPVciMwqvLgRVBknQhvFi5Kw12gi7GN7vwy8QJR/9tjNjPIbo/lsSxT4efTtUom9ze6M7H8DYOxFSDCAN8VCuJKhqY8it9WHZFHXpmZC9mhzVW89DutoKLHUm4+Q7vWKPKw0ZDZtV3zRchdmV3W8gV+VWHsWpfhHm6YFEfgNBhQePCXN/Rhy60w8WHUfy4p9LAh+0Rqk3zf3xQQPdUFP4OIbqu2g/8jjYQ== 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=c1U1etAg9hLEIc+MQPRdohyquYCxAns458HV0zig+4s=; b=YeyU0+4qKce7C9xva5ZFWsLSxDdWGpa3xJB+Qvrp06sRf58KNCG7XCd/6t+WWkNawSFXwmRCyZuoyVsVgsBY156GY0+ZYXjYtiuoYrvjFv2INHNAIuicyREs0sMjWEFdrZRZVbVe4N30vttRZ1/BmqBXOEdSjhcHiAM6LjwZRfA= 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 DM4PR11MB5488.namprd11.prod.outlook.com (2603:10b6:5:39d::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.22; Thu, 15 Jul 2021 01:21:27 +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.022; Thu, 15 Jul 2021 01:21:27 +0000 To: Matthew Brost , , References: <20210624070516.21893-1-matthew.brost@intel.com> <20210624070516.21893-27-matthew.brost@intel.com> From: Daniele Ceraolo Spurio Message-ID: <95eba0f3-3710-da4b-5cad-5a6c21e46ca2@intel.com> Date: Wed, 14 Jul 2021 18:21:24 -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: <20210624070516.21893-27-matthew.brost@intel.com> Content-Language: en-US X-ClientProxiedBy: SJ0PR03CA0324.namprd03.prod.outlook.com (2603:10b6:a03:39d::29) 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 SJ0PR03CA0324.namprd03.prod.outlook.com (2603:10b6:a03:39d::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.21 via Frontend Transport; Thu, 15 Jul 2021 01:21:26 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a6a3dde7-2cbc-4086-26a2-08d9472eddd4 X-MS-TrafficTypeDiagnostic: DM4PR11MB5488: 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: lq3BK1HEyjRWme9nG7gFoqKaJKBs0/4M9CSlMo9OByZ7VmosA0YkKkSHwNEecZMNxaw9V79/3bzE0v0RO8azCxCibO+/vGS6v+L17V45g1dOs6BbNrSynNtpi7Es4aUrk8tV8fxORjyEnXgWoCZILAGLqMXyW/EbVQKefX8dPEEVKQldcjRc048jstkcT4gE/RSK0xbG3/PK88owkOC4JXbAWFfIZtyiJYdlxYAAQSBlgPtIanCfAB5718Xa0Qou2oZU0pbnO1wdX8ZOn8U5F0nLL05CGa4crw/HLcW6yKpKP61fo8aXhpDJ/98B+Fm4OwYixguktgMV+6kCQtWn7vqzyGiJ8lF/50cCnVmZpVgWaTWJQ7kS2py1Iy7k/wvgDX7XCdqRqGOnzitPWEDbK5Bu44ZOuuh1U6PpEV1njvF9VGnjyUVNHQNomZA4EHgfmDTS3on5Nzpkp5z6APojV1XxPmHcRqjXTbs97iLS65eLZCOuYoBvVkTVxJAC6yGEw5RH5CTC+PJN3e9sYRA6eddVH63PtbW3kZSC+1JjmZTwhT/X/g6Sa1fBCCOIko2Lanklbpu0+oHDnXVLozcDtvUw+40zAlbh4iBTICcE6kGALzpgQwxLU/NEA35gHbY1P6EI2pKo7zmb1fDePAw4MUm/HEFkmtaR/XUmxVGtzEgfJJzPC2DBKDb2Mki3SwfWuIBr/KZhUUIf4tEubIUdpWUuQj1jZiMo6nsd7Mz5SeO3Pc68huTAuxykFb+lbTGeDPJvXbG3kGOD4DM+vgWjiQ== 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)(6486002)(53546011)(26005)(186003)(478600001)(36756003)(8676002)(66476007)(86362001)(66556008)(66946007)(31696002)(16576012)(31686004)(8936002)(4326008)(5660300002)(2906002)(30864003)(316002)(107886003)(83380400001)(956004)(38100700002)(2616005)(450100002)(21314003)(43740500002)(45980500001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?K2dDWWFlVXc0Y0grWndQajE3RDhiNUsxMmxJQklER0NoUngwT2dVczQxYnFt?= =?utf-8?B?NlRSeGRBeTJCS0djQkNWYzRDUk82bjJpUmIwZm54YloyWnM3RDhRMjBCVXNV?= =?utf-8?B?ZXBqRXdMVWxtckdweWNjWXJRSVRuejNST1VJeTdEbThsRzAyYmdmZnpyb1Zi?= =?utf-8?B?SHdYc0s3cGtOL2d2QlBONStPbTlWYm1kUjRWamdHOTZZWkNOSDdhZkFIUnBU?= =?utf-8?B?cWJHeVhDN0JaUTVsWFBha00zNjFVemRHSG9lQTI2c3JQTWxCaFBzS2Z4Umll?= =?utf-8?B?RWcxbStHZlNud3RoOHlXWkxEOGpyVVBLem9jc0xIcmkzVms4VGMyYWk2RkRD?= =?utf-8?B?b0REWFYra09BT3QraVFGUmQ4MHZxWk1WSCtRdFAxV1ErVnBkZXExdTRQR1dQ?= =?utf-8?B?ZjlSSGNnMmpVNjYvVXRvL1IyMVVSQlJKZFM2cFYvWW9xQlNISnhUbVNwZUF5?= =?utf-8?B?OVVxSXNFMW5yZ1R1VUNqcklScWF5YUY2M3YwOXBFSkhpekFLVURPTll6dEZh?= =?utf-8?B?SUJVMFAwaFZpd0IxdXhPS2V4WWFSN0pMam1QOU9DOWJtZWNSUjdZRWdMc3RZ?= =?utf-8?B?dkVFWHpES052QnNtVXo1bGtFWG02RHdUOG9FMFlSdTlRYUtRaXNZRGJjZENM?= =?utf-8?B?S0lnWktncndiMkF2WStST1B5Nm5QTVhLaGR0bDZnNURNaVpnYTFEQVAyaThw?= =?utf-8?B?NnpkRC8yRXFBeDIzSkN4SzVBaUdUelphVFNIN3d2ZEMwZmlabnpoTzI3NVMx?= =?utf-8?B?L0pBdGN1MkVWdUIvakFueEkzZkZWZWJjdHNka0g3cjBjVTFGODlKVEtIWjR3?= =?utf-8?B?cXV1dmkwL1dNdXZVYm1ZTmZnRnJDcGJCWFJCWkx0YUlzR3ZMczJYNGN0Rmkv?= =?utf-8?B?Mk9wYnBTaVdJaUhHQktFRkRwMllGYkdHQVZnL0orVFBPOXhGU1I0dkRGYkpR?= =?utf-8?B?YlJjYmZiQ204eUFZTEo0ZzJQMFVuWE1iS0RkaXZOeEpmYVRDSjhVTlBVckFC?= =?utf-8?B?bnRnaTV3SUVGdklRd1duOTV6allzRkErMDQwK3JZWVoyR0EvdzgzeUFyU2F4?= =?utf-8?B?WFJERnFWZlI0eE1oRDQrZFovbGFxTHNZWEhqakkwYnZ6MFJtTnkveVhZVGJQ?= =?utf-8?B?di9sMTNPdzJKdTZXRGIxUm44OEdQQzZ1WUpEcENDeWR5Q0I2MHVBcmpWRy9Q?= =?utf-8?B?WTNndGw1bzlJS0ZpY3Q0S0hEMnZtcFRuVDNobXE0RlpWUkphRWprWXo0YTd0?= =?utf-8?B?N1UwSnVjTmQrN1FiT2E3Q0w2QkwyK1NsTGZrTkNYMjdKcGlaNE5LRzJrNlNQ?= =?utf-8?B?SWtudDd5L1VSUVpKMGJNelA3a0ZCdmUwTVVpbVpFa1hLZkIrMHBOWHo5WGF3?= =?utf-8?B?WW1KcUo3M2xYYVFjMnJQWVBsQWNHSlY3VFdRalNucUp5Z1hCVkxvYkhISkdu?= =?utf-8?B?WHJKeHg3QUNFTWpKWlBNNFhpS09TWjVrMEZJS0ppcS81L0NMalFQL25VY0pR?= =?utf-8?B?Y1NDTzNLK05wZ1Z1eTl3OW9ORTI0MkJPOWR0ei9PM0dCc1R1aUdxa09zQXEz?= =?utf-8?B?eDJ2ZXN1ZTZFUW82SXRoSHRDczJoMU1DUW5JV0pDdVRSSWRaQ2pJZ2Z1eEpH?= =?utf-8?B?NW5Rb0lvRjc3SEpNZ2c2NlpWWkRWaDNTa0dIMFdCeS9ScWRFaHZCczhtMlRu?= =?utf-8?B?N1lubHJpSnNXQzRFbVZ0YlRrZlNpcXdUQnFxOW13Y0NMUEUxMVg1aUhORWdO?= =?utf-8?Q?PWJ+NJlTDkbF6fD2WtDzX0qyv9qdYiNbvrVk4pM?= X-MS-Exchange-CrossTenant-Network-Message-Id: a6a3dde7-2cbc-4086-26a2-08d9472eddd4 X-MS-Exchange-CrossTenant-AuthSource: DM4PR11MB5488.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Jul 2021 01:21:26.7223 (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: PLztLtpRGmRX1pSrHNoz8s8dMBffx+o3MCZ5zU9EX/tG2nQpOWAmRJRU0kbU7ESkgIY5mhRQjFRsT99BMx6zk0NL7tBZWvOT5k5Zo1tPJvM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR11MB5488 X-OriginatorOrg: intel.com Subject: Re: [Intel-gfx] [PATCH 26/47] drm/i915/guc: GuC virtual engines 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" CgpPbiA2LzI0LzIwMjEgMTI6MDQgQU0sIE1hdHRoZXcgQnJvc3Qgd3JvdGU6Cj4gSW1wbGVtZW50 IEd1QyB2aXJ0dWFsIGVuZ2luZXMuIFJhdGhlciBzaW1wbGUgaW1wbGVtZW50YXRpb24sIGJhc2lj YWxseQo+IGp1c3QgYWxsb2NhdGUgYW4gZW5naW5lLCBzZXR1cCBjb250ZXh0IGVudGVyIC8gZXhp dCBmdW5jdGlvbiB0byB2aXJ0dWFsCj4gZW5naW5lIHNwZWNpZmljIGZ1bmN0aW9ucywgc2V0IGFs bCBvdGhlciB2YXJpYWJsZXMgLyBmdW5jdGlvbnMgdG8gZ3VjCj4gdmVyc2lvbnMsIGFuZCBzZXQg dGhlIGVuZ2luZSBtYXNrIHRvIHRoYXQgb2YgYWxsIHRoZSBzaWJsaW5ncy4KPgo+IENjOiBEYW5p ZWxlIENlcmFvbG8gU3B1cmlvIDxkYW5pZWxlLmNlcmFvbG9zcHVyaW9AaW50ZWwuY29tPgo+IFNp Z25lZC1vZmYtYnk6IE1hdHRoZXcgQnJvc3QgPG1hdHRoZXcuYnJvc3RAaW50ZWwuY29tPgo+IC0t LQo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NvbnRleHQuYyAgIHwgIDE5 ICstCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fY29udGV4dC5oICAgfCAg IDEgKwo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfY29udGV4dF90eXBlcy5oIHwg IDEwICsKPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2VuZ2luZS5oICAgICAgICB8 ICA0NSArKystCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9lbmdpbmVfY3MuYyAg ICAgfCAgMTQgKwo+ICAgLi4uL2RybS9pOTE1L2d0L2ludGVsX2V4ZWNsaXN0c19zdWJtaXNzaW9u LmMgIHwgMTg2ICsrKysrKystLS0tLS0KPiAgIC4uLi9kcm0vaTkxNS9ndC9pbnRlbF9leGVjbGlz dHNfc3VibWlzc2lvbi5oICB8ICAxMSAtCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9zZWxm dGVzdF9leGVjbGlzdHMuYyAgfCAgMjAgKy0KPiAgIC4uLi9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50 ZWxfZ3VjX3N1Ym1pc3Npb24uYyB8IDI1MyArKysrKysrKysrKysrKysrKy0KPiAgIC4uLi9ncHUv ZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uaCB8ICAgMiArCj4gICAxMCBmaWxl cyBjaGFuZ2VkLCA0MjkgaW5zZXJ0aW9ucygrKSwgMTMyIGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9jb250ZXh0LmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fY29udGV4dC5jCj4gaW5kZXggNWMwN2U2YWJm MTZhLi44YTkyOTNlMGNhOTIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2Vt L2k5MTVfZ2VtX2NvbnRleHQuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1 X2dlbV9jb250ZXh0LmMKPiBAQCAtNzIsNyArNzIsNiBAQAo+ICAgI2luY2x1ZGUgImd0L2ludGVs X2NvbnRleHRfcGFyYW0uaCIKPiAgICNpbmNsdWRlICJndC9pbnRlbF9lbmdpbmVfaGVhcnRiZWF0 LmgiCj4gICAjaW5jbHVkZSAiZ3QvaW50ZWxfZW5naW5lX3VzZXIuaCIKPiAtI2luY2x1ZGUgImd0 L2ludGVsX2V4ZWNsaXN0c19zdWJtaXNzaW9uLmgiIC8qIHZpcnR1YWxfZW5naW5lICovCj4gICAj aW5jbHVkZSAiZ3QvaW50ZWxfZ3B1X2NvbW1hbmRzLmgiCj4gICAjaW5jbHVkZSAiZ3QvaW50ZWxf cmluZy5oIgo+ICAgCj4gQEAgLTE1NjgsOSArMTU2Nyw2IEBAIHNldF9lbmdpbmVzX19sb2FkX2Jh bGFuY2Uoc3RydWN0IGk5MTVfdXNlcl9leHRlbnNpb24gX191c2VyICpiYXNlLCB2b2lkICpkYXRh KQo+ICAgCWlmICghSEFTX0VYRUNMSVNUUyhpOTE1KSkKPiAgIAkJcmV0dXJuIC1FTk9ERVY7Cj4g ICAKPiAtCWlmIChpbnRlbF91Y191c2VzX2d1Y19zdWJtaXNzaW9uKCZpOTE1LT5ndC51YykpCj4g LQkJcmV0dXJuIC1FTk9ERVY7IC8qIG5vdCBpbXBsZW1lbnQgeWV0ICovCj4gLQo+ICAgCWlmIChn ZXRfdXNlcihpZHgsICZleHQtPmVuZ2luZV9pbmRleCkpCj4gICAJCXJldHVybiAtRUZBVUxUOwo+ ICAgCj4gQEAgLTE2MjcsNyArMTYyMyw3IEBAIHNldF9lbmdpbmVzX19sb2FkX2JhbGFuY2Uoc3Ry dWN0IGk5MTVfdXNlcl9leHRlbnNpb24gX191c2VyICpiYXNlLCB2b2lkICpkYXRhKQo+ICAgCQl9 Cj4gICAJfQo+ICAgCj4gLQljZSA9IGludGVsX2V4ZWNsaXN0c19jcmVhdGVfdmlydHVhbChzaWJs aW5ncywgbik7Cj4gKwljZSA9IGludGVsX2VuZ2luZV9jcmVhdGVfdmlydHVhbChzaWJsaW5ncywg bik7Cj4gICAJaWYgKElTX0VSUihjZSkpIHsKPiAgIAkJZXJyID0gUFRSX0VSUihjZSk7Cj4gICAJ CWdvdG8gb3V0X3NpYmxpbmdzOwo+IEBAIC0xNzIzLDEzICsxNzE5LDkgQEAgc2V0X2VuZ2luZXNf X2JvbmQoc3RydWN0IGk5MTVfdXNlcl9leHRlbnNpb24gX191c2VyICpiYXNlLCB2b2lkICpkYXRh KQo+ICAgCQkgKiBBIG5vbi12aXJ0dWFsIGVuZ2luZSBoYXMgbm8gc2libGluZ3MgdG8gY2hvb3Nl IGJldHdlZW47IGFuZAo+ICAgCQkgKiBhIHN1Ym1pdCBmZW5jZSB3aWxsIGFsd2F5cyBiZSBkaXJl Y3RlZCB0byB0aGUgb25lIGVuZ2luZS4KPiAgIAkJICovCj4gLQkJaWYgKGludGVsX2VuZ2luZV9p c192aXJ0dWFsKHZpcnR1YWwpKSB7Cj4gLQkJCWVyciA9IGludGVsX3ZpcnR1YWxfZW5naW5lX2F0 dGFjaF9ib25kKHZpcnR1YWwsCj4gLQkJCQkJCQkgICAgICAgbWFzdGVyLAo+IC0JCQkJCQkJICAg ICAgIGJvbmQpOwo+IC0JCQlpZiAoZXJyKQo+IC0JCQkJcmV0dXJuIGVycjsKPiAtCQl9Cj4gKwkJ ZXJyID0gaW50ZWxfZW5naW5lX2F0dGFjaF9ib25kKHZpcnR1YWwsIG1hc3RlciwgYm9uZCk7Cj4g KwkJaWYgKGVycikKPiArCQkJcmV0dXJuIGVycjsKPiAgIAl9Cj4gICAKPiAgIAlyZXR1cm4gMDsK PiBAQCAtMjExNiw4ICsyMTA4LDcgQEAgc3RhdGljIGludCBjbG9uZV9lbmdpbmVzKHN0cnVjdCBp OTE1X2dlbV9jb250ZXh0ICpkc3QsCj4gICAJCSAqIHRoZSB2aXJ0dWFsIGVuZ2luZSBpbnN0ZWFk Lgo+ICAgCQkgKi8KPiAgIAkJaWYgKGludGVsX2VuZ2luZV9pc192aXJ0dWFsKGVuZ2luZSkpCj4g LQkJCWNsb25lLT5lbmdpbmVzW25dID0KPiAtCQkJCWludGVsX2V4ZWNsaXN0c19jbG9uZV92aXJ0 dWFsKGVuZ2luZSk7Cj4gKwkJCWNsb25lLT5lbmdpbmVzW25dID0gaW50ZWxfZW5naW5lX2Nsb25l X3ZpcnR1YWwoZW5naW5lKTsKPiAgIAkJZWxzZQo+ICAgCQkJY2xvbmUtPmVuZ2luZXNbbl0gPSBp bnRlbF9jb250ZXh0X2NyZWF0ZShlbmdpbmUpOwo+ICAgCQlpZiAoSVNfRVJSX09SX05VTEwoY2xv bmUtPmVuZ2luZXNbbl0pKSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9pOTE1X2dlbV9jb250ZXh0LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1f Y29udGV4dC5oCj4gaW5kZXggYjVjOTA4ZjNmNGYyLi5iYTc3Mjc2MmY3YjkgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NvbnRleHQuaAo+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9jb250ZXh0LmgKPiBAQCAtMTAsNiArMTAs NyBAQAo+ICAgI2luY2x1ZGUgImk5MTVfZ2VtX2NvbnRleHRfdHlwZXMuaCIKPiAgIAo+ICAgI2lu Y2x1ZGUgImd0L2ludGVsX2NvbnRleHQuaCIKPiArI2luY2x1ZGUgImd0L2ludGVsX2VuZ2luZS5o Igo+ICAgCj4gICAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKPiAgICNpbmNsdWRlICJpOTE1X2dlbS5o Igo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3R5 cGVzLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3R5cGVzLmgKPiBp bmRleCBlN2FmNmEyMzY4ZjguLjY5NDU5NjNhMzFiYSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3R5cGVzLmgKPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3R5cGVzLmgKPiBAQCAtNDcsNiArNDcsMTYgQEAgc3Ry dWN0IGludGVsX2NvbnRleHRfb3BzIHsKPiAgIAo+ICAgCXZvaWQgKCpyZXNldCkoc3RydWN0IGlu dGVsX2NvbnRleHQgKmNlKTsKPiAgIAl2b2lkICgqZGVzdHJveSkoc3RydWN0IGtyZWYgKmtyZWYp Owo+ICsKPiArCS8qIHZpcnR1YWwgZW5naW5lL2NvbnRleHQgaW50ZXJmYWNlICovCj4gKwlzdHJ1 Y3QgaW50ZWxfY29udGV4dCAqKCpjcmVhdGVfdmlydHVhbCkoc3RydWN0IGludGVsX2VuZ2luZV9j cyAqKmVuZ2luZSwKPiArCQkJCQkJdW5zaWduZWQgaW50IGNvdW50KTsKPiArCXN0cnVjdCBpbnRl bF9jb250ZXh0ICooKmNsb25lX3ZpcnR1YWwpKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2lu ZSk7Cj4gKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICooKmdldF9zaWJsaW5nKShzdHJ1Y3QgaW50 ZWxfZW5naW5lX2NzICplbmdpbmUsCj4gKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBzaWJsaW5n KTsKPiArCWludCAoKmF0dGFjaF9ib25kKShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUs Cj4gKwkJCSAgIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKm1hc3RlciwKPiArCQkJICAg Y29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqc2libGluZyk7CgpDbG9uaW5nIGFuZCBib25k aW5nIGZvciBWRSBoYXZlIGJlZW4gcmVtb3ZlZCwgc28gY2FuIGJlIGRyb3BwZWQuIEknbGwgCnNr aXAgcmV2aWV3aW5nIGFsbCB0aGUgcmVsYXRlZCBjb2RlIGluIHRoaXMgcGF0Y2guCgo+ICAgfTsK PiAgIAo+ICAgc3RydWN0IGludGVsX2NvbnRleHQgewo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9lbmdpbmUuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2lu dGVsX2VuZ2luZS5oCj4gaW5kZXggZjkxMWMxMjI0YWIyLi45MjNlYWVlNjI3YjMgMTAwNjQ0Cj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZW5naW5lLmgKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9lbmdpbmUuaAo+IEBAIC0yNzMsMTMgKzI3Myw1NiBA QCBpbnRlbF9lbmdpbmVfaGFzX3ByZWVtcHRfcmVzZXQoY29uc3Qgc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lKQo+ICAgCXJldHVybiBpbnRlbF9lbmdpbmVfaGFzX3ByZWVtcHRpb24oZW5n aW5lKTsKPiAgIH0KPiAgIAo+ICtzdHJ1Y3QgaW50ZWxfY29udGV4dCAqCj4gK2ludGVsX2VuZ2lu ZV9jcmVhdGVfdmlydHVhbChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoqc2libGluZ3MsCj4gKwkJ CSAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+ICsKPiArc3RhdGljIGlubGluZSBib29sCj4gK2lu dGVsX3ZpcnR1YWxfZW5naW5lX2hhc19oZWFydGJlYXQoY29uc3Qgc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lKQo+ICt7Cj4gKwlpZiAoaW50ZWxfZW5naW5lX3VzZXNfZ3VjKGVuZ2luZSkp Cj4gKwkJcmV0dXJuIGludGVsX2d1Y192aXJ0dWFsX2VuZ2luZV9oYXNfaGVhcnRiZWF0KGVuZ2lu ZSk7Cj4gKwllbHNlCj4gKwkJR0VNX0JVR19PTigiT25seSBzaG91bGQgYmUgY2FsbGVkIGluIEd1 QyBzdWJtaXNzaW9uIik7Cj4gKwo+ICsJcmV0dXJuIGZhbHNlOwo+ICt9CgpUaGlzIGNvdWxkIHVz ZSBhIGJldHRlciBleHBsYW5hdGlvbi4gTWF5YmUgc29tZXRoaW5nIGxpa2U6CgpzdGF0aWMgaW5s aW5lIGJvb2wKaW50ZWxfdmlydHVhbF9lbmdpbmVfaGFzX2hlYXJ0YmVhdChjb25zdCBzdHJ1Y3Qg aW50ZWxfZW5naW5lX2NzICplbmdpbmUpCnsKCS8qCgkgKiBGb3Igbm9uLUd1QyBzdWJtaXNzaW9u IHdlIGV4cGVjdCB0aGUgYmFjay1lbmQgdG8gbG9vayBhdCB0aGUKCSAqIGhlYXJ0YmVhdCBzdGF0 dXMgb2YgdGhlIGFjdHVhbCBwaHlzaWNhbCBlbmdpbmUgdGhhdCB0aGUgd29yawoJICogaGFzIGJl ZW4gKG9yIGlzIGJlaW5nKSBzY2hlZHVsZWQgb24sIHNvIHdlIHNob3VsZCBvbmx5IHJlYWNoCgkg KiBoZXJlIHdpdGggR3VDIHN1Ym1pc3Npb24gZW5hYmxlZC4KIMKgCSAqLwoJR0VNX0JVR19PTigh aW50ZWxfZW5naW5lX3VzZXNfZ3VjKGVuZ2luZSkpOwoKCXJldHVybiBpbnRlbF9ndWNfdmlydHVh bF9lbmdpbmVfaGFzX2hlYXJ0YmVhdChlbmdpbmUpOwp9CgoKPiArCj4gICBzdGF0aWMgaW5saW5l IGJvb2wKPiAgIGludGVsX2VuZ2luZV9oYXNfaGVhcnRiZWF0KGNvbnN0IHN0cnVjdCBpbnRlbF9l bmdpbmVfY3MgKmVuZ2luZSkKPiAgIHsKPiAgIAlpZiAoIUlTX0FDVElWRShDT05GSUdfRFJNX0k5 MTVfSEVBUlRCRUFUX0lOVEVSVkFMKSkKPiAgIAkJcmV0dXJuIGZhbHNlOwo+ICAgCj4gLQlyZXR1 cm4gUkVBRF9PTkNFKGVuZ2luZS0+cHJvcHMuaGVhcnRiZWF0X2ludGVydmFsX21zKTsKPiArCWlm IChpbnRlbF9lbmdpbmVfaXNfdmlydHVhbChlbmdpbmUpKQo+ICsJCXJldHVybiBpbnRlbF92aXJ0 dWFsX2VuZ2luZV9oYXNfaGVhcnRiZWF0KGVuZ2luZSk7Cj4gKwllbHNlCj4gKwkJcmV0dXJuIFJF QURfT05DRShlbmdpbmUtPnByb3BzLmhlYXJ0YmVhdF9pbnRlcnZhbF9tcyk7Cj4gK30KPiArCj4g K3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2NvbnRleHQgKgo+ICtpbnRlbF9lbmdpbmVfY2xv bmVfdmlydHVhbChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpzcmMpCj4gK3sKPiArCUdFTV9CVUdf T04oIWludGVsX2VuZ2luZV9pc192aXJ0dWFsKHNyYykpOwo+ICsJcmV0dXJuIHNyYy0+Y29wcy0+ Y2xvbmVfdmlydHVhbChzcmMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGludAo+ICtpbnRl bF9lbmdpbmVfYXR0YWNoX2JvbmQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLAo+ICsJ CQkgY29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqbWFzdGVyLAo+ICsJCQkgY29uc3Qgc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqc2libGluZykKPiArewo+ICsJaWYgKCFlbmdpbmUtPmNvcHMt PmF0dGFjaF9ib25kKQo+ICsJCXJldHVybiAwOwo+ICsKPiArCXJldHVybiBlbmdpbmUtPmNvcHMt PmF0dGFjaF9ib25kKGVuZ2luZSwgbWFzdGVyLCBzaWJsaW5nKTsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoKPiAraW50ZWxfZW5naW5lX2dldF9zaWJs aW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwgdW5zaWduZWQgaW50IHNpYmxpbmcp Cj4gK3sKPiArCUdFTV9CVUdfT04oIWludGVsX2VuZ2luZV9pc192aXJ0dWFsKGVuZ2luZSkpOwo+ ICsJcmV0dXJuIGVuZ2luZS0+Y29wcy0+Z2V0X3NpYmxpbmcoZW5naW5lLCBzaWJsaW5nKTsKPiAg IH0KPiAgIAo+ICAgI2VuZGlmIC8qIF9JTlRFTF9SSU5HQlVGRkVSX0hfICovCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2VuZ2luZV9jcy5jIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ3QvaW50ZWxfZW5naW5lX2NzLmMKPiBpbmRleCA4ODY5NDgyMjcxNmEuLmQx M2IxNzE2YzI5ZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9l bmdpbmVfY3MuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2VuZ2luZV9j cy5jCj4gQEAgLTE3MzYsNiArMTczNiwyMCBAQCBrdGltZV90IGludGVsX2VuZ2luZV9nZXRfYnVz eV90aW1lKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwga3RpbWVfdCAqbm93KQo+ICAg CXJldHVybiB0b3RhbDsKPiAgIH0KPiAgIAo+ICtzdHJ1Y3QgaW50ZWxfY29udGV4dCAqCj4gK2lu dGVsX2VuZ2luZV9jcmVhdGVfdmlydHVhbChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoqc2libGlu Z3MsCj4gKwkJCSAgICB1bnNpZ25lZCBpbnQgY291bnQpCj4gK3sKPiArCWlmIChjb3VudCA9PSAw KQo+ICsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+ICsKPiArCWlmIChjb3VudCA9PSAxKQo+ ICsJCXJldHVybiBpbnRlbF9jb250ZXh0X2NyZWF0ZShzaWJsaW5nc1swXSk7Cj4gKwo+ICsJR0VN X0JVR19PTighc2libGluZ3NbMF0tPmNvcHMtPmNyZWF0ZV92aXJ0dWFsKTsKPiArCXJldHVybiBz aWJsaW5nc1swXS0+Y29wcy0+Y3JlYXRlX3ZpcnR1YWwoc2libGluZ3MsIGNvdW50KTsKPiArfQo+ ICsKPiAgIHN0YXRpYyBib29sIG1hdGNoX3Jpbmcoc3RydWN0IGk5MTVfcmVxdWVzdCAqcnEpCj4g ICB7Cj4gICAJdTMyIHJpbmcgPSBFTkdJTkVfUkVBRChycS0+ZW5naW5lLCBSSU5HX1NUQVJUKTsK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZXhlY2xpc3RzX3N1 Ym1pc3Npb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2V4ZWNsaXN0c19zdWJt aXNzaW9uLmMKPiBpbmRleCBjZGIyMTI2YTE1OWEuLmJkNGNlZDc5NGZmOSAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9leGVjbGlzdHNfc3VibWlzc2lvbi5jCj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24u Ywo+IEBAIC0yMDUsNiArMjA1LDkgQEAgc3RhdGljIHN0cnVjdCB2aXJ0dWFsX2VuZ2luZSAqdG9f dmlydHVhbF9lbmdpbmUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQo+ICAgCXJldHVy biBjb250YWluZXJfb2YoZW5naW5lLCBzdHJ1Y3QgdmlydHVhbF9lbmdpbmUsIGJhc2UpOwo+ICAg fQo+ICAgCj4gK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqCj4gK2V4ZWNsaXN0c19jcmVh dGVfdmlydHVhbChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoqc2libGluZ3MsIHVuc2lnbmVkIGlu dCBjb3VudCk7Cj4gKwo+ICAgc3RhdGljIHN0cnVjdCBpOTE1X3JlcXVlc3QgKgo+ICAgX19hY3Rp dmVfcmVxdWVzdChjb25zdCBzdHJ1Y3QgaW50ZWxfdGltZWxpbmUgKiBjb25zdCB0bCwKPiAgIAkJ IHN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxLAo+IEBAIC0yNTYwLDYgKzI1NjMsOCBAQCBzdGF0aWMg Y29uc3Qgc3RydWN0IGludGVsX2NvbnRleHRfb3BzIGV4ZWNsaXN0c19jb250ZXh0X29wcyA9IHsK PiAgIAo+ICAgCS5yZXNldCA9IGxyY19yZXNldCwKPiAgIAkuZGVzdHJveSA9IGxyY19kZXN0cm95 LAo+ICsKPiArCS5jcmVhdGVfdmlydHVhbCA9IGV4ZWNsaXN0c19jcmVhdGVfdmlydHVhbCwKPiAg IH07Cj4gICAKPiAgIHN0YXRpYyBpbnQgZW1pdF9wZHBzKHN0cnVjdCBpOTE1X3JlcXVlc3QgKnJx KQo+IEBAIC0zNTA2LDYgKzM1MTEsOTQgQEAgc3RhdGljIHZvaWQgdmlydHVhbF9jb250ZXh0X2V4 aXQoc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQo+ICAgCQlpbnRlbF9lbmdpbmVfcG1fcHV0KHZl LT5zaWJsaW5nc1tuXSk7Cj4gICB9Cj4gICAKPiArc3RhdGljIHN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKgo+ICt2aXJ0dWFsX2dldF9zaWJsaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2lu ZSwgdW5zaWduZWQgaW50IHNpYmxpbmcpCj4gK3sKPiArCXN0cnVjdCB2aXJ0dWFsX2VuZ2luZSAq dmUgPSB0b192aXJ0dWFsX2VuZ2luZShlbmdpbmUpOwo+ICsKPiArCWlmIChzaWJsaW5nID49IHZl LT5udW1fc2libGluZ3MpCj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwo+ICsJcmV0dXJuIHZlLT5zaWJs aW5nc1tzaWJsaW5nXTsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBpbnRlbF9jb250ZXh0ICoK PiArdmlydHVhbF9jbG9uZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpzcmMpCj4gK3sKPiArCXN0 cnVjdCB2aXJ0dWFsX2VuZ2luZSAqc2UgPSB0b192aXJ0dWFsX2VuZ2luZShzcmMpOwo+ICsJc3Ry dWN0IGludGVsX2NvbnRleHQgKmRzdDsKPiArCj4gKwlkc3QgPSBleGVjbGlzdHNfY3JlYXRlX3Zp cnR1YWwoc2UtPnNpYmxpbmdzLCBzZS0+bnVtX3NpYmxpbmdzKTsKPiArCWlmIChJU19FUlIoZHN0 KSkKPiArCQlyZXR1cm4gZHN0Owo+ICsKPiArCWlmIChzZS0+bnVtX2JvbmRzKSB7Cj4gKwkJc3Ry dWN0IHZpcnR1YWxfZW5naW5lICpkZSA9IHRvX3ZpcnR1YWxfZW5naW5lKGRzdC0+ZW5naW5lKTsK PiArCj4gKwkJZGUtPmJvbmRzID0ga21lbWR1cChzZS0+Ym9uZHMsCj4gKwkJCQkgICAgc2l6ZW9m KCpzZS0+Ym9uZHMpICogc2UtPm51bV9ib25kcywKPiArCQkJCSAgICBHRlBfS0VSTkVMKTsKPiAr CQlpZiAoIWRlLT5ib25kcykgewo+ICsJCQlpbnRlbF9jb250ZXh0X3B1dChkc3QpOwo+ICsJCQly ZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKPiArCQl9Cj4gKwo+ICsJCWRlLT5udW1fYm9uZHMgPSBz ZS0+bnVtX2JvbmRzOwo+ICsJfQo+ICsKPiArCXJldHVybiBkc3Q7Cj4gK30KPiArCj4gK3N0YXRp YyBzdHJ1Y3QgdmVfYm9uZCAqCj4gK3ZpcnR1YWxfZmluZF9ib25kKHN0cnVjdCB2aXJ0dWFsX2Vu Z2luZSAqdmUsCj4gKwkJICBjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICptYXN0ZXIpCj4g K3sKPiArCWludCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCB2ZS0+bnVtX2JvbmRzOyBpKysp IHsKPiArCQlpZiAodmUtPmJvbmRzW2ldLm1hc3RlciA9PSBtYXN0ZXIpCj4gKwkJCXJldHVybiAm dmUtPmJvbmRzW2ldOwo+ICsJfQo+ICsKPiArCXJldHVybiBOVUxMOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IHZpcnR1YWxfYXR0YWNoX2JvbmQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l LAo+ICsJCQkgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqbWFzdGVyLAo+ICsJ CQkgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqc2libGluZykKPiArewo+ICsJ c3RydWN0IHZpcnR1YWxfZW5naW5lICp2ZSA9IHRvX3ZpcnR1YWxfZW5naW5lKGVuZ2luZSk7Cj4g KwlzdHJ1Y3QgdmVfYm9uZCAqYm9uZDsKPiArCWludCBuOwo+ICsKPiArCS8qIFNhbml0eSBjaGVj ayB0aGUgc2libGluZyBpcyBwYXJ0IG9mIHRoZSB2aXJ0dWFsIGVuZ2luZSAqLwo+ICsJZm9yIChu ID0gMDsgbiA8IHZlLT5udW1fc2libGluZ3M7IG4rKykKPiArCQlpZiAoc2libGluZyA9PSB2ZS0+ c2libGluZ3Nbbl0pCj4gKwkJCWJyZWFrOwo+ICsJaWYgKG4gPT0gdmUtPm51bV9zaWJsaW5ncykK PiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlib25kID0gdmlydHVhbF9maW5kX2JvbmQodmUs IG1hc3Rlcik7Cj4gKwlpZiAoYm9uZCkgewo+ICsJCWJvbmQtPnNpYmxpbmdfbWFzayB8PSBzaWJs aW5nLT5tYXNrOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCWJvbmQgPSBrcmVhbGxvYyh2 ZS0+Ym9uZHMsCj4gKwkJCXNpemVvZigqYm9uZCkgKiAodmUtPm51bV9ib25kcyArIDEpLAo+ICsJ CQlHRlBfS0VSTkVMKTsKPiArCWlmICghYm9uZCkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4g Kwlib25kW3ZlLT5udW1fYm9uZHNdLm1hc3RlciA9IG1hc3RlcjsKPiArCWJvbmRbdmUtPm51bV9i b25kc10uc2libGluZ19tYXNrID0gc2libGluZy0+bWFzazsKPiArCj4gKwl2ZS0+Ym9uZHMgPSBi b25kOwo+ICsJdmUtPm51bV9ib25kcysrOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICAg c3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0X29wcyB2aXJ0dWFsX2NvbnRleHRfb3Bz ID0gewo+ICAgCS5mbGFncyA9IENPUFNfSEFTX0lORkxJR0hULAo+ICAgCj4gQEAgLTM1MjAsNiAr MzYxMywxMCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHRfb3BzIHZpcnR1YWxf Y29udGV4dF9vcHMgPSB7Cj4gICAJLmV4aXQgPSB2aXJ0dWFsX2NvbnRleHRfZXhpdCwKPiAgIAo+ ICAgCS5kZXN0cm95ID0gdmlydHVhbF9jb250ZXh0X2Rlc3Ryb3ksCj4gKwo+ICsJLmNsb25lX3Zp cnR1YWwgPSB2aXJ0dWFsX2Nsb25lLAo+ICsJLmdldF9zaWJsaW5nID0gdmlydHVhbF9nZXRfc2li bGluZywKPiArCS5hdHRhY2hfYm9uZCA9IHZpcnR1YWxfYXR0YWNoX2JvbmQsCj4gICB9Owo+ICAg Cj4gICBzdGF0aWMgaW50ZWxfZW5naW5lX21hc2tfdCB2aXJ0dWFsX3N1Ym1pc3Npb25fbWFzayhz dHJ1Y3QgdmlydHVhbF9lbmdpbmUgKnZlKQo+IEBAIC0zNjY4LDIwICszNzY1LDYgQEAgc3RhdGlj IHZvaWQgdmlydHVhbF9zdWJtaXRfcmVxdWVzdChzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKPiAg IAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZS0+YmFzZS5zY2hlZF9lbmdpbmUtPmxvY2ssIGZs YWdzKTsKPiAgIH0KPiAgIAo+IC1zdGF0aWMgc3RydWN0IHZlX2JvbmQgKgo+IC12aXJ0dWFsX2Zp bmRfYm9uZChzdHJ1Y3QgdmlydHVhbF9lbmdpbmUgKnZlLAo+IC0JCSAgY29uc3Qgc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqbWFzdGVyKQo+IC17Cj4gLQlpbnQgaTsKPiAtCj4gLQlmb3IgKGkgPSAw OyBpIDwgdmUtPm51bV9ib25kczsgaSsrKSB7Cj4gLQkJaWYgKHZlLT5ib25kc1tpXS5tYXN0ZXIg PT0gbWFzdGVyKQo+IC0JCQlyZXR1cm4gJnZlLT5ib25kc1tpXTsKPiAtCX0KPiAtCj4gLQlyZXR1 cm4gTlVMTDsKPiAtfQo+IC0KPiAgIHN0YXRpYyB2b2lkCj4gICB2aXJ0dWFsX2JvbmRfZXhlY3V0 ZShzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSwgc3RydWN0IGRtYV9mZW5jZSAqc2lnbmFsKQo+ICAg ewo+IEBAIC0zNzA0LDIwICszNzg3LDEzIEBAIHZpcnR1YWxfYm9uZF9leGVjdXRlKHN0cnVjdCBp OTE1X3JlcXVlc3QgKnJxLCBzdHJ1Y3QgZG1hX2ZlbmNlICpzaWduYWwpCj4gICAJdG9fcmVxdWVz dChzaWduYWwpLT5leGVjdXRpb25fbWFzayAmPSB+YWxsb3dlZDsKPiAgIH0KPiAgIAo+IC1zdHJ1 Y3QgaW50ZWxfY29udGV4dCAqCj4gLWludGVsX2V4ZWNsaXN0c19jcmVhdGVfdmlydHVhbChzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICoqc2libGluZ3MsCj4gLQkJCSAgICAgICB1bnNpZ25lZCBpbnQg Y291bnQpCj4gK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqCj4gK2V4ZWNsaXN0c19jcmVh dGVfdmlydHVhbChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoqc2libGluZ3MsIHVuc2lnbmVkIGlu dCBjb3VudCkKPiAgIHsKPiAgIAlzdHJ1Y3QgdmlydHVhbF9lbmdpbmUgKnZlOwo+ICAgCXVuc2ln bmVkIGludCBuOwo+ICAgCWludCBlcnI7Cj4gICAKPiAtCWlmIChjb3VudCA9PSAwKQo+IC0JCXJl dHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+IC0KPiAtCWlmIChjb3VudCA9PSAxKQo+IC0JCXJldHVy biBpbnRlbF9jb250ZXh0X2NyZWF0ZShzaWJsaW5nc1swXSk7Cj4gLQo+ICAgCXZlID0ga3phbGxv YyhzdHJ1Y3Rfc2l6ZSh2ZSwgc2libGluZ3MsIGNvdW50KSwgR0ZQX0tFUk5FTCk7Cj4gICAJaWYg KCF2ZSkKPiAgIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gQEAgLTM4NTAsNzAgKzM5MjYs NiBAQCBpbnRlbF9leGVjbGlzdHNfY3JlYXRlX3ZpcnR1YWwoc3RydWN0IGludGVsX2VuZ2luZV9j cyAqKnNpYmxpbmdzLAo+ICAgCXJldHVybiBFUlJfUFRSKGVycik7Cj4gICB9Cj4gICAKPiAtc3Ry dWN0IGludGVsX2NvbnRleHQgKgo+IC1pbnRlbF9leGVjbGlzdHNfY2xvbmVfdmlydHVhbChzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICpzcmMpCj4gLXsKPiAtCXN0cnVjdCB2aXJ0dWFsX2VuZ2luZSAq c2UgPSB0b192aXJ0dWFsX2VuZ2luZShzcmMpOwo+IC0Jc3RydWN0IGludGVsX2NvbnRleHQgKmRz dDsKPiAtCj4gLQlkc3QgPSBpbnRlbF9leGVjbGlzdHNfY3JlYXRlX3ZpcnR1YWwoc2UtPnNpYmxp bmdzLAo+IC0JCQkJCSAgICAgc2UtPm51bV9zaWJsaW5ncyk7Cj4gLQlpZiAoSVNfRVJSKGRzdCkp Cj4gLQkJcmV0dXJuIGRzdDsKPiAtCj4gLQlpZiAoc2UtPm51bV9ib25kcykgewo+IC0JCXN0cnVj dCB2aXJ0dWFsX2VuZ2luZSAqZGUgPSB0b192aXJ0dWFsX2VuZ2luZShkc3QtPmVuZ2luZSk7Cj4g LQo+IC0JCWRlLT5ib25kcyA9IGttZW1kdXAoc2UtPmJvbmRzLAo+IC0JCQkJICAgIHNpemVvZigq c2UtPmJvbmRzKSAqIHNlLT5udW1fYm9uZHMsCj4gLQkJCQkgICAgR0ZQX0tFUk5FTCk7Cj4gLQkJ aWYgKCFkZS0+Ym9uZHMpIHsKPiAtCQkJaW50ZWxfY29udGV4dF9wdXQoZHN0KTsKPiAtCQkJcmV0 dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gLQkJfQo+IC0KPiAtCQlkZS0+bnVtX2JvbmRzID0gc2Ut Pm51bV9ib25kczsKPiAtCX0KPiAtCj4gLQlyZXR1cm4gZHN0Owo+IC19Cj4gLQo+IC1pbnQgaW50 ZWxfdmlydHVhbF9lbmdpbmVfYXR0YWNoX2JvbmQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lLAo+IC0JCQkJICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICptYXN0ZXIsCj4g LQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnNpYmxpbmcpCj4gLXsKPiAt CXN0cnVjdCB2aXJ0dWFsX2VuZ2luZSAqdmUgPSB0b192aXJ0dWFsX2VuZ2luZShlbmdpbmUpOwo+ IC0Jc3RydWN0IHZlX2JvbmQgKmJvbmQ7Cj4gLQlpbnQgbjsKPiAtCj4gLQkvKiBTYW5pdHkgY2hl Y2sgdGhlIHNpYmxpbmcgaXMgcGFydCBvZiB0aGUgdmlydHVhbCBlbmdpbmUgKi8KPiAtCWZvciAo biA9IDA7IG4gPCB2ZS0+bnVtX3NpYmxpbmdzOyBuKyspCj4gLQkJaWYgKHNpYmxpbmcgPT0gdmUt PnNpYmxpbmdzW25dKQo+IC0JCQlicmVhazsKPiAtCWlmIChuID09IHZlLT5udW1fc2libGluZ3Mp Cj4gLQkJcmV0dXJuIC1FSU5WQUw7Cj4gLQo+IC0JYm9uZCA9IHZpcnR1YWxfZmluZF9ib25kKHZl LCBtYXN0ZXIpOwo+IC0JaWYgKGJvbmQpIHsKPiAtCQlib25kLT5zaWJsaW5nX21hc2sgfD0gc2li bGluZy0+bWFzazsKPiAtCQlyZXR1cm4gMDsKPiAtCX0KPiAtCj4gLQlib25kID0ga3JlYWxsb2Mo dmUtPmJvbmRzLAo+IC0JCQlzaXplb2YoKmJvbmQpICogKHZlLT5udW1fYm9uZHMgKyAxKSwKPiAt CQkJR0ZQX0tFUk5FTCk7Cj4gLQlpZiAoIWJvbmQpCj4gLQkJcmV0dXJuIC1FTk9NRU07Cj4gLQo+ IC0JYm9uZFt2ZS0+bnVtX2JvbmRzXS5tYXN0ZXIgPSBtYXN0ZXI7Cj4gLQlib25kW3ZlLT5udW1f Ym9uZHNdLnNpYmxpbmdfbWFzayA9IHNpYmxpbmctPm1hc2s7Cj4gLQo+IC0JdmUtPmJvbmRzID0g Ym9uZDsKPiAtCXZlLT5udW1fYm9uZHMrKzsKPiAtCj4gLQlyZXR1cm4gMDsKPiAtfQo+IC0KPiAg IHZvaWQgaW50ZWxfZXhlY2xpc3RzX3Nob3dfcmVxdWVzdHMoc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lLAo+ICAgCQkJCSAgIHN0cnVjdCBkcm1fcHJpbnRlciAqbSwKPiAgIAkJCQkgICB2 b2lkICgqc2hvd19yZXF1ZXN0KShzdHJ1Y3QgZHJtX3ByaW50ZXIgKm0sCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2V4ZWNsaXN0c19zdWJtaXNzaW9uLmggYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9leGVjbGlzdHNfc3VibWlzc2lvbi5oCj4gaW5k ZXggNGNhOWI0NzVlMjUyLi43NDA0MWIxOTk0YWYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvZ3QvaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24uaAo+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d0L2ludGVsX2V4ZWNsaXN0c19zdWJtaXNzaW9uLmgKPiBAQCAtMzIsMTUg KzMyLDQgQEAgdm9pZCBpbnRlbF9leGVjbGlzdHNfc2hvd19yZXF1ZXN0cyhzdHJ1Y3QgaW50ZWxf ZW5naW5lX2NzICplbmdpbmUsCj4gICAJCQkJCQkJaW50IGluZGVudCksCj4gICAJCQkJICAgdW5z aWduZWQgaW50IG1heCk7Cj4gICAKPiAtc3RydWN0IGludGVsX2NvbnRleHQgKgo+IC1pbnRlbF9l eGVjbGlzdHNfY3JlYXRlX3ZpcnR1YWwoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqKnNpYmxpbmdz LAo+IC0JCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKPiAtCj4gLXN0cnVjdCBpbnRlbF9j b250ZXh0ICoKPiAtaW50ZWxfZXhlY2xpc3RzX2Nsb25lX3ZpcnR1YWwoc3RydWN0IGludGVsX2Vu Z2luZV9jcyAqc3JjKTsKPiAtCj4gLWludCBpbnRlbF92aXJ0dWFsX2VuZ2luZV9hdHRhY2hfYm9u ZChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCj4gLQkJCQkgICAgIGNvbnN0IHN0cnVj dCBpbnRlbF9lbmdpbmVfY3MgKm1hc3RlciwKPiAtCQkJCSAgICAgY29uc3Qgc3RydWN0IGludGVs X2VuZ2luZV9jcyAqc2libGluZyk7Cj4gLQo+ICAgI2VuZGlmIC8qIF9fSU5URUxfRVhFQ0xJU1RT X1NVQk1JU1NJT05fSF9fICovCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0 L3NlbGZ0ZXN0X2V4ZWNsaXN0cy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qvc2VsZnRlc3Rf ZXhlY2xpc3RzLmMKPiBpbmRleCAwODg5NmFlMDI3ZDUuLjg4YWFjOTk3N2UwOSAxMDA2NDQKPiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9zZWxmdGVzdF9leGVjbGlzdHMuYwo+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3NlbGZ0ZXN0X2V4ZWNsaXN0cy5jCj4gQEAgLTM3Mjcs NyArMzcyNyw3IEBAIHN0YXRpYyBpbnQgbm9wX3ZpcnR1YWxfZW5naW5lKHN0cnVjdCBpbnRlbF9n dCAqZ3QsCj4gICAJR0VNX0JVR19PTighbmN0eCB8fCBuY3R4ID4gQVJSQVlfU0laRSh2ZSkpOwo+ ICAgCj4gICAJZm9yIChuID0gMDsgbiA8IG5jdHg7IG4rKykgewo+IC0JCXZlW25dID0gaW50ZWxf ZXhlY2xpc3RzX2NyZWF0ZV92aXJ0dWFsKHNpYmxpbmdzLCBuc2libGluZyk7Cj4gKwkJdmVbbl0g PSBpbnRlbF9lbmdpbmVfY3JlYXRlX3ZpcnR1YWwoc2libGluZ3MsIG5zaWJsaW5nKTsKPiAgIAkJ aWYgKElTX0VSUih2ZVtuXSkpIHsKPiAgIAkJCWVyciA9IFBUUl9FUlIodmVbbl0pOwo+ICAgCQkJ bmN0eCA9IG47Cj4gQEAgLTM5MjMsNyArMzkyMyw3IEBAIHN0YXRpYyBpbnQgbWFza192aXJ0dWFs X2VuZ2luZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0LAo+ICAgCSAqIHJlc3RyaWN0IGl0IHRvIG91ciBk ZXNpcmVkIGVuZ2luZSB3aXRoaW4gdGhlIHZpcnR1YWwgZW5naW5lLgo+ICAgCSAqLwo+ICAgCj4g LQl2ZSA9IGludGVsX2V4ZWNsaXN0c19jcmVhdGVfdmlydHVhbChzaWJsaW5ncywgbnNpYmxpbmcp Owo+ICsJdmUgPSBpbnRlbF9lbmdpbmVfY3JlYXRlX3ZpcnR1YWwoc2libGluZ3MsIG5zaWJsaW5n KTsKPiAgIAlpZiAoSVNfRVJSKHZlKSkgewo+ICAgCQllcnIgPSBQVFJfRVJSKHZlKTsKPiAgIAkJ Z290byBvdXRfY2xvc2U7Cj4gQEAgLTQwNTQsNyArNDA1NCw3IEBAIHN0YXRpYyBpbnQgc2xpY2Vp bl92aXJ0dWFsX2VuZ2luZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0LAo+ICAgCQlpOTE1X3JlcXVlc3Rf YWRkKHJxKTsKPiAgIAl9Cj4gICAKPiAtCWNlID0gaW50ZWxfZXhlY2xpc3RzX2NyZWF0ZV92aXJ0 dWFsKHNpYmxpbmdzLCBuc2libGluZyk7Cj4gKwljZSA9IGludGVsX2VuZ2luZV9jcmVhdGVfdmly dHVhbChzaWJsaW5ncywgbnNpYmxpbmcpOwo+ICAgCWlmIChJU19FUlIoY2UpKSB7Cj4gICAJCWVy ciA9IFBUUl9FUlIoY2UpOwo+ICAgCQlnb3RvIG91dDsKPiBAQCAtNDEwNiw3ICs0MTA2LDcgQEAg c3RhdGljIGludCBzbGljZW91dF92aXJ0dWFsX2VuZ2luZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0LAo+ ICAgCj4gICAJLyogWFhYIFdlIGRvIG5vdCBoYW5kbGUgb3ZlcnN1YnNjcmlwdGlvbiBhbmQgZmFp cm5lc3Mgd2l0aCBub3JtYWwgcnEgKi8KPiAgIAlmb3IgKG4gPSAwOyBuIDwgbnNpYmxpbmc7IG4r Kykgewo+IC0JCWNlID0gaW50ZWxfZXhlY2xpc3RzX2NyZWF0ZV92aXJ0dWFsKHNpYmxpbmdzLCBu c2libGluZyk7Cj4gKwkJY2UgPSBpbnRlbF9lbmdpbmVfY3JlYXRlX3ZpcnR1YWwoc2libGluZ3Ms IG5zaWJsaW5nKTsKPiAgIAkJaWYgKElTX0VSUihjZSkpIHsKPiAgIAkJCWVyciA9IFBUUl9FUlIo Y2UpOwo+ICAgCQkJZ290byBvdXQ7Cj4gQEAgLTQyMDgsNyArNDIwOCw3IEBAIHN0YXRpYyBpbnQg cHJlc2VydmVkX3ZpcnR1YWxfZW5naW5lKHN0cnVjdCBpbnRlbF9ndCAqZ3QsCj4gICAJaWYgKGVy cikKPiAgIAkJZ290byBvdXRfc2NyYXRjaDsKPiAgIAo+IC0JdmUgPSBpbnRlbF9leGVjbGlzdHNf Y3JlYXRlX3ZpcnR1YWwoc2libGluZ3MsIG5zaWJsaW5nKTsKPiArCXZlID0gaW50ZWxfZW5naW5l X2NyZWF0ZV92aXJ0dWFsKHNpYmxpbmdzLCBuc2libGluZyk7Cj4gICAJaWYgKElTX0VSUih2ZSkp IHsKPiAgIAkJZXJyID0gUFRSX0VSUih2ZSk7Cj4gICAJCWdvdG8gb3V0X3NjcmF0Y2g7Cj4gQEAg LTQ0MzEsMTYgKzQ0MzEsMTYgQEAgc3RhdGljIGludCBib25kX3ZpcnR1YWxfZW5naW5lKHN0cnVj dCBpbnRlbF9ndCAqZ3QsCj4gICAJCWZvciAobiA9IDA7IG4gPCBuc2libGluZzsgbisrKSB7Cj4g ICAJCQlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqdmU7Cj4gICAKPiAtCQkJdmUgPSBpbnRlbF9leGVj bGlzdHNfY3JlYXRlX3ZpcnR1YWwoc2libGluZ3MsIG5zaWJsaW5nKTsKPiArCQkJdmUgPSBpbnRl bF9lbmdpbmVfY3JlYXRlX3ZpcnR1YWwoc2libGluZ3MsIG5zaWJsaW5nKTsKPiAgIAkJCWlmIChJ U19FUlIodmUpKSB7Cj4gICAJCQkJZXJyID0gUFRSX0VSUih2ZSk7Cj4gICAJCQkJb25zdGFja19m ZW5jZV9maW5pKCZmZW5jZSk7Cj4gICAJCQkJZ290byBvdXQ7Cj4gICAJCQl9Cj4gICAKPiAtCQkJ ZXJyID0gaW50ZWxfdmlydHVhbF9lbmdpbmVfYXR0YWNoX2JvbmQodmUtPmVuZ2luZSwKPiAtCQkJ CQkJCSAgICAgICBtYXN0ZXIsCj4gLQkJCQkJCQkgICAgICAgc2libGluZ3Nbbl0pOwo+ICsJCQll cnIgPSBpbnRlbF9lbmdpbmVfYXR0YWNoX2JvbmQodmUtPmVuZ2luZSwKPiArCQkJCQkJICAgICAg IG1hc3RlciwKPiArCQkJCQkJICAgICAgIHNpYmxpbmdzW25dKTsKPiAgIAkJCWlmIChlcnIpIHsK PiAgIAkJCQlpbnRlbF9jb250ZXh0X3B1dCh2ZSk7Cj4gICAJCQkJb25zdGFja19mZW5jZV9maW5p KCZmZW5jZSk7Cj4gQEAgLTQ1NzYsNyArNDU3Niw3IEBAIHN0YXRpYyBpbnQgcmVzZXRfdmlydHVh bF9lbmdpbmUoc3RydWN0IGludGVsX2d0ICpndCwKPiAgIAlpZiAoaWd0X3NwaW5uZXJfaW5pdCgm c3BpbiwgZ3QpKQo+ICAgCQlyZXR1cm4gLUVOT01FTTsKPiAgIAo+IC0JdmUgPSBpbnRlbF9leGVj bGlzdHNfY3JlYXRlX3ZpcnR1YWwoc2libGluZ3MsIG5zaWJsaW5nKTsKPiArCXZlID0gaW50ZWxf ZW5naW5lX2NyZWF0ZV92aXJ0dWFsKHNpYmxpbmdzLCBuc2libGluZyk7Cj4gICAJaWYgKElTX0VS Uih2ZSkpIHsKPiAgIAkJZXJyID0gUFRSX0VSUih2ZSk7Cj4gICAJCWdvdG8gb3V0X3NwaW47Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNz aW9uLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfc3VibWlzc2lvbi5j Cj4gaW5kZXggZDYwNWFmMGQ2NmU2Li5jY2JjZjAyNGIzMWIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uYwo+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNzaW9uLmMKPiBAQCAtNjAsNiAr NjAsMTUgQEAKPiAgICAqCj4gICAgKi8KPiAgIAo+ICsvKiBHdUMgVmlydHVhbCBFbmdpbmUgKi8K PiArc3RydWN0IGd1Y192aXJ0dWFsX2VuZ2luZSB7Cj4gKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2Nz IGJhc2U7Cj4gKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCBjb250ZXh0Owo+ICt9Owo+ICsKPiArc3Rh dGljIHN0cnVjdCBpbnRlbF9jb250ZXh0ICoKPiArZ3VjX2NyZWF0ZV92aXJ0dWFsKHN0cnVjdCBp bnRlbF9lbmdpbmVfY3MgKipzaWJsaW5ncywgdW5zaWduZWQgaW50IGNvdW50KTsKPiArCj4gICAj ZGVmaW5lIEdVQ19SRVFVRVNUX1NJWkUgNjQgLyogYnl0ZXMgKi8KPiAgIAo+ICAgLyoKPiBAQCAt OTI4LDIwICs5MzcsMzUgQEAgc3RhdGljIGludCBndWNfbHJjX2Rlc2NfcGluKHN0cnVjdCBpbnRl bF9jb250ZXh0ICpjZSkKPiAgIAlyZXR1cm4gcmV0Owo+ICAgfQo+ICAgCj4gLXN0YXRpYyBpbnQg Z3VjX2NvbnRleHRfcHJlX3BpbihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCj4gLQkJCSAgICAg ICBzdHJ1Y3QgaTkxNV9nZW1fd3dfY3R4ICp3dywKPiAtCQkJICAgICAgIHZvaWQgKip2YWRkcikK PiArc3RhdGljIGludCBfX2d1Y19jb250ZXh0X3ByZV9waW4oc3RydWN0IGludGVsX2NvbnRleHQg KmNlLAo+ICsJCQkJIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKPiArCQkJCSBzdHJ1 Y3QgaTkxNV9nZW1fd3dfY3R4ICp3dywKPiArCQkJCSB2b2lkICoqdmFkZHIpCj4gICB7Cj4gLQly ZXR1cm4gbHJjX3ByZV9waW4oY2UsIGNlLT5lbmdpbmUsIHd3LCB2YWRkcik7Cj4gKwlyZXR1cm4g bHJjX3ByZV9waW4oY2UsIGVuZ2luZSwgd3csIHZhZGRyKTsKPiAgIH0KPiAgIAo+IC1zdGF0aWMg aW50IGd1Y19jb250ZXh0X3BpbihzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsIHZvaWQgKnZhZGRy KQo+ICtzdGF0aWMgaW50IF9fZ3VjX2NvbnRleHRfcGluKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpj ZSwKPiArCQkJICAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCj4gKwkJCSAgICAg dm9pZCAqdmFkZHIpCj4gICB7Cj4gICAJaWYgKGk5MTVfZ2d0dF9vZmZzZXQoY2UtPnN0YXRlKSAh PQo+ICAgCSAgICAoY2UtPmxyYy5scmNhICYgQ1RYX0dUVF9BRERSRVNTX01BU0spKQo+ICAgCQlz ZXRfYml0KENPTlRFWFRfTFJDQV9ESVJUWSwgJmNlLT5mbGFncyk7Cj4gICAKPiAtCXJldHVybiBs cmNfcGluKGNlLCBjZS0+ZW5naW5lLCB2YWRkcik7Cj4gKwlyZXR1cm4gbHJjX3BpbihjZSwgZW5n aW5lLCB2YWRkcik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZ3VjX2NvbnRleHRfcHJlX3Bpbihz dHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCj4gKwkJCSAgICAgICBzdHJ1Y3QgaTkxNV9nZW1fd3df Y3R4ICp3dywKPiArCQkJICAgICAgIHZvaWQgKip2YWRkcikKPiArewo+ICsJcmV0dXJuIF9fZ3Vj X2NvbnRleHRfcHJlX3BpbihjZSwgY2UtPmVuZ2luZSwgd3csIHZhZGRyKTsKPiArfQo+ICsKPiAr c3RhdGljIGludCBndWNfY29udGV4dF9waW4oc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCB2b2lk ICp2YWRkcikKPiArewo+ICsJcmV0dXJuIF9fZ3VjX2NvbnRleHRfcGluKGNlLCBjZS0+ZW5naW5l LCB2YWRkcik7Cj4gICB9Cj4gICAKPiAgIHN0YXRpYyB2b2lkIGd1Y19jb250ZXh0X3VucGluKHN0 cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKPiBAQCAtMTA0MSw2ICsxMDY1LDIxIEBAIHN0YXRpYyBp bmxpbmUgdm9pZCBndWNfbHJjX2Rlc2NfdW5waW4oc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQo+ ICAgCWRlcmVnaXN0ZXJfY29udGV4dChjZSwgY2UtPmd1Y19pZCk7Cj4gICB9Cj4gICAKPiArc3Rh dGljIHZvaWQgX19ndWNfY29udGV4dF9kZXN0cm95KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkK PiArewo+ICsJbHJjX2ZpbmkoY2UpOwo+ICsJaW50ZWxfY29udGV4dF9maW5pKGNlKTsKPiArCj4g KwlpZiAoaW50ZWxfZW5naW5lX2lzX3ZpcnR1YWwoY2UtPmVuZ2luZSkpIHsKPiArCQlzdHJ1Y3Qg Z3VjX3ZpcnR1YWxfZW5naW5lICp2ZSA9Cj4gKwkJCWNvbnRhaW5lcl9vZihjZSwgdHlwZW9mKCp2 ZSksIGNvbnRleHQpOwo+ICsKPiArCQlrZnJlZSh2ZSk7Cj4gKwl9IGVsc2Ugewo+ICsJCWludGVs X2NvbnRleHRfZnJlZShjZSk7Cj4gKwl9Cj4gK30KPiArCj4gICBzdGF0aWMgdm9pZCBndWNfY29u dGV4dF9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQo+ICAgewo+ICAgCXN0cnVjdCBpbnRlbF9j b250ZXh0ICpjZSA9IGNvbnRhaW5lcl9vZihrcmVmLCB0eXBlb2YoKmNlKSwgcmVmKTsKPiBAQCAt MTA1Nyw3ICsxMDk2LDcgQEAgc3RhdGljIHZvaWQgZ3VjX2NvbnRleHRfZGVzdHJveShzdHJ1Y3Qg a3JlZiAqa3JlZikKPiAgIAlpZiAoY29udGV4dF9ndWNfaWRfaW52YWxpZChjZSkgfHwKPiAgIAkg ICAgIWxyY19kZXNjX3JlZ2lzdGVyZWQoZ3VjLCBjZS0+Z3VjX2lkKSkgewo+ICAgCQlyZWxlYXNl X2d1Y19pZChndWMsIGNlKTsKPiAtCQlscmNfZGVzdHJveShrcmVmKTsKCkFGQUlDUyBhZnRlciB0 aGlzIHBhdGNoIHdlIG9ubHkgaGF2ZSAxIHVzZSBvZiBscmNfZGVzdHJveSBpbnNpZGUgdGhlIApl eGVjbGlzdHMgZmlsZSwgd2hpbGUgd2UgZG8gaGF2ZSAyIG9wZW4gY29kZWQgaW1wbGVtZW50YXRp b25zIChoZXJlIGFuZCAKZXhlY2xpc3RzIFZFKS4gU2luY2UgbHJjX2ZpbmkgYW5kIGludGVsX2Nv bnRleHRfZmluaSBhcmUgc3RpbGwgYWx3YXlzIApjYWxsZWQgYXMgYSBwYWlyLCBtYXliZSB3ZSBj YW4gcmVwbGFjZSBscmNfZGVzdHJveSB3aXRoIGEgZnVuY3Rpb24gdGhhdCAKY2FsbHMgdGhvc2Ug MiAoaS5lIGJhc2ljYWxseSBqdXN0IHJlbW92ZSB0aGUgZnJlZSgpIGZyb20gbHJjX2Rlc3Ryb3kp PyAKQ2FuIGJlIGRvbmUgYXMgYSBmb2xsb3cgdXAuCgo+ICsJCV9fZ3VjX2NvbnRleHRfZGVzdHJv eShjZSk7Cj4gICAJCXJldHVybjsKPiAgIAl9Cj4gICAKPiBAQCAtMTA3Myw3ICsxMTEyLDcgQEAg c3RhdGljIHZvaWQgZ3VjX2NvbnRleHRfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKPiAgIAlp ZiAoY29udGV4dF9ndWNfaWRfaW52YWxpZChjZSkpIHsKPiAgIAkJX19yZWxlYXNlX2d1Y19pZChn dWMsIGNlKTsKPiAgIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VjLT5jb250ZXh0c19sb2Nr LCBmbGFncyk7Cj4gLQkJbHJjX2Rlc3Ryb3koa3JlZik7Cj4gKwkJX19ndWNfY29udGV4dF9kZXN0 cm95KGNlKTsKPiAgIAkJcmV0dXJuOwo+ICAgCX0KPiAgIAo+IEBAIC0xMTE4LDYgKzExNTcsOCBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHRfb3BzIGd1Y19jb250ZXh0X29wcyA9 IHsKPiAgIAo+ICAgCS5yZXNldCA9IGxyY19yZXNldCwKPiAgIAkuZGVzdHJveSA9IGd1Y19jb250 ZXh0X2Rlc3Ryb3ksCj4gKwo+ICsJLmNyZWF0ZV92aXJ0dWFsID0gZ3VjX2NyZWF0ZV92aXJ0dWFs LAo+ICAgfTsKPiAgIAo+ICAgc3RhdGljIHZvaWQgX19ndWNfc2lnbmFsX2NvbnRleHRfZmVuY2Uo c3RydWN0IGludGVsX2NvbnRleHQgKmNlKQo+IEBAIC0xMjQ2LDYgKzEyODcsOTYgQEAgc3RhdGlj IGludCBndWNfcmVxdWVzdF9hbGxvYyhzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKPiAgIAlyZXR1 cm4gMDsKPiAgIH0KPiAgIAo+ICtzdGF0aWMgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqCj4gK2d1 Y192aXJ0dWFsX2dldF9zaWJsaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnZlLCB1bnNpZ25l ZCBpbnQgc2libGluZykKPiArewo+ICsJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOwo+ ICsJaW50ZWxfZW5naW5lX21hc2tfdCB0bXAsIG1hc2sgPSB2ZS0+bWFzazsKPiArCXVuc2lnbmVk IGludCBudW1fc2libGluZ3MgPSAwOwo+ICsKPiArCWZvcl9lYWNoX2VuZ2luZV9tYXNrZWQoZW5n aW5lLCB2ZS0+Z3QsIG1hc2ssIHRtcCkKPiArCQlpZiAobnVtX3NpYmxpbmdzKysgPT0gc2libGlu ZykKPiArCQkJcmV0dXJuIGVuZ2luZTsKPiArCj4gKwlyZXR1cm4gTlVMTDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBndWNfdmlydHVhbF9jb250ZXh0X3ByZV9waW4oc3RydWN0IGludGVsX2NvbnRl eHQgKmNlLAo+ICsJCQkJICAgICAgIHN0cnVjdCBpOTE1X2dlbV93d19jdHggKnd3LAo+ICsJCQkJ ICAgICAgIHZvaWQgKip2YWRkcikKPiArewo+ICsJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lID0gZ3VjX3ZpcnR1YWxfZ2V0X3NpYmxpbmcoY2UtPmVuZ2luZSwgMCk7Cj4gKwo+ICsJcmV0 dXJuIF9fZ3VjX2NvbnRleHRfcHJlX3BpbihjZSwgZW5naW5lLCB3dywgdmFkZHIpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IGd1Y192aXJ0dWFsX2NvbnRleHRfcGluKHN0cnVjdCBpbnRlbF9jb250 ZXh0ICpjZSwgdm9pZCAqdmFkZHIpCj4gK3sKPiArCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVu Z2luZSA9IGd1Y192aXJ0dWFsX2dldF9zaWJsaW5nKGNlLT5lbmdpbmUsIDApOwo+ICsKPiArCXJl dHVybiBfX2d1Y19jb250ZXh0X3BpbihjZSwgZW5naW5lLCB2YWRkcik7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGd1Y192aXJ0dWFsX2NvbnRleHRfZW50ZXIoc3RydWN0IGludGVsX2NvbnRleHQg KmNlKQo+ICt7Cj4gKwlpbnRlbF9lbmdpbmVfbWFza190IHRtcCwgbWFzayA9IGNlLT5lbmdpbmUt Pm1hc2s7Cj4gKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7Cj4gKwo+ICsJZm9yX2Vh Y2hfZW5naW5lX21hc2tlZChlbmdpbmUsIGNlLT5lbmdpbmUtPmd0LCBtYXNrLCB0bXApCj4gKwkJ aW50ZWxfZW5naW5lX3BtX2dldChlbmdpbmUpOwo+ICsKPiArCWludGVsX3RpbWVsaW5lX2VudGVy KGNlLT50aW1lbGluZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGd1Y192aXJ0dWFsX2NvbnRl eHRfZXhpdChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCj4gK3sKPiArCWludGVsX2VuZ2luZV9t YXNrX3QgdG1wLCBtYXNrID0gY2UtPmVuZ2luZS0+bWFzazsKPiArCXN0cnVjdCBpbnRlbF9lbmdp bmVfY3MgKmVuZ2luZTsKPiArCj4gKwlmb3JfZWFjaF9lbmdpbmVfbWFza2VkKGVuZ2luZSwgY2Ut PmVuZ2luZS0+Z3QsIG1hc2ssIHRtcCkKPiArCQlpbnRlbF9lbmdpbmVfcG1fcHV0KGVuZ2luZSk7 Cj4gKwo+ICsJaW50ZWxfdGltZWxpbmVfZXhpdChjZS0+dGltZWxpbmUpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGd1Y192aXJ0dWFsX2NvbnRleHRfYWxsb2Moc3RydWN0IGludGVsX2NvbnRleHQg KmNlKQo+ICt7Cj4gKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUgPSBndWNfdmlydHVh bF9nZXRfc2libGluZyhjZS0+ZW5naW5lLCAwKTsKPiArCj4gKwlyZXR1cm4gbHJjX2FsbG9jKGNl LCBlbmdpbmUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGludGVsX2NvbnRleHQgKmd1Y19j bG9uZV92aXJ0dWFsKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnNyYykKPiArewo+ICsJc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqc2libGluZ3NbR1VDX01BWF9JTlNUQU5DRVNfUEVSX0NMQVNTXSwg KmVuZ2luZTsKPiArCWludGVsX2VuZ2luZV9tYXNrX3QgdG1wLCBtYXNrID0gc3JjLT5tYXNrOwo+ ICsJdW5zaWduZWQgaW50IG51bV9zaWJsaW5ncyA9IDA7Cj4gKwo+ICsJZm9yX2VhY2hfZW5naW5l X21hc2tlZChlbmdpbmUsIHNyYy0+Z3QsIG1hc2ssIHRtcCkKPiArCQlzaWJsaW5nc1tudW1fc2li bGluZ3MrK10gPSBlbmdpbmU7Cj4gKwo+ICsJcmV0dXJuIGd1Y19jcmVhdGVfdmlydHVhbChzaWJs aW5ncywgbnVtX3NpYmxpbmdzKTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRl bF9jb250ZXh0X29wcyB2aXJ0dWFsX2d1Y19jb250ZXh0X29wcyA9IHsKPiArCS5hbGxvYyA9IGd1 Y192aXJ0dWFsX2NvbnRleHRfYWxsb2MsCj4gKwo+ICsJLnByZV9waW4gPSBndWNfdmlydHVhbF9j b250ZXh0X3ByZV9waW4sCj4gKwkucGluID0gZ3VjX3ZpcnR1YWxfY29udGV4dF9waW4sCj4gKwku dW5waW4gPSBndWNfY29udGV4dF91bnBpbiwKPiArCS5wb3N0X3VucGluID0gZ3VjX2NvbnRleHRf cG9zdF91bnBpbiwKPiArCj4gKwkuZW50ZXIgPSBndWNfdmlydHVhbF9jb250ZXh0X2VudGVyLAo+ ICsJLmV4aXQgPSBndWNfdmlydHVhbF9jb250ZXh0X2V4aXQsCj4gKwo+ICsJLnNjaGVkX2Rpc2Fi bGUgPSBndWNfY29udGV4dF9zY2hlZF9kaXNhYmxlLAo+ICsKPiArCS5kZXN0cm95ID0gZ3VjX2Nv bnRleHRfZGVzdHJveSwKPiArCj4gKwkuY2xvbmVfdmlydHVhbCA9IGd1Y19jbG9uZV92aXJ0dWFs LAo+ICsJLmdldF9zaWJsaW5nID0gZ3VjX3ZpcnR1YWxfZ2V0X3NpYmxpbmcsCj4gK307Cj4gKwo+ ICAgc3RhdGljIHZvaWQgc2FuaXRpemVfaHdzcChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUpCj4gICB7Cj4gICAJc3RydWN0IGludGVsX3RpbWVsaW5lICp0bDsKPiBAQCAtMTU1Nyw3ICsx Njg4LDcgQEAgaW50IGludGVsX2d1Y19kZXJlZ2lzdGVyX2RvbmVfcHJvY2Vzc19tc2coc3RydWN0 IGludGVsX2d1YyAqZ3VjLAo+ICAgCX0gZWxzZSBpZiAoY29udGV4dF9kZXN0cm95ZWQoY2UpKSB7 Cj4gICAJCS8qIENvbnRleHQgaGFzIGJlZW4gZGVzdHJveWVkICovCj4gICAJCXJlbGVhc2VfZ3Vj X2lkKGd1YywgY2UpOwo+IC0JCWxyY19kZXN0cm95KCZjZS0+cmVmKTsKPiArCQlfX2d1Y19jb250 ZXh0X2Rlc3Ryb3koY2UpOwo+ICAgCX0KPiAgIAo+ICAgCWRlY3Jfb3V0c3RhbmRpbmdfc3VibWlz c2lvbl9nMmgoZ3VjKTsKPiBAQCAtMTY2OSwzICsxODAwLDEwNyBAQCB2b2lkIGludGVsX2d1Y19s b2dfY29udGV4dF9pbmZvKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywKPiAgIAkJCSAgIGF0b21pY19y ZWFkKCZjZS0+Z3VjX3NjaGVkX3N0YXRlX25vX2xvY2spKTsKPiAgIAl9Cj4gICB9Cj4gKwo+ICtz dGF0aWMgc3RydWN0IGludGVsX2NvbnRleHQgKgo+ICtndWNfY3JlYXRlX3ZpcnR1YWwoc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqKnNpYmxpbmdzLCB1bnNpZ25lZCBpbnQgY291bnQpCj4gK3sKPiAr CXN0cnVjdCBndWNfdmlydHVhbF9lbmdpbmUgKnZlOwo+ICsJc3RydWN0IGludGVsX2d1YyAqZ3Vj Owo+ICsJdW5zaWduZWQgaW50IG47Cj4gKwlpbnQgZXJyOwo+ICsKPiArCXZlID0ga3phbGxvYyhz aXplb2YoKnZlKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXZlKQo+ICsJCXJldHVybiBFUlJfUFRS KC1FTk9NRU0pOwo+ICsKPiArCWd1YyA9ICZzaWJsaW5nc1swXS0+Z3QtPnVjLmd1YzsKPiArCj4g Kwl2ZS0+YmFzZS5pOTE1ID0gc2libGluZ3NbMF0tPmk5MTU7Cj4gKwl2ZS0+YmFzZS5ndCA9IHNp YmxpbmdzWzBdLT5ndDsKPiArCXZlLT5iYXNlLnVuY29yZSA9IHNpYmxpbmdzWzBdLT51bmNvcmU7 Cj4gKwl2ZS0+YmFzZS5pZCA9IC0xOwo+ICsKPiArCXZlLT5iYXNlLnVhYmlfY2xhc3MgPSBJOTE1 X0VOR0lORV9DTEFTU19JTlZBTElEOwo+ICsJdmUtPmJhc2UuaW5zdGFuY2UgPSBJOTE1X0VOR0lO RV9DTEFTU19JTlZBTElEX1ZJUlRVQUw7Cj4gKwl2ZS0+YmFzZS51YWJpX2luc3RhbmNlID0gSTkx NV9FTkdJTkVfQ0xBU1NfSU5WQUxJRF9WSVJUVUFMOwo+ICsJdmUtPmJhc2Uuc2F0dXJhdGVkID0g QUxMX0VOR0lORVM7CgpNb3N0IG9mIHRoZXNlIHNldHRpbmdzIGFyZSB0aGUgc2FtZSBmb3IgYm90 aCBleGVjbGlzdHMgYW5kIEd1QyBhbmQgCmFyZW4ndCBiYWNrLWVuZCBkZXBlbmRlbnQuIE1heWJl IHdlIGNhbiBoYXZlIGE6CgppbnRlbF92aXJ0dWFsX2VuZ2luZV9pbml0X2Vhcmx5KHN0cnVjdCBp bnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKIMKgwqDCoMKgwqDCoMKgIMKgwqDCoMKgwqDCoMKgIMKg wqDCoMKgwqDCoMKgIMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnNpYmxp bmcpOwoKQW5kIGNhbGwgdGhhdCBmcm9tIGJvdGggcGxhY2VzPyBDYW4gYmUgZG9uZSBhcyBhIGZv bGxvdy11cAoKPiArCXZlLT5iYXNlLmJyZWFkY3J1bWJzID0gaW50ZWxfYnJlYWRjcnVtYnNfY3Jl YXRlKCZ2ZS0+YmFzZSk7Cj4gKwlpZiAoIXZlLT5iYXNlLmJyZWFkY3J1bWJzKSB7Cj4gKwkJa2Zy ZWUodmUpOwo+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+ICsJfQo+ICsKPiArCXNucHJp bnRmKHZlLT5iYXNlLm5hbWUsIHNpemVvZih2ZS0+YmFzZS5uYW1lKSwgInZpcnR1YWwiKTsKPiAr Cj4gKwl2ZS0+YmFzZS5zY2hlZF9lbmdpbmUgPSBpOTE1X3NjaGVkX2VuZ2luZV9nZXQoZ3VjLT5z Y2hlZF9lbmdpbmUpOwo+ICsKPiArCXZlLT5iYXNlLmNvcHMgPSAmdmlydHVhbF9ndWNfY29udGV4 dF9vcHM7Cj4gKwl2ZS0+YmFzZS5yZXF1ZXN0X2FsbG9jID0gZ3VjX3JlcXVlc3RfYWxsb2M7Cj4g Kwo+ICsJdmUtPmJhc2Uuc3VibWl0X3JlcXVlc3QgPSBndWNfc3VibWl0X3JlcXVlc3Q7Cj4gKwo+ ICsJdmUtPmJhc2UuZmxhZ3MgPSBJOTE1X0VOR0lORV9JU19WSVJUVUFMOwo+ICsKPiArCWludGVs X2NvbnRleHRfaW5pdCgmdmUtPmNvbnRleHQsICZ2ZS0+YmFzZSk7Cj4gKwo+ICsJZm9yIChuID0g MDsgbiA8IGNvdW50OyBuKyspIHsKPiArCQlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpzaWJsaW5n ID0gc2libGluZ3Nbbl07Cj4gKwo+ICsJCUdFTV9CVUdfT04oIWlzX3Bvd2VyX29mXzIoc2libGlu Zy0+bWFzaykpOwo+ICsJCWlmIChzaWJsaW5nLT5tYXNrICYgdmUtPmJhc2UubWFzaykgewo+ICsJ CQlEUk1fREVCVUcoImR1cGxpY2F0ZSAlcyBlbnRyeSBpbiBsb2FkIGJhbGFuY2VyXG4iLAo+ICsJ CQkJICBzaWJsaW5nLT5uYW1lKTsKPiArCQkJZXJyID0gLUVJTlZBTDsKPiArCQkJZ290byBlcnJf cHV0Owo+ICsJCX0KPiArCj4gKwkJdmUtPmJhc2UubWFzayB8PSBzaWJsaW5nLT5tYXNrOwo+ICsK PiArCQlpZiAobiAhPSAwICYmIHZlLT5iYXNlLmNsYXNzICE9IHNpYmxpbmctPmNsYXNzKSB7Cj4g KwkJCURSTV9ERUJVRygiaW52YWxpZCBtaXhpbmcgb2YgZW5naW5lIGNsYXNzLCBzaWJsaW5nICVk LCBhbHJlYWR5ICVkXG4iLAo+ICsJCQkJICBzaWJsaW5nLT5jbGFzcywgdmUtPmJhc2UuY2xhc3Mp Owo+ICsJCQllcnIgPSAtRUlOVkFMOwo+ICsJCQlnb3RvIGVycl9wdXQ7Cj4gKwkJfSBlbHNlIGlm IChuID09IDApIHsKPiArCQkJdmUtPmJhc2UuY2xhc3MgPSBzaWJsaW5nLT5jbGFzczsKPiArCQkJ dmUtPmJhc2UudWFiaV9jbGFzcyA9IHNpYmxpbmctPnVhYmlfY2xhc3M7Cj4gKwkJCXNucHJpbnRm KHZlLT5iYXNlLm5hbWUsIHNpemVvZih2ZS0+YmFzZS5uYW1lKSwKPiArCQkJCSAidiVkeCVkIiwg dmUtPmJhc2UuY2xhc3MsIGNvdW50KTsKPiArCQkJdmUtPmJhc2UuY29udGV4dF9zaXplID0gc2li bGluZy0+Y29udGV4dF9zaXplOwo+ICsKPiArCQkJdmUtPmJhc2UuZW1pdF9iYl9zdGFydCA9IHNp YmxpbmctPmVtaXRfYmJfc3RhcnQ7Cj4gKwkJCXZlLT5iYXNlLmVtaXRfZmx1c2ggPSBzaWJsaW5n LT5lbWl0X2ZsdXNoOwo+ICsJCQl2ZS0+YmFzZS5lbWl0X2luaXRfYnJlYWRjcnVtYiA9Cj4gKwkJ CQlzaWJsaW5nLT5lbWl0X2luaXRfYnJlYWRjcnVtYjsKPiArCQkJdmUtPmJhc2UuZW1pdF9maW5p X2JyZWFkY3J1bWIgPQo+ICsJCQkJc2libGluZy0+ZW1pdF9maW5pX2JyZWFkY3J1bWI7Cj4gKwkJ CXZlLT5iYXNlLmVtaXRfZmluaV9icmVhZGNydW1iX2R3ID0KPiArCQkJCXNpYmxpbmctPmVtaXRf ZmluaV9icmVhZGNydW1iX2R3Owo+ICsKPiArCQkJdmUtPmJhc2UuZmxhZ3MgfD0gc2libGluZy0+ ZmxhZ3M7Cj4gKwoKU2FtZSBoZXJlLCBtb3N0IG9mIHRoZXNlIHNldHRpbmcgZnJvbSB0aGUgc2li bGluZyBhcmUgdGhlIHNhbWUuIAppbnRlbF92aXJ0dWFsX2VuZ2luZV9pbmhlcml0X2Zyb21fc2li bGluZygpPwoKQXBhcnQgZnJvbSB0aGUgdmFyaW91cyBuaXRzIHRoZSBjb2RlIExHVE0sIGJ1dCBJ J2xsIHdhaXQgdW50aWwgdGhlIG5leHQgCnNwaW4gZm9yIGFuIHItYiBzaW5jZSBhIGdvb2QgY2h1 bmsgb2YgdGhlIHBhdGNoIGlzIGdvaW5nIGF3YXkuCgpEYW5pZWxlCgo+ICsJCQl2ZS0+YmFzZS5w cm9wcy50aW1lc2xpY2VfZHVyYXRpb25fbXMgPQo+ICsJCQkJc2libGluZy0+cHJvcHMudGltZXNs aWNlX2R1cmF0aW9uX21zOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gJnZlLT5jb250ZXh0 Owo+ICsKPiArZXJyX3B1dDoKPiArCWludGVsX2NvbnRleHRfcHV0KCZ2ZS0+Y29udGV4dCk7Cj4g KwlyZXR1cm4gRVJSX1BUUihlcnIpOwo+ICt9Cj4gKwo+ICsKPiArCj4gK2Jvb2wgaW50ZWxfZ3Vj X3ZpcnR1YWxfZW5naW5lX2hhc19oZWFydGJlYXQoY29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9j cyAqdmUpCj4gK3sKPiArCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKPiArCWludGVs X2VuZ2luZV9tYXNrX3QgdG1wLCBtYXNrID0gdmUtPm1hc2s7Cj4gKwo+ICsJZm9yX2VhY2hfZW5n aW5lX21hc2tlZChlbmdpbmUsIHZlLT5ndCwgbWFzaywgdG1wKQo+ICsJCWlmIChSRUFEX09OQ0Uo ZW5naW5lLT5wcm9wcy5oZWFydGJlYXRfaW50ZXJ2YWxfbXMpKQo+ICsJCQlyZXR1cm4gdHJ1ZTsK PiArCj4gKwlyZXR1cm4gZmFsc2U7Cj4gK30KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNzaW9uLmgKPiBpbmRleCA2NDUzZTJiZmExNTEuLjk1ZGY1 YWIwNjAzMSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9n dWNfc3VibWlzc2lvbi5oCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxf Z3VjX3N1Ym1pc3Npb24uaAo+IEBAIC0yNSw2ICsyNSw4IEBAIHZvaWQgaW50ZWxfZ3VjX2xvZ19z dWJtaXNzaW9uX2luZm8oc3RydWN0IGludGVsX2d1YyAqZ3VjLAo+ICAgCQkJCSAgIHN0cnVjdCBk cm1fcHJpbnRlciAqcCk7Cj4gICB2b2lkIGludGVsX2d1Y19sb2dfY29udGV4dF9pbmZvKHN0cnVj dCBpbnRlbF9ndWMgKmd1Yywgc3RydWN0IGRybV9wcmludGVyICpwKTsKPiAgIAo+ICtib29sIGlu dGVsX2d1Y192aXJ0dWFsX2VuZ2luZV9oYXNfaGVhcnRiZWF0KGNvbnN0IHN0cnVjdCBpbnRlbF9l bmdpbmVfY3MgKnZlKTsKPiArCj4gICBzdGF0aWMgaW5saW5lIGJvb2wgaW50ZWxfZ3VjX3N1Ym1p c3Npb25faXNfc3VwcG9ydGVkKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPiAgIHsKPiAgIAkvKiBY WFg6IEd1QyBzdWJtaXNzaW9uIGlzIHVuYXZhaWxhYmxlIGZvciBub3cgKi8KCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxp c3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=