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
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 smtp.lore.kernel.org (Postfix) with ESMTPS id D4DAAC982FA
for ; Tue, 22 Sep 2026 11:30:34 +0000 (UTC)
Received: from gabe.freedesktop.org (localhost [127.0.0.1])
by gabe.freedesktop.org (Postfix) with ESMTP id D3A2310E6B9;
Tue, 22 Sep 2026 11:30:33 +0000 (UTC)
Authentication-Results: gabe.freedesktop.org;
dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.b="ZQoM4CmV";
dkim-atps=neutral
Received: from PH8PR06CU001.outbound.protection.outlook.com
(mail-westus3azon11012022.outbound.protection.outlook.com [40.107.209.22])
by gabe.freedesktop.org (Postfix) with ESMTPS id 77D8610E6B9;
Tue, 22 Sep 2026 11:30:32 +0000 (UTC)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
b=NXkRIlmJGpslygCd3SNiwYA0CAZNj7NJLj08JzPBOlMiWgjmOm11q3j7uAjiF4RrnwcOj7lK2cjhXQnk9gU0PwS4uQsMgIJv8wcba0sp9S7Ju7l/3kozBvDRqKoDwuI3xIJQQtVFY2JuwbjA0wJ1/NzZwo+ebJOnB2hdpfiR/Fs8tdRLQvninHR+o79sjxbMA9y6izAPfME7LQLWmXmD3OL+ceVYTCoHr7y97UIO/qh0heYvgPo6BiEaQzbKcXIAJOY70jnLQV3i1nGZ/ki7D+L/Gs2tmXIG0mZ/sUkIHWiLDCKRVQkVw3EgtWOxfKJHmkBmrQlnoYCK5O/C4y2Vzg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;
s=arcselector10001;
h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;
bh=Zz1jG3sHEh6av/qBmYmCi349+lDoI/zKj2XJKpAR6AI=;
b=KAk5hUKCA9KF3HeJgEDrdqzjX5mBge6PxB74M0nsGupB3+K6Hjr8VXhcutwiJ8U75Ttby1XhVzz9i+Z6vhigYGpvN48qK3wbLzzwRTrQAD5Rkj2AGUzKGQk0il0KLCyXWN0Rq7Zgw/PrMwvoqT1b0Y6DFRHknwKCOPQSlIPW9QmE8IRmxRbMOTy+iH2rfcsxTUoCpnjprkMVeq3WxkcpmEy03Bpf5f8Z3qkWfjZFqZghgP/6eM8O+WPhPj2pmJT227S1zoxVURshzBXZ9IuWflXXeSWAfgG2Kioc6WF7BxJkYVlpmwH2EjMSiCo1n1vhG4FV/o+zIxYh8y8NTKjOxA==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass
header.d=amd.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1;
h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
bh=Zz1jG3sHEh6av/qBmYmCi349+lDoI/zKj2XJKpAR6AI=;
b=ZQoM4CmVJ+GzJCUPPXqaZPnL6hQExjGBTg5oOoLzlkKaPPXymiY6yBpTg/wwodZGwL19+jVcdOjrTLJwPm/7NTh8S1/RGQCOzuMGltemXyBrm4Q7iG6NGEbQuNBhNjPzBMQiV4/fJ/fZDooP9XLfowkaAB8ml2FnSejgo9SIK6M=
Authentication-Results: dkim=none (message not signed)
header.d=none;dmarc=none action=none header.from=amd.com;
Received: from IA0PR12MB8208.namprd12.prod.outlook.com (2603:10b6:208:409::17)
by CH1PR12MB9623.namprd12.prod.outlook.com (2603:10b6:610:2b3::15)
with Microsoft SMTP Server (version=TLS1_2,
cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.16; Tue, 22 Sep
2026 11:30:25 +0000
Received: from IA0PR12MB8208.namprd12.prod.outlook.com
([fe80::dbd3:cc22:a850:dc1e]) by IA0PR12MB8208.namprd12.prod.outlook.com
([fe80::dbd3:cc22:a850:dc1e%4]) with mapi id 15.21.0428.015; Tue, 22 Sep 2026
11:30:25 +0000
Content-Type: multipart/alternative;
boundary="------------j0BbIAOcPeDN2RXitraUf0Rz"
Message-ID: <6c4f5c4b-8866-49e9-b693-678236233e8e@amd.com>
Date: Tue, 22 Sep 2026 17:00:19 +0530
User-Agent: Mozilla Thunderbird
Subject: Re: [PATCH v9 0/3] drm: Extract dma-fence-to-workqueue pattern into
common helpers
To: matthew.brost@intel.com
Cc: dri-devel@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
amd-gfx@lists.freedesktop.org, =?UTF-8?Q?Christian_K=C3=B6nig?=
, Alex Deucher ,
=?UTF-8?Q?Thomas_Hellstr=C3=B6m?=
References: <20260909044454.399340-1-srinivasan.shanmugam@amd.com>
Content-Language: en-US
From: SRINIVASAN SHANMUGAM
In-Reply-To: <20260909044454.399340-1-srinivasan.shanmugam@amd.com>
X-ClientProxiedBy: MA5P287CA0344.INDP287.PROD.OUTLOOK.COM
(2603:1096:a01:21f::10) To IA0PR12MB8208.namprd12.prod.outlook.com
(2603:10b6:208:409::17)
MIME-Version: 1.0
X-MS-PublicTrafficType: Email
X-MS-TrafficTypeDiagnostic: IA0PR12MB8208:EE_|CH1PR12MB9623:EE_
X-MS-Office365-Filtering-Correlation-Id: 730cddc6-92f1-4569-953f-08df189ce4f6
X-MS-Exchange-SenderADCheck: 1
X-MS-Exchange-AntiSpam-Relay: 0
X-Microsoft-Antispam: BCL:0;
ARA:13230040|366016|376014|1800799024|23010399003|13003099007|10067099003|11063799006|56012099006|8096899003|18002099003|22082099003;
X-Microsoft-Antispam-Message-Info: RSiW+hiI73dIFIWGaqBUOZfarV5OiMFT7CHa+mdSjo1iW3F/kDYIAUmXTzfTmCJ26frsRAJOEGQwLNBtgjlL4KcZxEVa+8tamgzygPw6bcCy0WxH9TYdwewWHlzdN05onkoQ5srr2EFHEj2p8v0dis9/oh341HC695cNwcNh7aPTm3nEWeDLmBDAyRxtGTAW0EMMabtlb8GXpCsmoRHR1sICSGtQgHJqqfpNKqx125WYb8sOpd+qiznNynGheS1R+xa5thjzCr/TJJ0WelG/lmRdvVFUb9T6mggUgnl/AJyI+vvzhIPCVhZPu64+DTP4oDJOeVjZaBsdoafcHVjnfUwpovcPIYbCnFQrjMTzVzuzq3watgcLREu4D9joMU1KrM7UVk/drPdqmh/00uNHytQTBVucJvnLWDHW/LSSZ1cCrW3o4kMrW0QITlOaisSAIyDEceHvH1cVc3+fMv/MiFhg+V9cUuJTAzB50QSDm9AFO3mpzGlUK6DJlodLeq5m5K8bmWSy3tNW5tfT67uJsmLus+7qTdLbySUv8TmENx1oj12sn6VfKRS269Fd+oIsQL8LA5cO3CYDHvz0AfWiXLem3YmjXaE63kbpQEQILzI=
X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;
IPV:NLI; SFV:NSPM; H:IA0PR12MB8208.namprd12.prod.outlook.com; PTR:; CAT:NONE;
SFS:(13230040)(366016)(376014)(1800799024)(23010399003)(13003099007)(10067099003)(11063799006)(56012099006)(8096899003)(18002099003)(22082099003);
DIR:OUT; SFP:1101;
X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?U1JQRFJQdEZwNFNCQXVTdEI0VW93dENybVY2bi9hSFZIWHlrWkkzbnp5bFNF?=
=?utf-8?B?WVJjWElTWUJyQ1FFZCtJajJKZmpQM0ZsSmpLdERNS2I2Y08vK0d3Rk9FMUNh?=
=?utf-8?B?ME4xL2JRT0VEZGdWdGg4OUEzaTZVSmxCbW55ZXE3SzE4eGpsWS92Z3BhNGNo?=
=?utf-8?B?RVdmVllPTDJybDZtRXVNemhmbDRmSlBZQ2NiVFZHMDlQYysxT2VkekhmUTds?=
=?utf-8?B?UWxDOHhhbk9aODZGbE53TU1kRlNNdmhsOWtFbzZQUVJQaS8xWkhnWnREcWhC?=
=?utf-8?B?UFplVnBhMkUweGpGZ0h6di9IYm1sUHpDNXRlQ25lZmxFSElTclo0dHJ5eWFG?=
=?utf-8?B?VDY3ZGppUTVXSVlFQnFPcWVVYnluOXh2Y0xNTTBoS1I3T3dqakpKZFNXc0c1?=
=?utf-8?B?T2hHRlpnaXNidlhOUWFBVlpBM2xNd2o4a1hDRlYzOWhBU3R0RkYrNWloTE95?=
=?utf-8?B?MHlzVFZPbkpJbVBtNWNZcjc3dlM0Z3ZwV0VxNFh5dlB4dVVGRFJjSm80U05p?=
=?utf-8?B?MFRRL21zTzY1OUtwc0RrdUZpQTRnTmllN09KdGUzYW1kTURrMzVlSVR5RFFF?=
=?utf-8?B?dVRCMWFiQ1RmVFJEejUvaXY2cUN6R1pxeU5qUjkrWEVFS1hpdjJKa2lsRGQ2?=
=?utf-8?B?dnZ0bXRDT2pRRiswNHZEekg1STRDNU1hY0F6Ymx1RG9XL0g1eFBJOUJ4Mjg2?=
=?utf-8?B?MmxCNnBXRy9IV0FHb0RFdXdlaVBReW1VQVIydy9KWVVDcGo4aGV5UFFiWHJo?=
=?utf-8?B?Q2ZVS2JTM0VwY2dMSUR2VzBDNzZkYTRrV2E3YVpYU0k5OG9RMSt2Z3ppUUFH?=
=?utf-8?B?N3RpdlY5ci9rRFBJa2V1WkcxZWdTa3E5alVvZGtPK25SV2huOHhld1dCMlJL?=
=?utf-8?B?WGtpMUh6L1VkSlpYT3FBeTlERzRybVhuSUpWNHAwYzZNckphOGFwUGs0ZTBs?=
=?utf-8?B?UUJoWXhpcEhNUVdJWlpiR3RLTGV2bXl3eGQ3ZUFOL015dG9aMHhBZkxVVGRN?=
=?utf-8?B?YXI0VFFIc1d3dWd2ZUI5N3VZdWg1TFd4VkYzRHVDN3lVVE11THN5dWxyQnlL?=
=?utf-8?B?dm9TNjNVVndLRkM5TXdlWCtKdkZWYkpDS3dndExjQWZ5L1UzSnF5NWhCOFAw?=
=?utf-8?B?RWRYSVNmWUxOLzAwSnlVTVZSRnBmVHVrS1ViN0NTelQ2dU96MVdtV0tzT3Nw?=
=?utf-8?B?c3V6Q01KM3Z2THBLY0lpN0hoUzhsbDQ3RnQzb0sybUxtRGpkeFJTRjdoUkxu?=
=?utf-8?B?cU1XY01Jc21FY0dYYVltN3pFdks0bjBXR2lsTTRyeHMydzVsYUhMbEZ6UWE0?=
=?utf-8?B?L1h6R1B5WVk5SkJDbXcyNk9aVDVxRXE2QmI2NVZ6OWF1Q04vN2J6SDU5Q3d2?=
=?utf-8?B?OFNydENLZ0VuRlVVeWEydUlJSWFvMHlpUnpKOUY5Y0xRaUw3WTU1dUg3a2dV?=
=?utf-8?B?b2lTWnhPZzZRNzRSUC9XUlBwWUZla1Nqc0ZnMUJtUHlSbnlaVys1Z2hEbzA4?=
=?utf-8?B?bmhmM1hBOUY5dThNQTFtWmNDRy9heUNCTmtrYXFqYmc3dnZMZ2VSMnY2ZEZG?=
=?utf-8?B?TmVPcEUxZTJlTkJFWVJDN1VXWlF0dUswbHVQM2N2RVpPc1FlL0ZSNjZwL3pr?=
=?utf-8?B?elBWTG5IY0dISGtDdHk4RDFKQWpTUU42V1RYQTZIMDJadVQ0dGRXbGhDWml3?=
=?utf-8?B?S1hIUTdLUjA0MzdGTXBKdEIvYmpmSFB6UjBoSEZqSzVLZllicXB3enl1TXhs?=
=?utf-8?B?VllGSWRzMjVCcHF4aXJOK1RweWl5YUhmTS9FUGp3R3lDM0M2L1BYWUxYM1hT?=
=?utf-8?B?TlRsUkJXV1B2QW1QbW1kSk5MS2pHL1JyTW5YanVTYUFadFFaUnk3R01GeUcv?=
=?utf-8?B?T201YzBOSE9WR0YzaVBxTmhqSEJEcDh0cGVQck9vY1hYbmYzUzhVNEZQR0Ri?=
=?utf-8?B?d1kxb29RbmU5andDZGhlWGZuTUUyUnp1RVFPOFlRRzZmWUVPNmdtZ1lQMDQz?=
=?utf-8?B?djZvbjBhZy85YWJ1VWRvNFhuN1RhbS9PZG9hUkhENjlLbWRWRFRObHlnK2Jk?=
=?utf-8?B?dXQ5OXhzYjBGMTZpL2hHM0NLaEtQSW1FSjltOTBsSS9wODA5dkNEVFFuMDhR?=
=?utf-8?B?aGlyR1dNUytOMUZGN05qa3JSVzNxa1JNZ25OQUcxNHA1Y0JsZFQ5ZVpOOHNj?=
=?utf-8?B?cnFTK29hVnE2Q1FTV25VbHNHamtMUTZIZWVsaGt3K3R0all3Zk9WYWxzKzkv?=
=?utf-8?B?Mzdlc0RZY3V2cStZZFVTSlRCV3lrTGU3VFRGSkZjcWRObm1EK0MrVXIyUGVp?=
=?utf-8?Q?r/l75uiCRs7uSP1cVh?=
X-OriginatorOrg: amd.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 730cddc6-92f1-4569-953f-08df189ce4f6
X-MS-Exchange-CrossTenant-AuthSource: IA0PR12MB8208.namprd12.prod.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Sep 2026 11:30:24.9924 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
X-MS-Exchange-CrossTenant-UserPrincipalName: xjkjp8vpLiMB6W+vdRABitcu5l8ja+NAWwfKxCLAYBeHbN11zVMAgb/H6UATYBoe86wz+rR2q5cnyCEW1fGjHw==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH1PR12MB9623
X-BeenThere: amd-gfx@lists.freedesktop.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Discussion list for AMD gfx
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
Errors-To: amd-gfx-bounces@lists.freedesktop.org
Sender: "amd-gfx"
--------------j0BbIAOcPeDN2RXitraUf0Rz
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Hi Matt,
Good morning!
Just a gentle follow-up on the remaining race issues in the |drm: Add
drm_work_fence helper| patch.
After applying the previous fixes in v9 [1], Sashiko found two remaining
race cases [2].
We are considering |schedule_work()| for the IRQ-context issue and an
atomic flag for the timing gap around |disable_work_sync()|.
Could you please let us know if these approaches look reasonable before
we prepare v10?
[1] v9 patch:
https://patchwork.freedesktop.org/patch/751979/?series=173582&rev=2
[2] Sashiko v9 review:
https://sashiko.dev/#/patchset/20260909044454.399340-1-srinivasan.shanmugam%40amd.com
We really appreciate all the time and effort you have put into reviewing
this serie.
Thanks again,
Srini
On 9/9/2026 10:14 AM, Srinivasan Shanmugam wrote:
> This series extracts the dma-fence-callback-to-workqueue pattern shared
> between XE and AMDGPU into common DRM helpers.
>
> Patch 1 introduces drm_work_fence — a generic helper that queues a work
> item when a dma-fence signals, for work that cannot run in IRQ context.
>
> Patch 2 introduces drm_user_fence — extends drm_work_fence with
> kthread_use_mm() support for drivers that need to write completion
> status to userspace memory.
>
> Patch 3 converts XE's open-coded xe_user_fence to use drm_user_fence.
>
> Note: Patch 4 (per-signal compare functionality for AMDGPU's EOP
> eventfd path) is deferred pending resolution of the compare address
> read method (get_user() vs page-pinning), raised by Matthew Brost.
>
> v9:
> - Fix drm_work_fence_queue: drop ref if queue_work returns false,
> closing the race between callback firing and queue_work() (Matt)
> - Fix drm_work_fence_cancel_sync: use disable_work_sync() to close
> the UAF race window between callback and queue_work() (Matt)
> - Remove xe_sync_ufence_cancel_sync — no caller in this patch (Matt)
> - Remove xe_sync_ufence_cancel from xe_vma_destroy_late — unnecessary
> behaviour change; xe_ufence_worker only accesses device-level
> resources, safe to run after VMA teardown (Matt)
>
> v8:
> - Fix copyright: The Linux Foundation → Advanced Micro Devices, Inc.
> - Switch EXPORT_SYMBOL_GPL → EXPORT_SYMBOL for MIT-licensed code (Matt)
> - Rename drm_work_fence_ops callback: writeback → worker (Matt)
> - Rename drm_user_fence_ops callback: worker → writeback (Matt)
> - Fix xe_ufence_worker ordering: WRITE_ONCE before copy_to_user,
> add smp_wmb() before wake_up_all (Matt, confirmed via 8ae04fe9ffc93)
> - Rename .worker → .writeback in xe_ufence_ops (Matt)
> - Drop Patch 4 pending design decision on compare address read method
>
> Suggested-by: Matthew Brost
> Suggested-by: Christian König
>
> Srinivasan Shanmugam (3):
> drm: Add drm_work_fence helper
> drm: Add drm_user_fence helper
> drm/xe: Convert xe_user_fence to drm_user_fence
>
> drivers/gpu/drm/Makefile | 2 +
> drivers/gpu/drm/drm_user_fence.c | 70 +++++++++++
> drivers/gpu/drm/drm_work_fence.c | 186 +++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_sync.c | 141 +++++++++++-----------
> drivers/gpu/drm/xe/xe_sync.h | 1 +
> drivers/gpu/drm/xe/xe_sync_types.h | 1 -
> include/drm/drm_user_fence.h | 123 +++++++++++++++++++
> include/drm/drm_work_fence.h | 69 +++++++++++
> 8 files changed, 524 insertions(+), 69 deletions(-)
> create mode 100644 drivers/gpu/drm/drm_user_fence.c
> create mode 100644 drivers/gpu/drm/drm_work_fence.c
> create mode 100644 include/drm/drm_user_fence.h
> create mode 100644 include/drm/drm_work_fence.h
>
--------------j0BbIAOcPeDN2RXitraUf0Rz
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit
On 9/9/2026 10:14 AM, Srinivasan Shanmugam wrote:
This series extracts the dma-fence-callback-to-workqueue pattern shared
between XE and AMDGPU into common DRM helpers.
Patch 1 introduces drm_work_fence — a generic helper that queues a work
item when a dma-fence signals, for work that cannot run in IRQ context.
Patch 2 introduces drm_user_fence — extends drm_work_fence with
kthread_use_mm() support for drivers that need to write completion
status to userspace memory.
Patch 3 converts XE's open-coded xe_user_fence to use drm_user_fence.
Note: Patch 4 (per-signal compare functionality for AMDGPU's EOP
eventfd path) is deferred pending resolution of the compare address
read method (get_user() vs page-pinning), raised by Matthew Brost.
v9:
- Fix drm_work_fence_queue: drop ref if queue_work returns false,
closing the race between callback firing and queue_work() (Matt)
- Fix drm_work_fence_cancel_sync: use disable_work_sync() to close
the UAF race window between callback and queue_work() (Matt)
- Remove xe_sync_ufence_cancel_sync — no caller in this patch (Matt)
- Remove xe_sync_ufence_cancel from xe_vma_destroy_late — unnecessary
behaviour change; xe_ufence_worker only accesses device-level
resources, safe to run after VMA teardown (Matt)
v8:
- Fix copyright: The Linux Foundation → Advanced Micro Devices, Inc.
- Switch EXPORT_SYMBOL_GPL → EXPORT_SYMBOL for MIT-licensed code (Matt)
- Rename drm_work_fence_ops callback: writeback → worker (Matt)
- Rename drm_user_fence_ops callback: worker → writeback (Matt)
- Fix xe_ufence_worker ordering: WRITE_ONCE before copy_to_user,
add smp_wmb() before wake_up_all (Matt, confirmed via 8ae04fe9ffc93)
- Rename .worker → .writeback in xe_ufence_ops (Matt)
- Drop Patch 4 pending design decision on compare address read method
Suggested-by: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Christian König <christian.koenig@amd.com>
Srinivasan Shanmugam (3):
drm: Add drm_work_fence helper
drm: Add drm_user_fence helper
drm/xe: Convert xe_user_fence to drm_user_fence
drivers/gpu/drm/Makefile | 2 +
drivers/gpu/drm/drm_user_fence.c | 70 +++++++++++
drivers/gpu/drm/drm_work_fence.c | 186 +++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_sync.c | 141 +++++++++++-----------
drivers/gpu/drm/xe/xe_sync.h | 1 +
drivers/gpu/drm/xe/xe_sync_types.h | 1 -
include/drm/drm_user_fence.h | 123 +++++++++++++++++++
include/drm/drm_work_fence.h | 69 +++++++++++
8 files changed, 524 insertions(+), 69 deletions(-)
create mode 100644 drivers/gpu/drm/drm_user_fence.c
create mode 100644 drivers/gpu/drm/drm_work_fence.c
create mode 100644 include/drm/drm_user_fence.h
create mode 100644 include/drm/drm_work_fence.h
--------------j0BbIAOcPeDN2RXitraUf0Rz--