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=-17.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable 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 2BC52C433E0 for ; Wed, 27 Jan 2021 10:57:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D555020781 for ; Wed, 27 Jan 2021 10:57:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235399AbhA0K5S (ORCPT ); Wed, 27 Jan 2021 05:57:18 -0500 Received: from mail-bn8nam12on2040.outbound.protection.outlook.com ([40.107.237.40]:37856 "EHLO NAM12-BN8-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S236007AbhA0KzE (ORCPT ); Wed, 27 Jan 2021 05:55:04 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KDct+n6XpURJh/Smm5e0V4IapDNrTiBwPR5Dp+OS82JZFa/w+Rjg7c4tdwj5s3hDs82GzgQUh5MWO9wl7LNtTQBOfsenQFAev3peIVIPlbg7N/iWX+95Ivrmt9z30uJGRo3wkUL+UJqGKf4GZ74cN5RCdgmlOQTh8Qzt3lC6VzGOzED592EIkERZ/ZM3R6MA/MtfbeWH6rP5yNUCDL1wZOV09Dbha+nqDqKIsjzMUrH70hqYuy8nbMTJApOqVq2C9xuwKc1yHEncm52kBIwGmfYMdWKZiIskG771XmbZye5IdkiM3lF4IUy3VQyQJ3qzESYnCLQhyRePapEzWWX6uw== 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=MxcuQ43UtVKrlDdNHP1rNUtcsO9Xxu59Irj7+0sfD9Q=; b=YhRtDsqvo0an4tRbRQl5rQjADSnVCDCGuvS3+81a036HijNzcW8dZdlaj96hKbhtN/I0m4W0aG9Wdg7b31HlpcgKqd3zx1C21VkXKNjc1f5nRqR7BavR6JVJNQZS+AD8TuOE4gdjA19FOchOoqSEyu8DazNY90T1RWDXY0lOBCx0OSbX6SUs7SOYM8tZ/vA2VNCDUoUJRj+RpTbTE+YxYvl37Zto1VfuLUsZ1eg1jXzuyOjdeHDKC+msKJ7ABAujxj00m/HrN17kABbFXLWgqJp65Qo++A3CLzFldTttNxXlmtH8rSA7J+a0EuHBYOpXdq1yvS26rGgCudjzPwn1nA== 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=MxcuQ43UtVKrlDdNHP1rNUtcsO9Xxu59Irj7+0sfD9Q=; b=Za7uq6F8lF3ZqPF4RjcGM289RTqS9FS5e2P1GN30ZTChH8E/hNsdRsNlfEb3Qnv3oKFR8K00zjXRMI70b8IxgRXOm1Z8VIWcsFnUZs5qI2nSnYPUvH92o0YpOq6goYdkC7FBPz5LtsVhBWRSdqeyriG82i6SzYLbd3NgkR4MBkM= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=amd.com; Received: from MN2PR12MB3775.namprd12.prod.outlook.com (2603:10b6:208:159::19) by MN2PR12MB3901.namprd12.prod.outlook.com (2603:10b6:208:16c::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3784.12; Wed, 27 Jan 2021 10:54:06 +0000 Received: from MN2PR12MB3775.namprd12.prod.outlook.com ([fe80::44f:9f01:ece7:f0e5]) by MN2PR12MB3775.namprd12.prod.outlook.com ([fe80::44f:9f01:ece7:f0e5%3]) with mapi id 15.20.3784.019; Wed, 27 Jan 2021 10:54:06 +0000 Subject: Re: [PATCH] procfs/dmabuf: Add /proc//task//dmabuf_fds To: Michal Hocko , Kalesh Singh Cc: surenb@google.com, minchan@kernel.org, gregkh@linuxfoundation.org, hridya@google.com, jannh@google.com, kernel-team@android.com, Alexey Dobriyan , Jonathan Corbet , Sumit Semwal , Mauro Carvalho Chehab , Andrew Morton , Kees Cook , Alexey Gladkov , Szabolcs Nagy , "Eric W. Biederman" , Daniel Jordan , Michel Lespinasse , Bernd Edlinger , Andrei Vagin , Yafang Shao , Hui Su , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-doc@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, linux-api@vger.kernel.org References: <20210126225138.1823266-1-kaleshsingh@google.com> <20210127090526.GB827@dhcp22.suse.cz> From: =?UTF-8?Q?Christian_K=c3=b6nig?= Message-ID: <6b314cf2-99f0-8e63-acc7-edebe2ca97d7@amd.com> Date: Wed, 27 Jan 2021 11:53:55 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 In-Reply-To: <20210127090526.GB827@dhcp22.suse.cz> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Originating-IP: [2a02:908:1252:fb60:be8a:bd56:1f94:86e7] X-ClientProxiedBy: AM0PR10CA0032.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::12) To MN2PR12MB3775.namprd12.prod.outlook.com (2603:10b6:208:159::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [IPv6:2a02:908:1252:fb60:be8a:bd56:1f94:86e7] (2a02:908:1252:fb60:be8a:bd56:1f94:86e7) by AM0PR10CA0032.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3805.16 via Frontend Transport; Wed, 27 Jan 2021 10:54:01 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 27bb2f17-2e7f-45b1-aef5-08d8c2b1dd61 X-MS-TrafficTypeDiagnostic: MN2PR12MB3901: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:4303; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: C4BBB0i5p9A2z5vY4KAC651KUJQ0brRImfHef2UbnhhkEpRzTkBN5DV2MvKJROz0expXs8SRyWPsCQFRTkcKzsbfSNOgvhj4XyJUPMG9b+KAKa1keQ3aVTG3zT4mmwUQpMwjvzvQ7WhIJgqp8hnwRTvewi1BDZWWu3fuSEezJYgEzmC6jYGMeCgSJ9uz40gkN5+nJf1sa7xJtgEefGARDMMEUNR8l0pcxFOrxLtaLk3GLjdnPluhPlPzAV1AxFpSJ03wxYwg6AQ2Xv6tbLLUiLG6K10J0dyPMJ9I7z7Lk9E07A+vTI5aBpBHp84LNx48auKiAE0sm8i5FLWIBaO+1PyO5H0Fzfp3royBYLwnRe25LMYnlSAx8avwPeaf5QTwMP4FwxCbYv5t1A6yEfRdFrvD+LdTDIonTqJvONkLbL5jGAq4OkFHpKqj9TaICUlGI8lug1ugwkaAj+wY/YLVHSha9TRJsCgEDBa2hUL3pMnW5/0pGUxIqzxgrlFNHRErDC78BsbBd3kyLw90mKT6ZrUDA6/h1XcII7OFjWxtrMJCGWlMWALQ42Hy2dMu6ise+T5uMXEb7WS+GKx4zRLeqg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR12MB3775.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(136003)(346002)(376002)(39860400002)(396003)(366004)(2616005)(83380400001)(52116002)(30864003)(66556008)(8676002)(2906002)(66476007)(31686004)(186003)(110136005)(66946007)(31696002)(34580700001)(45080400002)(16526019)(7416002)(6486002)(6666004)(478600001)(86362001)(966005)(4326008)(7406005)(54906003)(36756003)(316002)(8936002)(5660300002)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?utf-8?B?ZXpLeCt2cm4yMG1EWTcyOHROR1RVTEVHbkczUDlPVUN2UXhHU1N0LzlabXVO?= =?utf-8?B?TExYNzVFYlFOV1ZHT1F5YytUa2hxVXRJY3pRWUZ5WGdkMVlIZFYxaHNzTDFN?= =?utf-8?B?cWMydWROcEFzVDFQalJlZjdtWGVvaitnc2pmWXQzZm12dC9LWE9WWUVaUjFn?= =?utf-8?B?WVBEb0ExSjNDNFFpVldPNWRSK1FzbWFuWDZZM0ROWDU1Mk84ejBJZjkrK1Zt?= =?utf-8?B?dWhtVjZCOUl1YzlXMC9XUkt0Q3JOOGVYQVRaK3VCUEVOVkNvRjRWbWpqZDRh?= =?utf-8?B?ejJxSVVGNjdSb29GZDVtRGV5a0dzR0RrZkRua3VMQjdkaDh2Sy9JeXl1eFVC?= =?utf-8?B?YjkrMnQ1RnIrb0FSUU4xSXFTMFlUWmRCM1hZTm5Wc2xzUUo1N2w3K3pzYWYr?= =?utf-8?B?elZUOVI0YWM1ZEQ1Sk4zVUJ0RS9iWEtTMzJNMVNsY1poeHpPMVc1ZjBVYkls?= =?utf-8?B?UVZrZEhtOFVIeXZ1RkRxWGJsMUVGaDlSRllwUHJEK0s1Ky9HcmtLaU1ZRUdt?= =?utf-8?B?SytmcTV0Mm1sOVNoWEJJTTh3ZjJ6c3RLengrNlhBb0I1WmRkZzh0c1d0TUhW?= =?utf-8?B?QVkzWnE3MjRDclBWay9KOTdENS9JRGxjRXdJWk9udkhtbEN1Y0lNVGJ2d0NT?= =?utf-8?B?d2VRQ3NhSlN4VjMzREFpd2NlM3Z4eDJTakYwQVZDSjdVdG10azZaMjhSejdl?= =?utf-8?B?dk9TUzE2VzRwekU0ZmVwd2dpNTB5cVFFMGZwa2gvUHZrZVZnUm8zUEhxa3ZS?= =?utf-8?B?Zk5RbFkwNVMwaE1Pb3hIc2h4WGt5R2xSbnVHbWhocW9rQjJiWFF6aFJoS0dq?= =?utf-8?B?dTRFQmR2bmxyWHVqSnpqeXgwMDdtMzFsK2FGMXNiVEtVb3RHTlZVSTdRUzND?= =?utf-8?B?L3c5VGE3aHFkcS9ZWnhIbEQ4WEJuZmpPZFpKS1UzU0l3UE1rNzA4UW0xVC9k?= =?utf-8?B?TU5uWWhqUlJFMC9MV3hab2JQRGxmSmJIWjkwVjVLR05Lekw3Vy9raURteEIv?= =?utf-8?B?TUpHWGVUT2pVcUErbHEwTlQ5RjhGS0MvRG1CaWwwOWxQOE9LOEJHQzdZM0ZM?= =?utf-8?B?WGY1UUEzUjhJNmF5Z2p3dUM2cFYyTTJBenZZREhBNWlvWUFlVGlPc2F5ck4y?= =?utf-8?B?Nlp5RjlUTGFVSU1COXBHMW5EaFZNZEZ3ZWNrMytYMkw3YWQrOEI0cnJGL1Ev?= =?utf-8?B?NzRPQkhmY3d2L2N3N2dtVkJWTkxTYy9HM25WbWxHTGRqU0xzMis3Y2k2SU5w?= =?utf-8?B?U2tCN0FRMzc5NXVIQWI0TzhKQkp2Z3pCMHFuQ2I5SDludjVkVUkxb0ZCQnVt?= =?utf-8?B?bHdTZXByZCsxMlhxWVVyd0Q0dTNiWnFibGRwYUl1U0p1VWR3ZlIwdmcrMTRP?= =?utf-8?B?aGd4cHFLY3Eyck9HLzdSeVdNOHhqb3B3VE5WV0NRZ2lkRGx1RzVpMEVNakZW?= =?utf-8?B?bmRUWlJkQ3FxTFhZL21yNVlaYkRFVGZOSWI0eUdKQUUwS3NQN0pOUWpmM2hU?= =?utf-8?B?MCtxZTBsdENmbllnU1IvNG1RWThOTkFXNkdtTEtZeFdwOUFmUk1kdUI5RVV2?= =?utf-8?B?bFk0Zz09?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 27bb2f17-2e7f-45b1-aef5-08d8c2b1dd61 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3775.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jan 2021 10:54:05.9827 (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: Qlin0AK2FkdeYdSrcuT/ut8QrkidWkUj98qK2EeXAH+tXMWxWNnVLVUZDFp0mbeX X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB3901 Precedence: bulk List-ID: X-Mailing-List: linux-api@vger.kernel.org Am 27.01.21 um 10:05 schrieb Michal Hocko: > [Cc linux-api as this is a new user interface] > > On Tue 26-01-21 22:51:28, Kalesh Singh wrote: >> In order to measure how much memory a process actually consumes, it is >> necessary to include the DMA buffer sizes for that process in the memory >> accounting. Since the handle to DMA buffers are raw FDs, it is important >> to be able to identify which processes have FD references to a DMA buffer. >> >> Currently, DMA buffer FDs can be accounted using /proc//fd/* and >> /proc//fdinfo -- both of which are only root readable, as follows: >> 1. Do a readlink on each FD. >> 2. If the target path begins with "/dmabuf", then the FD is a dmabuf FD. >> 3. stat the file to get the dmabuf inode number. >> 4. Read/ proc//fdinfo/, to get the DMA buffer size. >> >> Android captures per-process system memory state when certain low memory >> events (e.g a foreground app kill) occur, to identify potential memory >> hoggers. To include a process’s dmabuf usage as part of its memory state, >> the data collection needs to be fast enough to reflect the memory state at >> the time of such events. >> >> Since reading /proc//fd/ and /proc//fdinfo/ requires root >> privileges, this approach is not suitable for production builds. Granting >> root privileges even to a system process increases the attack surface and >> is highly undesirable. Additionally this is slow as it requires many >> context switches for searching and getting the dma-buf info. >> >> With the addition of per-buffer dmabuf stats in sysfs [1], the DMA buffer >> details can be queried using their unique inode numbers. While this looks technically clean I have to agree with Daniel that this approach doesn't sounds like the right thing to do. The fundamental problem goes deeper than what's proposed here. In general processes are currently not held accountable for memory they reference through their file descriptors. DMA-buf is just one special case. In other words you can currently do something like this fd = memfd_create("test", 0); while (1)     write(fd, buf, 1024); and the OOM killer will terminate random processes, but never the one holding the memfd reference. It even becomes worse with GPU and acceleration drivers where easily all of the system memory is allocated for for games or scientific applications without being able to see that in proc or sysfs. Some years ago I've proposed a way to at least improve the OOM killer decision which process to terminate, but that never went something. Regards, Christian. >> >> This patch proposes adding a /proc//task//dmabuf_fds interface. >> >> /proc//task//dmabuf_fds contains a list of inode numbers for >> every DMA buffer FD that the task has. Entries with the same inode >> number can appear more than once, indicating the total FD references >> for the associated DMA buffer. >> >> If a thread shares the same files as the group leader then its >> dmabuf_fds file will be empty, as these dmabufs are reported by the >> group leader. >> >> The interface requires PTRACE_MODE_READ_FSCRED (same as /proc//maps) >> and allows the efficient accounting of per-process DMA buffer usage without >> requiring root privileges. (See data below) >> >> Performance Comparison: >> ----------------------- >> >> The following data compares the time to capture the sizes of all DMA >> buffers referenced by FDs for all processes on an arm64 android device. >> >> ------------------------------------------------------- >> | Core 0 (Little) | Core 7 (Big) | >> ------------------------------------------------------- >> >From /fdinfo | 318 ms | 145 ms | >> ------------------------------------------------------- >> Inodes from | 114 ms | 27 ms | >> dmabuf_fds; | (2.8x ^) | (5.4x ^) | >> data from sysfs | | | >> ------------------------------------------------------- >> >> It can be inferred that in the worst case there is a 2.8x speedup for >> determining per-process DMA buffer FD sizes, when using the proposed >> interfaces. >> >> [1] https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Fdri-devel%2F20210119225723.388883-1-hridya%40google.com%2F&data=04%7C01%7Cchristian.koenig%40amd.com%7Cfafaecb186a8408c307208d8c2a2b264%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637473351428416475%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=NIhGLE6ysENKIZPMKari23pczegYl5xNwbz0gzK8sj4%3D&reserved=0 >> >> Signed-off-by: Kalesh Singh >> --- >> Documentation/filesystems/proc.rst | 30 ++++++ >> drivers/dma-buf/dma-buf.c | 7 +- >> fs/proc/Makefile | 1 + >> fs/proc/base.c | 1 + >> fs/proc/dma_bufs.c | 159 +++++++++++++++++++++++++++++ >> fs/proc/internal.h | 1 + >> include/linux/dma-buf.h | 5 + >> 7 files changed, 198 insertions(+), 6 deletions(-) >> create mode 100644 fs/proc/dma_bufs.c >> >> diff --git a/Documentation/filesystems/proc.rst b/Documentation/filesystems/proc.rst >> index 2fa69f710e2a..757dd47ab679 100644 >> --- a/Documentation/filesystems/proc.rst >> +++ b/Documentation/filesystems/proc.rst >> @@ -47,6 +47,7 @@ fixes/update part 1.1 Stefani Seibold June 9 2009 >> 3.10 /proc//timerslack_ns - Task timerslack value >> 3.11 /proc//patch_state - Livepatch patch operation state >> 3.12 /proc//arch_status - Task architecture specific information >> + 3.13 /proc//task//dmabuf_fds - DMA buffers referenced by an FD >> >> 4 Configuring procfs >> 4.1 Mount options >> @@ -2131,6 +2132,35 @@ AVX512_elapsed_ms >> the task is unlikely an AVX512 user, but depends on the workload and the >> scheduling scenario, it also could be a false negative mentioned above. >> >> +3.13 /proc//task//dmabuf_fds - DMA buffers referenced by an FD >> +------------------------------------------------------------------------- >> +This file exposes a list of the inode numbers for every DMA buffer >> +FD that the task has. >> + >> +The same inode number can appear more than once, indicating the total >> +FD references for the associated DMA buffer. >> + >> +The inode number can be used to lookup the DMA buffer information in >> +the sysfs interface /sys/kernel/dmabuf/buffers//. >> + >> +Example Output >> +~~~~~~~~~~~~~~ >> +$ cat /proc/612/task/612/dmabuf_fds >> +30972 30973 45678 49326 >> + >> +Permission to access this file is governed by a ptrace access mode >> +PTRACE_MODE_READ_FSCREDS. >> + >> +Threads can have different files when created without specifying >> +the CLONE_FILES flag. For this reason the interface is presented as >> +/proc//task//dmabuf_fds and not /proc//dmabuf_fds. >> +This simplifies kernel code and aggregation can be handled in >> +userspace. >> + >> +If a thread has the same files as its group leader, then its dmabuf_fds >> +file will be empty as these dmabufs are already reported by the >> +group leader. >> + >> Chapter 4: Configuring procfs >> ============================= >> >> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c >> index 9ad6397aaa97..0660c06be4c6 100644 >> --- a/drivers/dma-buf/dma-buf.c >> +++ b/drivers/dma-buf/dma-buf.c >> @@ -29,8 +29,6 @@ >> #include >> #include >> >> -static inline int is_dma_buf_file(struct file *); >> - >> struct dma_buf_list { >> struct list_head head; >> struct mutex lock; >> @@ -434,10 +432,7 @@ static const struct file_operations dma_buf_fops = { >> .show_fdinfo = dma_buf_show_fdinfo, >> }; >> >> -/* >> - * is_dma_buf_file - Check if struct file* is associated with dma_buf >> - */ >> -static inline int is_dma_buf_file(struct file *file) >> +int is_dma_buf_file(struct file *file) >> { >> return file->f_op == &dma_buf_fops; >> } >> diff --git a/fs/proc/Makefile b/fs/proc/Makefile >> index bd08616ed8ba..91a67f43ddf4 100644 >> --- a/fs/proc/Makefile >> +++ b/fs/proc/Makefile >> @@ -16,6 +16,7 @@ proc-y += cmdline.o >> proc-y += consoles.o >> proc-y += cpuinfo.o >> proc-y += devices.o >> +proc-y += dma_bufs.o >> proc-y += interrupts.o >> proc-y += loadavg.o >> proc-y += meminfo.o >> diff --git a/fs/proc/base.c b/fs/proc/base.c >> index b3422cda2a91..af15a60b9831 100644 >> --- a/fs/proc/base.c >> +++ b/fs/proc/base.c >> @@ -3598,6 +3598,7 @@ static const struct pid_entry tid_base_stuff[] = { >> #ifdef CONFIG_SECCOMP_CACHE_DEBUG >> ONE("seccomp_cache", S_IRUSR, proc_pid_seccomp_cache), >> #endif >> + REG("dmabuf_fds", 0444, proc_tid_dmabuf_fds_operations), >> }; >> >> static int proc_tid_base_readdir(struct file *file, struct dir_context *ctx) >> diff --git a/fs/proc/dma_bufs.c b/fs/proc/dma_bufs.c >> new file mode 100644 >> index 000000000000..46ea9cf968ed >> --- /dev/null >> +++ b/fs/proc/dma_bufs.c >> @@ -0,0 +1,159 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +/* >> + * Per-process DMA-BUF Stats >> + * >> + * Copyright (C) 2021 Google LLC. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> + >> +#include "internal.h" >> + >> +struct dmabuf_fds_private { >> + struct inode *inode; >> + struct task_struct *task; >> + struct file *dmabuf_file; >> +}; >> + >> +static loff_t *next_dmabuf(struct dmabuf_fds_private *priv, >> + loff_t *pos) >> +{ >> + struct fdtable *fdt; >> + struct file *file; >> + >> + rcu_read_lock(); >> + fdt = files_fdtable(priv->task->files); >> + for (; *pos < fdt->max_fds; ++*pos) { >> + file = files_lookup_fd_rcu(priv->task->files, (unsigned int) *pos); >> + if (file && is_dma_buf_file(file) && get_file_rcu(file)) { >> + priv->dmabuf_file = file; >> + break; >> + } >> + } >> + if (*pos >= fdt->max_fds) >> + pos = NULL; >> + rcu_read_unlock(); >> + >> + return pos; >> +} >> + >> +static void *dmabuf_fds_seq_start(struct seq_file *s, loff_t *pos) >> +{ >> + struct dmabuf_fds_private *priv = s->private; >> + struct files_struct *group_leader_files; >> + >> + priv->task = get_proc_task(priv->inode); >> + >> + if (!priv->task) >> + return ERR_PTR(-ESRCH); >> + >> + /* Hold task lock for duration that files need to be stable */ >> + task_lock(priv->task); >> + >> + /* >> + * If this task is not the group leader but shares the same files, leave file empty. >> + * These dmabufs are already reported in the group leader's dmabuf_fds. >> + */ >> + group_leader_files = priv->task->group_leader->files; >> + if (priv->task != priv->task->group_leader && priv->task->files == group_leader_files) { >> + task_unlock(priv->task); >> + put_task_struct(priv->task); >> + priv->task = NULL; >> + return NULL; >> + } >> + >> + return next_dmabuf(priv, pos); >> +} >> + >> +static void *dmabuf_fds_seq_next(struct seq_file *s, void *v, loff_t *pos) >> +{ >> + ++*pos; >> + return next_dmabuf(s->private, pos); >> +} >> + >> +static void dmabuf_fds_seq_stop(struct seq_file *s, void *v) >> +{ >> + struct dmabuf_fds_private *priv = s->private; >> + >> + if (priv->task) { >> + task_unlock(priv->task); >> + put_task_struct(priv->task); >> + >> + } >> + if (priv->dmabuf_file) >> + fput(priv->dmabuf_file); >> +} >> + >> +static int dmabuf_fds_seq_show(struct seq_file *s, void *v) >> +{ >> + struct dmabuf_fds_private *priv = s->private; >> + struct file *file = priv->dmabuf_file; >> + struct dma_buf *dmabuf = file->private_data; >> + >> + if (!dmabuf) >> + return -ESRCH; >> + >> + seq_printf(s, "%8lu ", file_inode(file)->i_ino); >> + >> + fput(priv->dmabuf_file); >> + priv->dmabuf_file = NULL; >> + >> + return 0; >> +} >> + >> +static const struct seq_operations proc_tid_dmabuf_fds_seq_ops = { >> + .start = dmabuf_fds_seq_start, >> + .next = dmabuf_fds_seq_next, >> + .stop = dmabuf_fds_seq_stop, >> + .show = dmabuf_fds_seq_show >> +}; >> + >> +static int proc_dmabuf_fds_open(struct inode *inode, struct file *file, >> + const struct seq_operations *ops) >> +{ >> + struct dmabuf_fds_private *priv; >> + struct task_struct *task; >> + bool allowed = false; >> + >> + task = get_proc_task(inode); >> + if (!task) >> + return -ESRCH; >> + >> + allowed = ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS); >> + put_task_struct(task); >> + >> + if (!allowed) >> + return -EACCES; >> + >> + priv = __seq_open_private(file, ops, sizeof(*priv)); >> + if (!priv) >> + return -ENOMEM; >> + >> + priv->inode = inode; >> + priv->task = NULL; >> + priv->dmabuf_file = NULL; >> + >> + return 0; >> +} >> + >> +static int proc_dmabuf_fds_release(struct inode *inode, struct file *file) >> +{ >> + return seq_release_private(inode, file); >> +} >> + >> +static int tid_dmabuf_fds_open(struct inode *inode, struct file *file) >> +{ >> + return proc_dmabuf_fds_open(inode, file, >> + &proc_tid_dmabuf_fds_seq_ops); >> +} >> + >> +const struct file_operations proc_tid_dmabuf_fds_operations = { >> + .open = tid_dmabuf_fds_open, >> + .read = seq_read, >> + .llseek = seq_lseek, >> + .release = proc_dmabuf_fds_release, >> +}; >> + >> diff --git a/fs/proc/internal.h b/fs/proc/internal.h >> index f60b379dcdc7..4ca74220db9c 100644 >> --- a/fs/proc/internal.h >> +++ b/fs/proc/internal.h >> @@ -303,6 +303,7 @@ extern const struct file_operations proc_pid_smaps_operations; >> extern const struct file_operations proc_pid_smaps_rollup_operations; >> extern const struct file_operations proc_clear_refs_operations; >> extern const struct file_operations proc_pagemap_operations; >> +extern const struct file_operations proc_tid_dmabuf_fds_operations; >> >> extern unsigned long task_vsize(struct mm_struct *); >> extern unsigned long task_statm(struct mm_struct *, >> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h >> index cf72699cb2bc..087e11f7f193 100644 >> --- a/include/linux/dma-buf.h >> +++ b/include/linux/dma-buf.h >> @@ -27,6 +27,11 @@ struct device; >> struct dma_buf; >> struct dma_buf_attachment; >> >> +/** >> + * Check if struct file* is associated with dma_buf. >> + */ >> +int is_dma_buf_file(struct file *file); >> + >> /** >> * struct dma_buf_ops - operations possible on struct dma_buf >> * @vmap: [optional] creates a virtual mapping for the buffer into kernel >> -- >> 2.30.0.280.ga3ce27912f-goog From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.0 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E2C09C433E0 for ; Wed, 27 Jan 2021 10:54:12 +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 7A1C620724 for ; Wed, 27 Jan 2021 10:54:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7A1C620724 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=amd.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 70B6789A9A; Wed, 27 Jan 2021 10:54:11 +0000 (UTC) Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2083.outbound.protection.outlook.com [40.107.237.83]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2C96389A9A for ; Wed, 27 Jan 2021 10:54:10 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KDct+n6XpURJh/Smm5e0V4IapDNrTiBwPR5Dp+OS82JZFa/w+Rjg7c4tdwj5s3hDs82GzgQUh5MWO9wl7LNtTQBOfsenQFAev3peIVIPlbg7N/iWX+95Ivrmt9z30uJGRo3wkUL+UJqGKf4GZ74cN5RCdgmlOQTh8Qzt3lC6VzGOzED592EIkERZ/ZM3R6MA/MtfbeWH6rP5yNUCDL1wZOV09Dbha+nqDqKIsjzMUrH70hqYuy8nbMTJApOqVq2C9xuwKc1yHEncm52kBIwGmfYMdWKZiIskG771XmbZye5IdkiM3lF4IUy3VQyQJ3qzESYnCLQhyRePapEzWWX6uw== 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=MxcuQ43UtVKrlDdNHP1rNUtcsO9Xxu59Irj7+0sfD9Q=; b=YhRtDsqvo0an4tRbRQl5rQjADSnVCDCGuvS3+81a036HijNzcW8dZdlaj96hKbhtN/I0m4W0aG9Wdg7b31HlpcgKqd3zx1C21VkXKNjc1f5nRqR7BavR6JVJNQZS+AD8TuOE4gdjA19FOchOoqSEyu8DazNY90T1RWDXY0lOBCx0OSbX6SUs7SOYM8tZ/vA2VNCDUoUJRj+RpTbTE+YxYvl37Zto1VfuLUsZ1eg1jXzuyOjdeHDKC+msKJ7ABAujxj00m/HrN17kABbFXLWgqJp65Qo++A3CLzFldTttNxXlmtH8rSA7J+a0EuHBYOpXdq1yvS26rGgCudjzPwn1nA== 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=MxcuQ43UtVKrlDdNHP1rNUtcsO9Xxu59Irj7+0sfD9Q=; b=Za7uq6F8lF3ZqPF4RjcGM289RTqS9FS5e2P1GN30ZTChH8E/hNsdRsNlfEb3Qnv3oKFR8K00zjXRMI70b8IxgRXOm1Z8VIWcsFnUZs5qI2nSnYPUvH92o0YpOq6goYdkC7FBPz5LtsVhBWRSdqeyriG82i6SzYLbd3NgkR4MBkM= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=amd.com; Received: from MN2PR12MB3775.namprd12.prod.outlook.com (2603:10b6:208:159::19) by MN2PR12MB3901.namprd12.prod.outlook.com (2603:10b6:208:16c::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3784.12; Wed, 27 Jan 2021 10:54:06 +0000 Received: from MN2PR12MB3775.namprd12.prod.outlook.com ([fe80::44f:9f01:ece7:f0e5]) by MN2PR12MB3775.namprd12.prod.outlook.com ([fe80::44f:9f01:ece7:f0e5%3]) with mapi id 15.20.3784.019; Wed, 27 Jan 2021 10:54:06 +0000 Subject: Re: [PATCH] procfs/dmabuf: Add /proc//task//dmabuf_fds To: Michal Hocko , Kalesh Singh References: <20210126225138.1823266-1-kaleshsingh@google.com> <20210127090526.GB827@dhcp22.suse.cz> From: =?UTF-8?Q?Christian_K=c3=b6nig?= Message-ID: <6b314cf2-99f0-8e63-acc7-edebe2ca97d7@amd.com> Date: Wed, 27 Jan 2021 11:53:55 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 In-Reply-To: <20210127090526.GB827@dhcp22.suse.cz> Content-Language: en-US X-Originating-IP: [2a02:908:1252:fb60:be8a:bd56:1f94:86e7] X-ClientProxiedBy: AM0PR10CA0032.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::12) To MN2PR12MB3775.namprd12.prod.outlook.com (2603:10b6:208:159::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [IPv6:2a02:908:1252:fb60:be8a:bd56:1f94:86e7] (2a02:908:1252:fb60:be8a:bd56:1f94:86e7) by AM0PR10CA0032.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3805.16 via Frontend Transport; Wed, 27 Jan 2021 10:54:01 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 27bb2f17-2e7f-45b1-aef5-08d8c2b1dd61 X-MS-TrafficTypeDiagnostic: MN2PR12MB3901: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:4303; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: C4BBB0i5p9A2z5vY4KAC651KUJQ0brRImfHef2UbnhhkEpRzTkBN5DV2MvKJROz0expXs8SRyWPsCQFRTkcKzsbfSNOgvhj4XyJUPMG9b+KAKa1keQ3aVTG3zT4mmwUQpMwjvzvQ7WhIJgqp8hnwRTvewi1BDZWWu3fuSEezJYgEzmC6jYGMeCgSJ9uz40gkN5+nJf1sa7xJtgEefGARDMMEUNR8l0pcxFOrxLtaLk3GLjdnPluhPlPzAV1AxFpSJ03wxYwg6AQ2Xv6tbLLUiLG6K10J0dyPMJ9I7z7Lk9E07A+vTI5aBpBHp84LNx48auKiAE0sm8i5FLWIBaO+1PyO5H0Fzfp3royBYLwnRe25LMYnlSAx8avwPeaf5QTwMP4FwxCbYv5t1A6yEfRdFrvD+LdTDIonTqJvONkLbL5jGAq4OkFHpKqj9TaICUlGI8lug1ugwkaAj+wY/YLVHSha9TRJsCgEDBa2hUL3pMnW5/0pGUxIqzxgrlFNHRErDC78BsbBd3kyLw90mKT6ZrUDA6/h1XcII7OFjWxtrMJCGWlMWALQ42Hy2dMu6ise+T5uMXEb7WS+GKx4zRLeqg== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB3775.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(136003)(346002)(376002)(39860400002)(396003)(366004)(2616005)(83380400001)(52116002)(30864003)(66556008)(8676002)(2906002)(66476007)(31686004)(186003)(110136005)(66946007)(31696002)(34580700001)(45080400002)(16526019)(7416002)(6486002)(6666004)(478600001)(86362001)(966005)(4326008)(7406005)(54906003)(36756003)(316002)(8936002)(5660300002)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?utf-8?B?ZXpLeCt2cm4yMG1EWTcyOHROR1RVTEVHbkczUDlPVUN2UXhHU1N0LzlabXVO?= =?utf-8?B?TExYNzVFYlFOV1ZHT1F5YytUa2hxVXRJY3pRWUZ5WGdkMVlIZFYxaHNzTDFN?= =?utf-8?B?cWMydWROcEFzVDFQalJlZjdtWGVvaitnc2pmWXQzZm12dC9LWE9WWUVaUjFn?= =?utf-8?B?WVBEb0ExSjNDNFFpVldPNWRSK1FzbWFuWDZZM0ROWDU1Mk84ejBJZjkrK1Zt?= =?utf-8?B?dWhtVjZCOUl1YzlXMC9XUkt0Q3JOOGVYQVRaK3VCUEVOVkNvRjRWbWpqZDRh?= =?utf-8?B?ejJxSVVGNjdSb29GZDVtRGV5a0dzR0RrZkRua3VMQjdkaDh2Sy9JeXl1eFVC?= =?utf-8?B?YjkrMnQ1RnIrb0FSUU4xSXFTMFlUWmRCM1hZTm5Wc2xzUUo1N2w3K3pzYWYr?= =?utf-8?B?elZUOVI0YWM1ZEQ1Sk4zVUJ0RS9iWEtTMzJNMVNsY1poeHpPMVc1ZjBVYkls?= =?utf-8?B?UVZrZEhtOFVIeXZ1RkRxWGJsMUVGaDlSRllwUHJEK0s1Ky9HcmtLaU1ZRUdt?= =?utf-8?B?SytmcTV0Mm1sOVNoWEJJTTh3ZjJ6c3RLengrNlhBb0I1WmRkZzh0c1d0TUhW?= =?utf-8?B?QVkzWnE3MjRDclBWay9KOTdENS9JRGxjRXdJWk9udkhtbEN1Y0lNVGJ2d0NT?= =?utf-8?B?d2VRQ3NhSlN4VjMzREFpd2NlM3Z4eDJTakYwQVZDSjdVdG10azZaMjhSejdl?= =?utf-8?B?dk9TUzE2VzRwekU0ZmVwd2dpNTB5cVFFMGZwa2gvUHZrZVZnUm8zUEhxa3ZS?= =?utf-8?B?Zk5RbFkwNVMwaE1Pb3hIc2h4WGt5R2xSbnVHbWhocW9rQjJiWFF6aFJoS0dq?= =?utf-8?B?dTRFQmR2bmxyWHVqSnpqeXgwMDdtMzFsK2FGMXNiVEtVb3RHTlZVSTdRUzND?= =?utf-8?B?L3c5VGE3aHFkcS9ZWnhIbEQ4WEJuZmpPZFpKS1UzU0l3UE1rNzA4UW0xVC9k?= =?utf-8?B?TU5uWWhqUlJFMC9MV3hab2JQRGxmSmJIWjkwVjVLR05Lekw3Vy9raURteEIv?= =?utf-8?B?TUpHWGVUT2pVcUErbHEwTlQ5RjhGS0MvRG1CaWwwOWxQOE9LOEJHQzdZM0ZM?= =?utf-8?B?WGY1UUEzUjhJNmF5Z2p3dUM2cFYyTTJBenZZREhBNWlvWUFlVGlPc2F5ck4y?= =?utf-8?B?Nlp5RjlUTGFVSU1COXBHMW5EaFZNZEZ3ZWNrMytYMkw3YWQrOEI0cnJGL1Ev?= =?utf-8?B?NzRPQkhmY3d2L2N3N2dtVkJWTkxTYy9HM25WbWxHTGRqU0xzMis3Y2k2SU5w?= =?utf-8?B?U2tCN0FRMzc5NXVIQWI0TzhKQkp2Z3pCMHFuQ2I5SDludjVkVUkxb0ZCQnVt?= =?utf-8?B?bHdTZXByZCsxMlhxWVVyd0Q0dTNiWnFibGRwYUl1U0p1VWR3ZlIwdmcrMTRP?= =?utf-8?B?aGd4cHFLY3Eyck9HLzdSeVdNOHhqb3B3VE5WV0NRZ2lkRGx1RzVpMEVNakZW?= =?utf-8?B?bmRUWlJkQ3FxTFhZL21yNVlaYkRFVGZOSWI0eUdKQUUwS3NQN0pOUWpmM2hU?= =?utf-8?B?MCtxZTBsdENmbllnU1IvNG1RWThOTkFXNkdtTEtZeFdwOUFmUk1kdUI5RVV2?= =?utf-8?B?bFk0Zz09?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 27bb2f17-2e7f-45b1-aef5-08d8c2b1dd61 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3775.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jan 2021 10:54:05.9827 (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: Qlin0AK2FkdeYdSrcuT/ut8QrkidWkUj98qK2EeXAH+tXMWxWNnVLVUZDFp0mbeX X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB3901 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: linux-doc@vger.kernel.org, Szabolcs Nagy , dri-devel@lists.freedesktop.org, Andrei Vagin , Hui Su , Michel Lespinasse , Jonathan Corbet , Mauro Carvalho Chehab , Daniel Jordan , kernel-team@android.com, Alexey Dobriyan , linux-media@vger.kernel.org, Kees Cook , jannh@google.com, linaro-mm-sig@lists.linaro.org, linux-fsdevel@vger.kernel.org, Bernd Edlinger , surenb@google.com, Alexey Gladkov , linux-kernel@vger.kernel.org, minchan@kernel.org, Yafang Shao , "Eric W. Biederman" , gregkh@linuxfoundation.org, hridya@google.com, Andrew Morton , linux-api@vger.kernel.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" QW0gMjcuMDEuMjEgdW0gMTA6MDUgc2NocmllYiBNaWNoYWwgSG9ja286Cj4gW0NjIGxpbnV4LWFw aSBhcyB0aGlzIGlzIGEgbmV3IHVzZXIgaW50ZXJmYWNlXQo+Cj4gT24gVHVlIDI2LTAxLTIxIDIy OjUxOjI4LCBLYWxlc2ggU2luZ2ggd3JvdGU6Cj4+IEluIG9yZGVyIHRvIG1lYXN1cmUgaG93IG11 Y2ggbWVtb3J5IGEgcHJvY2VzcyBhY3R1YWxseSBjb25zdW1lcywgaXQgaXMKPj4gbmVjZXNzYXJ5 IHRvIGluY2x1ZGUgdGhlIERNQSBidWZmZXIgc2l6ZXMgZm9yIHRoYXQgcHJvY2VzcyBpbiB0aGUg bWVtb3J5Cj4+IGFjY291bnRpbmcuIFNpbmNlIHRoZSBoYW5kbGUgdG8gRE1BIGJ1ZmZlcnMgYXJl IHJhdyBGRHMsIGl0IGlzIGltcG9ydGFudAo+PiB0byBiZSBhYmxlIHRvIGlkZW50aWZ5IHdoaWNo IHByb2Nlc3NlcyBoYXZlIEZEIHJlZmVyZW5jZXMgdG8gYSBETUEgYnVmZmVyLgo+Pgo+PiBDdXJy ZW50bHksIERNQSBidWZmZXIgRkRzIGNhbiBiZSBhY2NvdW50ZWQgdXNpbmcgL3Byb2MvPHBpZD4v ZmQvKiBhbmQKPj4gL3Byb2MvPHBpZD4vZmRpbmZvIC0tIGJvdGggb2Ygd2hpY2ggYXJlIG9ubHkg cm9vdCByZWFkYWJsZSwgYXMgZm9sbG93czoKPj4gICAgMS4gRG8gYSByZWFkbGluayBvbiBlYWNo IEZELgo+PiAgICAyLiBJZiB0aGUgdGFyZ2V0IHBhdGggYmVnaW5zIHdpdGggIi9kbWFidWYiLCB0 aGVuIHRoZSBGRCBpcyBhIGRtYWJ1ZiBGRC4KPj4gICAgMy4gc3RhdCB0aGUgZmlsZSB0byBnZXQg dGhlIGRtYWJ1ZiBpbm9kZSBudW1iZXIuCj4+ICAgIDQuIFJlYWQvIHByb2MvPHBpZD4vZmRpbmZv LzxmZD4sIHRvIGdldCB0aGUgRE1BIGJ1ZmZlciBzaXplLgo+Pgo+PiBBbmRyb2lkIGNhcHR1cmVz IHBlci1wcm9jZXNzIHN5c3RlbSBtZW1vcnkgc3RhdGUgd2hlbiBjZXJ0YWluIGxvdyBtZW1vcnkK Pj4gZXZlbnRzIChlLmcgYSBmb3JlZ3JvdW5kIGFwcCBraWxsKSBvY2N1ciwgdG8gaWRlbnRpZnkg cG90ZW50aWFsIG1lbW9yeQo+PiBob2dnZXJzLiBUbyBpbmNsdWRlIGEgcHJvY2Vzc+KAmXMgZG1h YnVmIHVzYWdlIGFzIHBhcnQgb2YgaXRzIG1lbW9yeSBzdGF0ZSwKPj4gdGhlIGRhdGEgY29sbGVj dGlvbiBuZWVkcyB0byBiZSBmYXN0IGVub3VnaCB0byByZWZsZWN0IHRoZSBtZW1vcnkgc3RhdGUg YXQKPj4gdGhlIHRpbWUgb2Ygc3VjaCBldmVudHMuCj4+Cj4+IFNpbmNlIHJlYWRpbmcgL3Byb2Mv PHBpZD4vZmQvIGFuZCAvcHJvYy88cGlkPi9mZGluZm8vIHJlcXVpcmVzIHJvb3QKPj4gcHJpdmls ZWdlcywgdGhpcyBhcHByb2FjaCBpcyBub3Qgc3VpdGFibGUgZm9yIHByb2R1Y3Rpb24gYnVpbGRz LiBHcmFudGluZwo+PiByb290IHByaXZpbGVnZXMgZXZlbiB0byBhIHN5c3RlbSBwcm9jZXNzIGlu Y3JlYXNlcyB0aGUgYXR0YWNrIHN1cmZhY2UgYW5kCj4+IGlzIGhpZ2hseSB1bmRlc2lyYWJsZS4g QWRkaXRpb25hbGx5IHRoaXMgaXMgc2xvdyBhcyBpdCByZXF1aXJlcyBtYW55Cj4+IGNvbnRleHQg c3dpdGNoZXMgZm9yIHNlYXJjaGluZyBhbmQgZ2V0dGluZyB0aGUgZG1hLWJ1ZiBpbmZvLgo+Pgo+ PiBXaXRoIHRoZSBhZGRpdGlvbiBvZiBwZXItYnVmZmVyIGRtYWJ1ZiBzdGF0cyBpbiBzeXNmcyBb MV0sIHRoZSBETUEgYnVmZmVyCj4+IGRldGFpbHMgY2FuIGJlIHF1ZXJpZWQgdXNpbmcgdGhlaXIg dW5pcXVlIGlub2RlIG51bWJlcnMuCgpXaGlsZSB0aGlzIGxvb2tzIHRlY2huaWNhbGx5IGNsZWFu IEkgaGF2ZSB0byBhZ3JlZSB3aXRoIERhbmllbCB0aGF0IHRoaXMgCmFwcHJvYWNoIGRvZXNuJ3Qg c291bmRzIGxpa2UgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiBUaGUgZnVuZGFtZW50YWwgCnByb2Js ZW0gZ29lcyBkZWVwZXIgdGhhbiB3aGF0J3MgcHJvcG9zZWQgaGVyZS4KCkluIGdlbmVyYWwgcHJv Y2Vzc2VzIGFyZSBjdXJyZW50bHkgbm90IGhlbGQgYWNjb3VudGFibGUgZm9yIG1lbW9yeSB0aGV5 IApyZWZlcmVuY2UgdGhyb3VnaCB0aGVpciBmaWxlIGRlc2NyaXB0b3JzLiBETUEtYnVmIGlzIGp1 c3Qgb25lIHNwZWNpYWwgY2FzZS4KCkluIG90aGVyIHdvcmRzIHlvdSBjYW4gY3VycmVudGx5IGRv IHNvbWV0aGluZyBsaWtlIHRoaXMKCmZkID0gbWVtZmRfY3JlYXRlKCJ0ZXN0IiwgMCk7CndoaWxl ICgxKQogwqDCoMKgIHdyaXRlKGZkLCBidWYsIDEwMjQpOwoKYW5kIHRoZSBPT00ga2lsbGVyIHdp bGwgdGVybWluYXRlIHJhbmRvbSBwcm9jZXNzZXMsIGJ1dCBuZXZlciB0aGUgb25lIApob2xkaW5n IHRoZSBtZW1mZCByZWZlcmVuY2UuCgpJdCBldmVuIGJlY29tZXMgd29yc2Ugd2l0aCBHUFUgYW5k IGFjY2VsZXJhdGlvbiBkcml2ZXJzIHdoZXJlIGVhc2lseSBhbGwgCm9mIHRoZSBzeXN0ZW0gbWVt b3J5IGlzIGFsbG9jYXRlZCBmb3IgZm9yIGdhbWVzIG9yIHNjaWVudGlmaWMgCmFwcGxpY2F0aW9u cyB3aXRob3V0IGJlaW5nIGFibGUgdG8gc2VlIHRoYXQgaW4gcHJvYyBvciBzeXNmcy4KClNvbWUg eWVhcnMgYWdvIEkndmUgcHJvcG9zZWQgYSB3YXkgdG8gYXQgbGVhc3QgaW1wcm92ZSB0aGUgT09N IGtpbGxlciAKZGVjaXNpb24gd2hpY2ggcHJvY2VzcyB0byB0ZXJtaW5hdGUsIGJ1dCB0aGF0IG5l dmVyIHdlbnQgc29tZXRoaW5nLgoKUmVnYXJkcywKQ2hyaXN0aWFuLgoKPj4KPj4gVGhpcyBwYXRj aCBwcm9wb3NlcyBhZGRpbmcgYSAvcHJvYy88cGlkPi90YXNrLzx0aWQ+L2RtYWJ1Zl9mZHMgaW50 ZXJmYWNlLgo+Pgo+PiAvcHJvYy88cGlkPi90YXNrLzx0aWQ+L2RtYWJ1Zl9mZHMgY29udGFpbnMg YSBsaXN0IG9mIGlub2RlIG51bWJlcnMgZm9yCj4+IGV2ZXJ5IERNQSBidWZmZXIgRkQgdGhhdCB0 aGUgdGFzayBoYXMuIEVudHJpZXMgd2l0aCB0aGUgc2FtZSBpbm9kZQo+PiBudW1iZXIgY2FuIGFw cGVhciBtb3JlIHRoYW4gb25jZSwgaW5kaWNhdGluZyB0aGUgdG90YWwgRkQgcmVmZXJlbmNlcwo+ PiBmb3IgdGhlIGFzc29jaWF0ZWQgRE1BIGJ1ZmZlci4KPj4KPj4gSWYgYSB0aHJlYWQgc2hhcmVz IHRoZSBzYW1lIGZpbGVzIGFzIHRoZSBncm91cCBsZWFkZXIgdGhlbiBpdHMKPj4gZG1hYnVmX2Zk cyBmaWxlIHdpbGwgYmUgZW1wdHksIGFzIHRoZXNlIGRtYWJ1ZnMgYXJlIHJlcG9ydGVkIGJ5IHRo ZQo+PiBncm91cCBsZWFkZXIuCj4+Cj4+IFRoZSBpbnRlcmZhY2UgcmVxdWlyZXMgUFRSQUNFX01P REVfUkVBRF9GU0NSRUQgKHNhbWUgYXMgL3Byb2MvPHBpZD4vbWFwcykKPj4gYW5kIGFsbG93cyB0 aGUgZWZmaWNpZW50IGFjY291bnRpbmcgb2YgcGVyLXByb2Nlc3MgRE1BIGJ1ZmZlciB1c2FnZSB3 aXRob3V0Cj4+IHJlcXVpcmluZyByb290IHByaXZpbGVnZXMuIChTZWUgZGF0YSBiZWxvdykKPj4K Pj4gUGVyZm9ybWFuY2UgQ29tcGFyaXNvbjoKPj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4K Pj4gVGhlIGZvbGxvd2luZyBkYXRhIGNvbXBhcmVzIHRoZSB0aW1lIHRvIGNhcHR1cmUgdGhlIHNp emVzIG9mIGFsbCBETUEKPj4gYnVmZmVycyByZWZlcmVuY2VkIGJ5IEZEcyBmb3IgYWxsIHByb2Nl c3NlcyBvbiBhbiBhcm02NCBhbmRyb2lkIGRldmljZS4KPj4KPj4gLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+PiAgICAgICAgICAgICAgICAg ICAgIHwgIENvcmUgMCAoTGl0dGxlKSAgfCAgQ29yZSA3IChCaWcpIHwKPj4gLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+PiA+RnJvbSA8cGlk Pi9mZGluZm8gIHwgICAgICAzMTggbXMgICAgICAgfCAgICAgMTQ1IG1zICAgIHwKPj4gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+PiBJbm9k ZXMgZnJvbSAgICAgICAgfCAgICAgIDExNCBtcyAgICAgICB8ICAgICAgMjcgbXMgICAgfAo+PiBk bWFidWZfZmRzOyAgICAgICAgfCAgICAoMi44eCAgXikgICAgICB8ICAgKDUuNHggIF4pICAgfAo+ PiBkYXRhIGZyb20gc3lzZnMgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAg fAo+PiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCj4+Cj4+IEl0IGNhbiBiZSBpbmZlcnJlZCB0aGF0IGluIHRoZSB3b3JzdCBjYXNlIHRoZXJl IGlzIGEgMi44eCBzcGVlZHVwIGZvcgo+PiBkZXRlcm1pbmluZyBwZXItcHJvY2VzcyBETUEgYnVm ZmVyIEZEIHNpemVzLCB3aGVuIHVzaW5nIHRoZSBwcm9wb3NlZAo+PiBpbnRlcmZhY2VzLgo+Pgo+ PiBbMV0gaHR0cHM6Ly9uYW0xMS5zYWZlbGlua3MucHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJs PWh0dHBzJTNBJTJGJTJGbG9yZS5rZXJuZWwub3JnJTJGZHJpLWRldmVsJTJGMjAyMTAxMTkyMjU3 MjMuMzg4ODgzLTEtaHJpZHlhJTQwZ29vZ2xlLmNvbSUyRiZhbXA7ZGF0YT0wNCU3QzAxJTdDY2hy aXN0aWFuLmtvZW5pZyU0MGFtZC5jb20lN0NmYWZhZWNiMTg2YTg0MDhjMzA3MjA4ZDhjMmEyYjI2 NCU3QzNkZDg5NjFmZTQ4ODRlNjA4ZTExYTgyZDk5NGUxODNkJTdDMCU3QzAlN0M2Mzc0NzMzNTE0 Mjg0MTY0NzUlN0NVbmtub3duJTdDVFdGcGJHWnNiM2Q4ZXlKV0lqb2lNQzR3TGpBd01EQWlMQ0pR SWpvaVYybHVNeklpTENKQlRpSTZJazFoYVd3aUxDSlhWQ0k2TW4wJTNEJTdDMTAwMCZhbXA7c2Rh dGE9TkloR0xFNnlzRU5LSVpQTUthcmkyM3BjemVnWWw1eE53YnowZ3pLOHNqNCUzRCZhbXA7cmVz ZXJ2ZWQ9MAo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBLYWxlc2ggU2luZ2ggPGthbGVzaHNpbmdoQGdv b2dsZS5jb20+Cj4+IC0tLQo+PiAgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy5yc3Qg fCAgMzAgKysrKysrCj4+ICAgZHJpdmVycy9kbWEtYnVmL2RtYS1idWYuYyAgICAgICAgICB8ICAg NyArLQo+PiAgIGZzL3Byb2MvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgfCAgIDEgKwo+PiAg IGZzL3Byb2MvYmFzZS5jICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwo+PiAgIGZzL3Byb2Mv ZG1hX2J1ZnMuYyAgICAgICAgICAgICAgICAgfCAxNTkgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKPj4gICBmcy9wcm9jL2ludGVybmFsLmggICAgICAgICAgICAgICAgIHwgICAxICsKPj4g ICBpbmNsdWRlL2xpbnV4L2RtYS1idWYuaCAgICAgICAgICAgIHwgICA1ICsKPj4gICA3IGZpbGVz IGNoYW5nZWQsIDE5OCBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQo+PiAgIGNyZWF0ZSBt b2RlIDEwMDY0NCBmcy9wcm9jL2RtYV9idWZzLmMKPj4KPj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50 YXRpb24vZmlsZXN5c3RlbXMvcHJvYy5yc3QgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3By b2MucnN0Cj4+IGluZGV4IDJmYTY5ZjcxMGUyYS4uNzU3ZGQ0N2FiNjc5IDEwMDY0NAo+PiAtLS0g YS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MucnN0Cj4+ICsrKyBiL0RvY3VtZW50YXRp b24vZmlsZXN5c3RlbXMvcHJvYy5yc3QKPj4gQEAgLTQ3LDYgKzQ3LDcgQEAgZml4ZXMvdXBkYXRl IHBhcnQgMS4xICBTdGVmYW5pIFNlaWJvbGQgPHN0ZWZhbmlAc2VpYm9sZC5uZXQ+ICAgIEp1bmUg OSAyMDA5Cj4+ICAgICAzLjEwICAvcHJvYy88cGlkPi90aW1lcnNsYWNrX25zIC0gVGFzayB0aW1l cnNsYWNrIHZhbHVlCj4+ICAgICAzLjExCS9wcm9jLzxwaWQ+L3BhdGNoX3N0YXRlIC0gTGl2ZXBh dGNoIHBhdGNoIG9wZXJhdGlvbiBzdGF0ZQo+PiAgICAgMy4xMgkvcHJvYy88cGlkPi9hcmNoX3N0 YXR1cyAtIFRhc2sgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGluZm9ybWF0aW9uCj4+ICsgIDMuMTMJ L3Byb2MvPHBpZD4vdGFzay88dGlkPi9kbWFidWZfZmRzIC0gRE1BIGJ1ZmZlcnMgcmVmZXJlbmNl ZCBieSBhbiBGRAo+PiAgIAo+PiAgICAgNAlDb25maWd1cmluZyBwcm9jZnMKPj4gICAgIDQuMQlN b3VudCBvcHRpb25zCj4+IEBAIC0yMTMxLDYgKzIxMzIsMzUgQEAgQVZYNTEyX2VsYXBzZWRfbXMK Pj4gICAgIHRoZSB0YXNrIGlzIHVubGlrZWx5IGFuIEFWWDUxMiB1c2VyLCBidXQgZGVwZW5kcyBv biB0aGUgd29ya2xvYWQgYW5kIHRoZQo+PiAgICAgc2NoZWR1bGluZyBzY2VuYXJpbywgaXQgYWxz byBjb3VsZCBiZSBhIGZhbHNlIG5lZ2F0aXZlIG1lbnRpb25lZCBhYm92ZS4KPj4gICAKPj4gKzMu MTMgL3Byb2MvPHBpZD4vdGFzay88dGlkPi9kbWFidWZfZmRzIC0gRE1BIGJ1ZmZlcnMgcmVmZXJl bmNlZCBieSBhbiBGRAo+PiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+PiArVGhpcyBmaWxlICBleHBvc2Vz IGEgbGlzdCBvZiB0aGUgaW5vZGUgbnVtYmVycyBmb3IgZXZlcnkgRE1BIGJ1ZmZlcgo+PiArRkQg dGhhdCB0aGUgdGFzayBoYXMuCj4+ICsKPj4gK1RoZSBzYW1lIGlub2RlIG51bWJlciBjYW4gYXBw ZWFyIG1vcmUgdGhhbiBvbmNlLCBpbmRpY2F0aW5nIHRoZSB0b3RhbAo+PiArRkQgcmVmZXJlbmNl cyBmb3IgdGhlIGFzc29jaWF0ZWQgRE1BIGJ1ZmZlci4KPj4gKwo+PiArVGhlIGlub2RlIG51bWJl ciBjYW4gYmUgdXNlZCB0byBsb29rdXAgdGhlIERNQSBidWZmZXIgaW5mb3JtYXRpb24gaW4KPj4g K3RoZSBzeXNmcyBpbnRlcmZhY2UgL3N5cy9rZXJuZWwvZG1hYnVmL2J1ZmZlcnMvPGlub2RlLW5v Pi8uCj4+ICsKPj4gK0V4YW1wbGUgT3V0cHV0Cj4+ICt+fn5+fn5+fn5+fn5+fgo+PiArJCBjYXQg L3Byb2MvNjEyL3Rhc2svNjEyL2RtYWJ1Zl9mZHMKPj4gKzMwOTcyIDMwOTczIDQ1Njc4IDQ5MzI2 Cj4+ICsKPj4gK1Blcm1pc3Npb24gdG8gYWNjZXNzIHRoaXMgZmlsZSBpcyBnb3Zlcm5lZCBieSBh IHB0cmFjZSBhY2Nlc3MgbW9kZQo+PiArUFRSQUNFX01PREVfUkVBRF9GU0NSRURTLgo+PiArCj4+ ICtUaHJlYWRzIGNhbiBoYXZlIGRpZmZlcmVudCBmaWxlcyB3aGVuIGNyZWF0ZWQgd2l0aG91dCBz cGVjaWZ5aW5nCj4+ICt0aGUgQ0xPTkVfRklMRVMgZmxhZy4gRm9yIHRoaXMgcmVhc29uIHRoZSBp bnRlcmZhY2UgaXMgcHJlc2VudGVkIGFzCj4+ICsvcHJvYy88cGlkPi90YXNrLzx0aWQ+L2RtYWJ1 Zl9mZHMgYW5kIG5vdCAvcHJvYy88cGlkPi9kbWFidWZfZmRzLgo+PiArVGhpcyBzaW1wbGlmaWVz IGtlcm5lbCBjb2RlIGFuZCBhZ2dyZWdhdGlvbiBjYW4gYmUgaGFuZGxlZCBpbgo+PiArdXNlcnNw YWNlLgo+PiArCj4+ICtJZiBhIHRocmVhZCBoYXMgdGhlIHNhbWUgZmlsZXMgYXMgaXRzIGdyb3Vw IGxlYWRlciwgdGhlbiBpdHMgZG1hYnVmX2Zkcwo+PiArZmlsZSB3aWxsIGJlIGVtcHR5IGFzIHRo ZXNlIGRtYWJ1ZnMgYXJlIGFscmVhZHkgcmVwb3J0ZWQgYnkgdGhlCj4+ICtncm91cCBsZWFkZXIu Cj4+ICsKPj4gICBDaGFwdGVyIDQ6IENvbmZpZ3VyaW5nIHByb2Nmcwo+PiAgID09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Cj4+ICAgCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYv ZG1hLWJ1Zi5jIGIvZHJpdmVycy9kbWEtYnVmL2RtYS1idWYuYwo+PiBpbmRleCA5YWQ2Mzk3YWFh OTcuLjA2NjBjMDZiZTRjNiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9kbWEtYnVmL2RtYS1idWYu Ywo+PiArKysgYi9kcml2ZXJzL2RtYS1idWYvZG1hLWJ1Zi5jCj4+IEBAIC0yOSw4ICsyOSw2IEBA Cj4+ICAgI2luY2x1ZGUgPHVhcGkvbGludXgvZG1hLWJ1Zi5oPgo+PiAgICNpbmNsdWRlIDx1YXBp L2xpbnV4L21hZ2ljLmg+Cj4+ICAgCj4+IC1zdGF0aWMgaW5saW5lIGludCBpc19kbWFfYnVmX2Zp bGUoc3RydWN0IGZpbGUgKik7Cj4+IC0KPj4gICBzdHJ1Y3QgZG1hX2J1Zl9saXN0IHsKPj4gICAJ c3RydWN0IGxpc3RfaGVhZCBoZWFkOwo+PiAgIAlzdHJ1Y3QgbXV0ZXggbG9jazsKPj4gQEAgLTQz NCwxMCArNDMyLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZG1hX2J1 Zl9mb3BzID0gewo+PiAgIAkuc2hvd19mZGluZm8JPSBkbWFfYnVmX3Nob3dfZmRpbmZvLAo+PiAg IH07Cj4+ICAgCj4+IC0vKgo+PiAtICogaXNfZG1hX2J1Zl9maWxlIC0gQ2hlY2sgaWYgc3RydWN0 IGZpbGUqIGlzIGFzc29jaWF0ZWQgd2l0aCBkbWFfYnVmCj4+IC0gKi8KPj4gLXN0YXRpYyBpbmxp bmUgaW50IGlzX2RtYV9idWZfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSkKPj4gK2ludCBpc19kbWFf YnVmX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCj4+ICAgewo+PiAgIAlyZXR1cm4gZmlsZS0+Zl9v cCA9PSAmZG1hX2J1Zl9mb3BzOwo+PiAgIH0KPj4gZGlmZiAtLWdpdCBhL2ZzL3Byb2MvTWFrZWZp bGUgYi9mcy9wcm9jL01ha2VmaWxlCj4+IGluZGV4IGJkMDg2MTZlZDhiYS4uOTFhNjdmNDNkZGY0 IDEwMDY0NAo+PiAtLS0gYS9mcy9wcm9jL01ha2VmaWxlCj4+ICsrKyBiL2ZzL3Byb2MvTWFrZWZp bGUKPj4gQEAgLTE2LDYgKzE2LDcgQEAgcHJvYy15CSs9IGNtZGxpbmUubwo+PiAgIHByb2MteQkr PSBjb25zb2xlcy5vCj4+ICAgcHJvYy15CSs9IGNwdWluZm8ubwo+PiAgIHByb2MteQkrPSBkZXZp Y2VzLm8KPj4gK3Byb2MteQkrPSBkbWFfYnVmcy5vCj4+ICAgcHJvYy15CSs9IGludGVycnVwdHMu bwo+PiAgIHByb2MteQkrPSBsb2FkYXZnLm8KPj4gICBwcm9jLXkJKz0gbWVtaW5mby5vCj4+IGRp ZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCj4+IGluZGV4IGIzNDIy Y2RhMmE5MS4uYWYxNWE2MGI5ODMxIDEwMDY0NAo+PiAtLS0gYS9mcy9wcm9jL2Jhc2UuYwo+PiAr KysgYi9mcy9wcm9jL2Jhc2UuYwo+PiBAQCAtMzU5OCw2ICszNTk4LDcgQEAgc3RhdGljIGNvbnN0 IHN0cnVjdCBwaWRfZW50cnkgdGlkX2Jhc2Vfc3R1ZmZbXSA9IHsKPj4gICAjaWZkZWYgQ09ORklH X1NFQ0NPTVBfQ0FDSEVfREVCVUcKPj4gICAJT05FKCJzZWNjb21wX2NhY2hlIiwgU19JUlVTUiwg cHJvY19waWRfc2VjY29tcF9jYWNoZSksCj4+ICAgI2VuZGlmCj4+ICsJUkVHKCJkbWFidWZfZmRz IiwgMDQ0NCwgcHJvY190aWRfZG1hYnVmX2Zkc19vcGVyYXRpb25zKSwKPj4gICB9Owo+PiAgIAo+ PiAgIHN0YXRpYyBpbnQgcHJvY190aWRfYmFzZV9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBz dHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCkKPj4gZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZG1hX2J1ZnMu YyBiL2ZzL3Byb2MvZG1hX2J1ZnMuYwo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAw MDAwMDAwMDAwMDAuLjQ2ZWE5Y2Y5NjhlZAo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL2ZzL3By b2MvZG1hX2J1ZnMuYwo+PiBAQCAtMCwwICsxLDE1OSBAQAo+PiArLy8gU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAKPj4gKy8qCj4+ICsgKiBQZXItcHJvY2VzcyBETUEtQlVGIFN0YXRz Cj4+ICsgKgo+PiArICogQ29weXJpZ2h0IChDKSAyMDIxIEdvb2dsZSBMTEMuCj4+ICsgKi8KPj4g Kwo+PiArI2luY2x1ZGUgPGxpbnV4L2RtYS1idWYuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9mZHRh YmxlLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgv c2VxX2ZpbGUuaD4KPj4gKwo+PiArI2luY2x1ZGUgImludGVybmFsLmgiCj4+ICsKPj4gK3N0cnVj dCBkbWFidWZfZmRzX3ByaXZhdGUgewo+PiArCXN0cnVjdCBpbm9kZSAqaW5vZGU7Cj4+ICsJc3Ry dWN0IHRhc2tfc3RydWN0ICp0YXNrOwo+PiArCXN0cnVjdCBmaWxlICpkbWFidWZfZmlsZTsKPj4g K307Cj4+ICsKPj4gK3N0YXRpYyBsb2ZmX3QgKm5leHRfZG1hYnVmKHN0cnVjdCBkbWFidWZfZmRz X3ByaXZhdGUgKnByaXYsCj4+ICsJCWxvZmZfdCAqcG9zKQo+PiArewo+PiArCXN0cnVjdCBmZHRh YmxlICpmZHQ7Cj4+ICsJc3RydWN0IGZpbGUgKmZpbGU7Cj4+ICsKPj4gKwlyY3VfcmVhZF9sb2Nr KCk7Cj4+ICsJZmR0ID0gZmlsZXNfZmR0YWJsZShwcml2LT50YXNrLT5maWxlcyk7Cj4+ICsJZm9y ICg7ICpwb3MgPCBmZHQtPm1heF9mZHM7ICsrKnBvcykgewo+PiArCQlmaWxlID0gZmlsZXNfbG9v a3VwX2ZkX3JjdShwcml2LT50YXNrLT5maWxlcywgKHVuc2lnbmVkIGludCkgKnBvcyk7Cj4+ICsJ CWlmIChmaWxlICYmIGlzX2RtYV9idWZfZmlsZShmaWxlKSAmJiBnZXRfZmlsZV9yY3UoZmlsZSkp IHsKPj4gKwkJCXByaXYtPmRtYWJ1Zl9maWxlID0gZmlsZTsKPj4gKwkJCWJyZWFrOwo+PiArCQl9 Cj4+ICsJfQo+PiArCWlmICgqcG9zID49IGZkdC0+bWF4X2ZkcykKPj4gKwkJcG9zID0gTlVMTDsK Pj4gKwlyY3VfcmVhZF91bmxvY2soKTsKPj4gKwo+PiArCXJldHVybiBwb3M7Cj4+ICt9Cj4+ICsK Pj4gK3N0YXRpYyB2b2lkICpkbWFidWZfZmRzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMs IGxvZmZfdCAqcG9zKQo+PiArewo+PiArCXN0cnVjdCBkbWFidWZfZmRzX3ByaXZhdGUgKnByaXYg PSBzLT5wcml2YXRlOwo+PiArCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmdyb3VwX2xlYWRlcl9maWxl czsKPj4gKwo+PiArCXByaXYtPnRhc2sgPSBnZXRfcHJvY190YXNrKHByaXYtPmlub2RlKTsKPj4g Kwo+PiArCWlmICghcHJpdi0+dGFzaykKPj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsKPj4g Kwo+PiArCS8qIEhvbGQgdGFzayBsb2NrIGZvciBkdXJhdGlvbiB0aGF0IGZpbGVzIG5lZWQgdG8g YmUgc3RhYmxlICovCj4+ICsJdGFza19sb2NrKHByaXYtPnRhc2spOwo+PiArCj4+ICsJLyoKPj4g KwkgKiBJZiB0aGlzIHRhc2sgaXMgbm90IHRoZSBncm91cCBsZWFkZXIgYnV0IHNoYXJlcyB0aGUg c2FtZSBmaWxlcywgbGVhdmUgZmlsZSBlbXB0eS4KPj4gKwkgKiBUaGVzZSBkbWFidWZzIGFyZSBh bHJlYWR5IHJlcG9ydGVkIGluIHRoZSBncm91cCBsZWFkZXIncyBkbWFidWZfZmRzLgo+PiArCSAq Lwo+PiArCWdyb3VwX2xlYWRlcl9maWxlcyA9IHByaXYtPnRhc2stPmdyb3VwX2xlYWRlci0+Zmls ZXM7Cj4+ICsJaWYgKHByaXYtPnRhc2sgIT0gcHJpdi0+dGFzay0+Z3JvdXBfbGVhZGVyICYmIHBy aXYtPnRhc2stPmZpbGVzID09IGdyb3VwX2xlYWRlcl9maWxlcykgewo+PiArCQl0YXNrX3VubG9j ayhwcml2LT50YXNrKTsKPj4gKwkJcHV0X3Rhc2tfc3RydWN0KHByaXYtPnRhc2spOwo+PiArCQlw cml2LT50YXNrID0gTlVMTDsKPj4gKwkJcmV0dXJuIE5VTEw7Cj4+ICsJfQo+PiArCj4+ICsJcmV0 dXJuIG5leHRfZG1hYnVmKHByaXYsIHBvcyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkICpk bWFidWZfZmRzX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpw b3MpCj4+ICt7Cj4+ICsJKysqcG9zOwo+PiArCXJldHVybiBuZXh0X2RtYWJ1ZihzLT5wcml2YXRl LCBwb3MpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBkbWFidWZfZmRzX3NlcV9zdG9wKHN0 cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKPj4gK3sKPj4gKwlzdHJ1Y3QgZG1hYnVmX2Zkc19w cml2YXRlICpwcml2ID0gcy0+cHJpdmF0ZTsKPj4gKwo+PiArCWlmIChwcml2LT50YXNrKSB7Cj4+ ICsJCXRhc2tfdW5sb2NrKHByaXYtPnRhc2spOwo+PiArCQlwdXRfdGFza19zdHJ1Y3QocHJpdi0+ dGFzayk7Cj4+ICsKPj4gKwl9Cj4+ICsJaWYgKHByaXYtPmRtYWJ1Zl9maWxlKQo+PiArCQlmcHV0 KHByaXYtPmRtYWJ1Zl9maWxlKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBkbWFidWZfZmRz X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKPj4gK3sKPj4gKwlzdHJ1Y3Qg ZG1hYnVmX2Zkc19wcml2YXRlICpwcml2ID0gcy0+cHJpdmF0ZTsKPj4gKwlzdHJ1Y3QgZmlsZSAq ZmlsZSA9IHByaXYtPmRtYWJ1Zl9maWxlOwo+PiArCXN0cnVjdCBkbWFfYnVmICpkbWFidWYgPSBm aWxlLT5wcml2YXRlX2RhdGE7Cj4+ICsKPj4gKwlpZiAoIWRtYWJ1ZikKPj4gKwkJcmV0dXJuIC1F U1JDSDsKPj4gKwo+PiArCXNlcV9wcmludGYocywgIiU4bHUgIiwgZmlsZV9pbm9kZShmaWxlKS0+ aV9pbm8pOwo+PiArCj4+ICsJZnB1dChwcml2LT5kbWFidWZfZmlsZSk7Cj4+ICsJcHJpdi0+ZG1h YnVmX2ZpbGUgPSBOVUxMOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY190aWRfZG1hYnVmX2Zkc19zZXFfb3Bz ID0gewo+PiArCS5zdGFydCA9IGRtYWJ1Zl9mZHNfc2VxX3N0YXJ0LAo+PiArCS5uZXh0ICA9IGRt YWJ1Zl9mZHNfc2VxX25leHQsCj4+ICsJLnN0b3AgID0gZG1hYnVmX2Zkc19zZXFfc3RvcCwKPj4g Kwkuc2hvdyAgPSBkbWFidWZfZmRzX3NlcV9zaG93Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgaW50 IHByb2NfZG1hYnVmX2Zkc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpm aWxlLAo+PiArCQkgICAgIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3BzKQo+PiArewo+ PiArCXN0cnVjdCBkbWFidWZfZmRzX3ByaXZhdGUgKnByaXY7Cj4+ICsJc3RydWN0IHRhc2tfc3Ry dWN0ICp0YXNrOwo+PiArCWJvb2wgYWxsb3dlZCA9IGZhbHNlOwo+PiArCj4+ICsJdGFzayA9IGdl dF9wcm9jX3Rhc2soaW5vZGUpOwo+PiArCWlmICghdGFzaykKPj4gKwkJcmV0dXJuIC1FU1JDSDsK Pj4gKwo+PiArCWFsbG93ZWQgPSBwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9S RUFEX0ZTQ1JFRFMpOwo+PiArCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKPj4gKwo+PiArCWlmICgh YWxsb3dlZCkKPj4gKwkJcmV0dXJuIC1FQUNDRVM7Cj4+ICsKPj4gKwlwcml2ID0gX19zZXFfb3Bl bl9wcml2YXRlKGZpbGUsIG9wcywgc2l6ZW9mKCpwcml2KSk7Cj4+ICsJaWYgKCFwcml2KQo+PiAr CQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCXByaXYtPmlub2RlID0gaW5vZGU7Cj4+ICsJcHJp di0+dGFzayA9IE5VTEw7Cj4+ICsJcHJpdi0+ZG1hYnVmX2ZpbGUgPSBOVUxMOwo+PiArCj4+ICsJ cmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcHJvY19kbWFidWZfZmRzX3JlbGVh c2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCj4+ICt7Cj4+ICsJcmV0 dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpOwo+PiArfQo+PiArCj4+ICtzdGF0 aWMgaW50IHRpZF9kbWFidWZfZmRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZp bGUgKmZpbGUpCj4+ICt7Cj4+ICsJcmV0dXJuIHByb2NfZG1hYnVmX2Zkc19vcGVuKGlub2RlLCBm aWxlLAo+PiArCQkJJnByb2NfdGlkX2RtYWJ1Zl9mZHNfc2VxX29wcyk7Cj4+ICt9Cj4+ICsKPj4g K2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY190aWRfZG1hYnVmX2Zkc19vcGVyYXRp b25zID0gewo+PiArCS5vcGVuCQk9IHRpZF9kbWFidWZfZmRzX29wZW4sCj4+ICsJLnJlYWQJCT0g c2VxX3JlYWQsCj4+ICsJLmxsc2VlawkJPSBzZXFfbHNlZWssCj4+ICsJLnJlbGVhc2UJPSBwcm9j X2RtYWJ1Zl9mZHNfcmVsZWFzZSwKPj4gK307Cj4+ICsKPj4gZGlmZiAtLWdpdCBhL2ZzL3Byb2Mv aW50ZXJuYWwuaCBiL2ZzL3Byb2MvaW50ZXJuYWwuaAo+PiBpbmRleCBmNjBiMzc5ZGNkYzcuLjRj YTc0MjIwZGI5YyAxMDA2NDQKPj4gLS0tIGEvZnMvcHJvYy9pbnRlcm5hbC5oCj4+ICsrKyBiL2Zz L3Byb2MvaW50ZXJuYWwuaAo+PiBAQCAtMzAzLDYgKzMwMyw3IEBAIGV4dGVybiBjb25zdCBzdHJ1 Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcGlkX3NtYXBzX29wZXJhdGlvbnM7Cj4+ICAgZXh0ZXJu IGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19waWRfc21hcHNfcm9sbHVwX29wZXJh dGlvbnM7Cj4+ICAgZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jbGVh cl9yZWZzX29wZXJhdGlvbnM7Cj4+ICAgZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlv bnMgcHJvY19wYWdlbWFwX29wZXJhdGlvbnM7Cj4+ICtleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVf b3BlcmF0aW9ucyBwcm9jX3RpZF9kbWFidWZfZmRzX29wZXJhdGlvbnM7Cj4+ICAgCj4+ICAgZXh0 ZXJuIHVuc2lnbmVkIGxvbmcgdGFza192c2l6ZShzdHJ1Y3QgbW1fc3RydWN0ICopOwo+PiAgIGV4 dGVybiB1bnNpZ25lZCBsb25nIHRhc2tfc3RhdG0oc3RydWN0IG1tX3N0cnVjdCAqLAo+PiBkaWZm IC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWEtYnVmLmggYi9pbmNsdWRlL2xpbnV4L2RtYS1idWYu aAo+PiBpbmRleCBjZjcyNjk5Y2IyYmMuLjA4N2UxMWY3ZjE5MyAxMDA2NDQKPj4gLS0tIGEvaW5j bHVkZS9saW51eC9kbWEtYnVmLmgKPj4gKysrIGIvaW5jbHVkZS9saW51eC9kbWEtYnVmLmgKPj4g QEAgLTI3LDYgKzI3LDExIEBAIHN0cnVjdCBkZXZpY2U7Cj4+ICAgc3RydWN0IGRtYV9idWY7Cj4+ ICAgc3RydWN0IGRtYV9idWZfYXR0YWNobWVudDsKPj4gICAKPj4gKy8qKgo+PiArICogQ2hlY2sg aWYgc3RydWN0IGZpbGUqIGlzIGFzc29jaWF0ZWQgd2l0aCBkbWFfYnVmLgo+PiArICovCj4+ICtp bnQgaXNfZG1hX2J1Zl9maWxlKHN0cnVjdCBmaWxlICpmaWxlKTsKPj4gKwo+PiAgIC8qKgo+PiAg ICAqIHN0cnVjdCBkbWFfYnVmX29wcyAtIG9wZXJhdGlvbnMgcG9zc2libGUgb24gc3RydWN0IGRt YV9idWYKPj4gICAgKiBAdm1hcDogW29wdGlvbmFsXSBjcmVhdGVzIGEgdmlydHVhbCBtYXBwaW5n IGZvciB0aGUgYnVmZmVyIGludG8ga2VybmVsCj4+IC0tIAo+PiAyLjMwLjAuMjgwLmdhM2NlMjc5 MTJmLWdvb2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpo dHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=