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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB7F1C54E65 for ; Thu, 22 May 2025 14:44:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 633606B007B; Thu, 22 May 2025 10:44:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5E3CC6B0082; Thu, 22 May 2025 10:44:27 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4FAAF6B0083; Thu, 22 May 2025 10:44:27 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 32B6A6B007B for ; Thu, 22 May 2025 10:44:27 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id E4890BF426 for ; Thu, 22 May 2025 14:44:26 +0000 (UTC) X-FDA: 83470814532.13.E7128BD Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by imf03.hostedemail.com (Postfix) with ESMTP id 93D8620011 for ; Thu, 22 May 2025 14:44:23 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=samsung.com header.s=mail20170921 header.b=JWOb7pxY; spf=pass (imf03.hostedemail.com: domain of jaewon31.kim@samsung.com designates 203.254.224.25 as permitted sender) smtp.mailfrom=jaewon31.kim@samsung.com; dmarc=pass (policy=none) header.from=samsung.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747925064; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=SZBUKUtmCpgZu9Xmlb5+stRHpbwAtN4qBrCLFkmIn/4=; b=vBmjHTWq0/AqXFjrQ1XITlc4FC99k01KwEE3CJl5vg4bKqUOHqr5qOpHgeolxDVhp4NsY1 4/12Sm+Ny4EOIso4fMv3sz4hqXg+s7bHyonlGswWK7nNk9MmsBE/XRPxbhC5gI+rkrF+O1 7rj91V0kljmMa9OecLKVgCF6ErgMCP8= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=samsung.com header.s=mail20170921 header.b=JWOb7pxY; spf=pass (imf03.hostedemail.com: domain of jaewon31.kim@samsung.com designates 203.254.224.25 as permitted sender) smtp.mailfrom=jaewon31.kim@samsung.com; dmarc=pass (policy=none) header.from=samsung.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747925064; a=rsa-sha256; cv=none; b=U1R8zLqN4fwhArHsERF2cRvuhlElc5+/X7xq/pTYyaO2WRFk5dwZM4BJtXqieKx/LeHZrd 0DytvSW29wJ/QLyWMzr9Dl/oDY2gEis7KonScMOMgKpe6xnxGx1HVzmMEEDibxFkLTe7D6 hBC1Vj0n31Vxwjh+bNAPnA4PuFDaMUY= Received: from epcas1p3.samsung.com (unknown [182.195.41.47]) by mailout2.samsung.com (KnoxPortal) with ESMTP id 20250522144419epoutp02c332f99dcffa52632e85bd506d192ca4~B4JSjxRxJ0522105221epoutp028 for ; Thu, 22 May 2025 14:44:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.samsung.com 20250522144419epoutp02c332f99dcffa52632e85bd506d192ca4~B4JSjxRxJ0522105221epoutp028 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1747925059; bh=SZBUKUtmCpgZu9Xmlb5+stRHpbwAtN4qBrCLFkmIn/4=; h=Subject:Reply-To:From:To:CC:In-Reply-To:Date:References:From; b=JWOb7pxYVe15vaBbEtHEEfFouXBUKqt3E6LynZnDnzwxmiKfTZD2Ei9mAqLuR1VW3 x4w5vyc3eAv+HNjy9dyXyXt6vmUhxa9noJxy4apWCST84JK5EmhdIrp2wlJDHbh5P0 XAcKk6iR5/umYCmanjb4D6TFp5XxBAlauNheMjYs= Received: from epsnrtp03.localdomain (unknown [182.195.42.155]) by epcas1p3.samsung.com (KnoxPortal) with ESMTPS id 20250522144418epcas1p337b40600101b036d6ae74baa8c2d6c58~B4JSFde6P1340013400epcas1p3t; Thu, 22 May 2025 14:44:18 +0000 (GMT) Received: from epcas1p3.samsung.com (unknown [182.195.36.224]) by epsnrtp03.localdomain (Postfix) with ESMTP id 4b39zQ3jsxz3hhT7; Thu, 22 May 2025 14:44:18 +0000 (GMT) Mime-Version: 1.0 Subject: reply: [RFC] pin_user_pages_fast failure count increased Reply-To: jaewon31.kim@samsung.com From: =?UTF-8?B?6rmA7J6s7JuQ?= To: David Hildenbrand , "zhaoyang.huang@unisoc.com" , =?UTF-8?B?7Jyg7Zic7IiY?= , "jhubbard@nvidia.com" , "surenb@google.com" , "Steve.Kang@unisoc.com" , "huangzhaoyang@gmail.com" CC: Jaewon Kim , "linux-mm@kvack.org" X-Priority: 3 X-Content-Kind-Code: NORMAL In-Reply-To: X-Drm-Type: N,general X-Msg-Generator: Mail X-Msg-Type: PERSONAL X-Reply-Demand: N Message-ID: <20250522144418epcms1p2a31c1a5c95b1937077bddf1b30495e83@epcms1p2> Date: Thu, 22 May 2025 23:44:18 +0900 X-CMS-MailID: 20250522144418epcms1p2a31c1a5c95b1937077bddf1b30495e83 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" CMS-TYPE: 101P cpgsPolicy: CPGSC10-711,Y X-CFilter-Loop: Reflected X-CMS-RootMailID: 20250522130101epcas1p435244c12cfc9bb7895008b8ea98af064 References: <99ae448a-5c5e-4491-8cf7-1325f47e225e@redhat.com> <20250522130901epcms1p31d757b179fbb3563cad6bef4a1829235@epcms1p3> X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 93D8620011 X-Stat-Signature: gujraeme5byg5pt9sw5m5grio7jbhk5n X-Rspam-User: X-HE-Tag: 1747925063-80948 X-HE-Meta: U2FsdGVkX19CMQuWgnT3CXhnw8sqsTDBw0VfPotxCkT+h16Usf0JVz4XNAHLj2x0ZNCGuzXXrcbg5U88QdusATs7iuAelNogMh+bCXLdEmblzwNX+PrB/VzaYk/jEqBQTAFYHXFELcyaNU7tq29XU3+y/1tUmpl+s/uQgjV4/+bixJCebyVjmPp8o1M56oI8WV8KF8+MnPn5oSAtdsX4j+pWytep7PSjgYuJrxsCsB5qkf7VBEuStiZPFCfYX2QhrgSUXRfVM8gn8fkQK7hPns9a8j+MJN0F4QXRCU8csRhQBDtDx/N4zZbY95aGVWu45Vs016yZtayr3xguDWMhAblI551yQXnL7BuWrjWFV+bD8CwhUav9xBYgBp0BxCi/s+NF39tUX209Oy6Ft+YIzYC80SXBnmi7lbPasAqSNMMJt7V2QVFUERqdtzg4c30DsjYRV4+qcUNIkSg/aM3Jo6YRT+0k7vX58dpaGFzTZ8qxlEorZbbOkx3lkUuw0bkIKKA1SmEvgkbOeiEeJ5+z3ffBBWsKB65F/fehhHjD7p3cSwAT02OI2c367QnNtTb6gqbXdylF9TYw2Ma13c2cw62vYxBURiUSojMSVNq0u/xZhboqh238h0wshxaR8QsRXgUuzhzACT5BFrVNYDVuyIrDa3V50rPBvEdJ6JN6bbuCUdGNKtySJquTy6oJw/Mmixv/jtVHE8aQEbsHszKyPXU8VstojPGqNb+Nj4Lt5yqlMUF7EGePs6cTZ9wb5wxXvjJgbIKhTs++iSKqv5ZAEH+pW7tbI+/o6cx7Ux5LB2Hj8XFLe92NV/vf7ZG3jp3E8dodz0bwQeqWo4UgQWIGqoL378L9Zbj2v2K6u8M6946+TfALdK4CFV3LPPkwsIM4fgwhTrSdyNnUp8TqDv0zUe8dvUmrKRdM+CEGPcNza78P6PAOnTz4I78Fcsb6rYHyAuLSUTaXjn7v16cyWFi dJhktSNQ ml5QZqNSuV4onYyvMC/fuLhuF1nnLO7EddMPRwnnypKd/WdgXX1KmF15Fw9cgMy6MUAFqKRqkHaWJwiyenrAgQDNCC2tacCQTx5vyug+0ENRcKINvbuMvJaqW00oqxnea01kN18SMrsDIWJaFvHVjXkDwZwZkl1w0CghFlAjhvDwi+ArJK6RB3bWtHcuUC1H76mqdPvAEKOh9vftPOYjd617VrSUnTqboaqHrQsohC8SJcFuPkSClXM2NYvGC9mRA3hBKJhnaCfshvWlm2NAt9KptXmVcb/b8vTvOZeNWCtJXW0jMQwcvoKt1XaIOsRLiV/cYQc/XPPQOGtZwXjA/HTIJSmt6grCVW7EOswGesYJj2sZeP+hqZMeiWUVE/bdxT1/5DLZ+5/piJyWk3EumHf5bfKL/oG4SsQ5SzmYI1M7hB6L595fACc/D41VtUuDmPyTOUxUtuMW6D6Q= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: >On 22.05.25 15:09, Jaewon Kim wrote: >>> On 22.05.25 12:18, ?=E6=9C=9D?=20(Zhaoyang=20Huang)=20wrote:=0D=0A>>>>>= =20On=20Mon,=20Apr=2028,=202025=20at=2002:12:57PM=20-0700,=20John=20Hubbard= =20wrote:=0D=0A>>>>>>=20On=204/28/25=201:56=20PM,=20David=20Hildenbrand=20w= rote:=0D=0A>>>>>>>=20On=2028.04.25=2022:14,=20John=20Hubbard=20wrote:=0D=0A= >>>>>>>>=20On=204/28/25=208:17=20AM,=20Jaewon=20Kim=20wrote:=0D=0A>>>>>>>>>= =20Hi=0D=0A>>>>>>>>>=0D=0A>>>>>>>>>=20If=20pin_user_pages_fast=20does=20not= =20pin=20all=20the=20requested=20number=20of=0D=0A>>>>>>>>>=20pages,=20then= =20drivers=20calling=20to=20pin_user_pages_fast=20should=20retry=0D=0A>>>>>= >>>>=20until=20the=20gup=20pins=20all?=0D=0A>>>>>>>>>=0D=0A>>>>>>>>=0D=0A>>= >>>>>>=20Approaches=20vary,=20for=20handling=20partial=20success=20of=20pin= _user_pages().=0D=0A>>>>>>>>=0D=0A>>>>>>>>=20*=20Many=20drivers=20unpin=20e= verything=20and=20either=20bail=20out=20entirely,=20or=0D=0A>>>>>>>>=20retr= y=20pinning=20the=20entire=20original=20range.=0D=0A>>>>>>>=0D=0A>>>>>>>=20= Hm,=20unpinning=20+=20trying=20to=20repin=20the=20entire=20range=20can=20ea= sily=20result=0D=0A>>>>>>>=20in=20an=20endless=20loop=20on=20persistent=20e= rrors=20IIRC?=0D=0A>>>>>>>=0D=0A>>>>>>=0D=0A>>>>>>=20I=20vaguely=20recall= =20a=20limited=20number=20of=20retries,=20yes.=0D=0A>>>>>>=0D=0A>>>>>>=20th= anks,=0D=0A>>>>>>=20--=0D=0A>>>>>>=20John=20Hubbard=0D=0A>>>>>>=0D=0A>>>>>>= =0D=0A>>>>>=0D=0A>>>>>=20Hi,=0D=0A>>>>>=0D=0A>>>>>=20I'd=20like=20to=20repo= rt=20a=20potential=20issue=20introduced=20by=20a=20recent=20change=20in=0D= =0A>>>>>=201aaf8c122918=20mm:=20gup:=20fix=20infinite=20loop=20within=20__g= et_longterm_locked=0D=0A>>>>>=0D=0A>>>>>=20Previously,=20the=20call=20to=20= migrate_longterm_unpinnable_folio()=20was=20guarded=20by=20the=0D=0A>>>>>= =20collected=20variable.=20This=20meant=20that=20if=20a=20CMA=20page=20was= =20temporarily=20held=20in=20the=0D=0A>>>>>=20pagevec=20and=20failed=20LRU= =20isolation,=20it=20wouldn't=20be=20added=20to=20the=0D=0A>>>>>=20movable_= page_list,=20but=20the=20collected=20counter=20would=20still=20be=20increme= nted.=0D=0A>>>=0D=0A>>>=20Okay,=20so=20we'd=20also=20express=20that=20way= =20=22any=20longterm_pinnable=20page=20found=22.=0D=0A>>>=0D=0A>>>>=20There= =20is=20lru_add_drain_all=20for=20dealing=20with=20this=20scenario,=20so=20= this=20won't=20be=20the=20case,=20right?=0D=0A>>>=0D=0A>>>=20Good=20point.= =20Only=20concurrent=20isolation=20might=20be=20problematic=20(concurrent= =20reclaim?).=0D=0A>>>=0D=0A>>>>>=0D=0A>>>>>=20As=20a=20result,=20migrate_l= ongterm_unpinnable_folio()=20would=20return=20-EAGAIN,=20and=0D=0A>>>>>=20t= he=20process=20would=20be=20retried=20until=20migration=20of=20the=20CMA=20= page=20succeeded.=0D=0A>>>>>=0D=0A>>>>>=20However,=20in=20the=20recent=20pa= tch=20merged=20into=20mainline,=20the=20logic=20now=20only=20checks=0D=0A>>= >>>=20whether=20movable_page_list=20is=20empty,=20and=20no=20longer=20relie= s=20on=20the=20collected=0D=0A>>>>>=20count.=0D=0A>>>>>=20This=20can=20caus= e=20CMA=20pages=20that=20fail=20isolation=20to=20bypass=20retry=20logic=20a= nd=20remain=0D=0A>>>>>=20pinned.=0D=0A>>>>>=0D=0A>>>>>=20Effectively,long-t= erm=20pinning=20is=20now=20possible=20for=20CMA=20pages=20?=20something=20t= hat=0D=0A>>>>>=20previously=20would=20have=20been=20avoided=20through=20rep= eated=20attempts.=0D=0A>>>=0D=0A>>>=20Calling=20migrate_longterm_unpinnable= _folios()=20when=20there=20is=20nothing=20to=20migrate=20is=20stupid.=0D=0A= >>>=0D=0A>>>=20Maybe=20something=20like:=0D=0A>>>=0D=0A>>>=20diff=20--git= =20a/mm/gup.c=20b/mm/gup.c=0D=0A>>>=20index=20329c5f7acc7a0..58b8e40fc19ed= =20100644=0D=0A>>>=20---=20a/mm/gup.c=0D=0A>>>=20+++=20b/mm/gup.c=0D=0A>>>= =20=40=40=20-2301,14=20+2301,15=20=40=40=20static=20void=20pofs_unpin(struc= t=20pages_or_folios=20*pofs)=0D=0A>>>=20=20=20=7D=0D=0A>>>=0D=0A>>>=20=20= =20/*=0D=0A>>>=20-=20*=20Returns=20the=20number=20of=20collected=20folios.= =20Return=20value=20is=20always=20>=3D=200.=0D=0A>>>=20+=20*=20Returns=20wh= ether=20any=20longterm=20unpinnable=20folio=20was=20found=20(if=20isolation= =0D=0A>>>=20+=20*=20fails,=20not=20all=20can=20be=20added=20to=20the=20mova= ble_folio_list).=0D=0A>>>=20=20=20=20*/=0D=0A>>>=20-static=20void=20collect= _longterm_unpinnable_folios(=0D=0A>>>=20+static=20bool=20collect_longterm_u= npinnable_folios(=0D=0A>>>=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20struct=20list_head=20*movable_folio_list,=0D=0A>>>=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20struct=20pages_or_folios=20*pofs)=0D=0A= >>>=20=20=20=7B=0D=0A>>>=20+=20=20=20=20=20=20=20bool=20drain_allow=20=3D= =20true,=20any_unpinnable=20=3D=20false;=0D=0A>>>=20=20=20=20=20=20=20=20= =20=20struct=20folio=20*prev_folio=20=3D=20NULL;=0D=0A>>>=20-=20=20=20=20= =20=20=20bool=20drain_allow=20=3D=20true;=0D=0A>>>=20=20=20=20=20=20=20=20= =20=20unsigned=20long=20i;=0D=0A>>>=0D=0A>>>=20=20=20=20=20=20=20=20=20=20f= or=20(i=20=3D=200;=20i=20<=20pofs->nr_entries;=20i++)=20=7B=0D=0A>>>=20=40= =40=20-2320,6=20+2321,7=20=40=40=20static=20void=20collect_longterm_unpinna= ble_folios(=0D=0A>>>=0D=0A>>>=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20if=20(folio_is_longterm_pinnable(folio))=0D=0A>>>=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20continue;=0D= =0A>>>=20+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20any_unpinnable=20=3D= =20true;=0D=0A>>>=0D=0A>>>=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20if=20(folio_is_device_coherent(folio))=0D=0A>>>=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20continue;=0D=0A>>>= =20=40=40=20-2342,6=20+2344,8=20=40=40=20static=20void=20collect_longterm_u= npinnable_folios(=0D=0A>>>=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20NR_ISOLAT= ED_ANON=20+=20folio_is_file_lru(folio),=0D=0A>>>=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20folio_nr_pages(folio));=0D=0A>>>=20=20=20=20=20=20=20=20=20=20= =7D=0D=0A>>>=20+=0D=0A>>>=20+=20=20=20=20=20=20=20return=20any_unpinnable;= =0D=0A>>>=20=20=20=7D=0D=0A>>>=0D=0A>>>=20=20=20/*=0D=0A>>>=20=40=40=20-241= 7,11=20+2421,12=20=40=40=20migrate_longterm_unpinnable_folios(struct=20list= _head=20*movable_folio_list,=0D=0A>>>=20=20=20static=20long=0D=0A>>>=20=20= =20check_and_migrate_movable_pages_or_folios(struct=20pages_or_folios=20*po= fs)=0D=0A>>>=20=20=20=7B=0D=0A>>>=20+=20=20=20=20=20=20=20bool=20any_unpinn= able;=0D=0A>>>=20=20=20=20=20=20=20=20=20=20LIST_HEAD(movable_folio_list);= =0D=0A>>>=0D=0A>>>=20-=20=20=20=20=20=20=20collect_longterm_unpinnable_foli= os(&movable_folio_list,=20pofs);=0D=0A>>>=20+=20=20=20=20=20=20=20any_unpin= nable=20=3D=20collect_longterm_unpinnable_folios(&movable_folio_list,=20pof= s);=0D=0A>>>=20=20=20=20=20=20=20=20=20=20if=20(list_empty(&movable_folio_l= ist))=0D=0A>>>=20-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20return=200;= =0D=0A>>>=20+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20return=20any_unpi= nnable=20?=20-EAGAIN=20:=200;=0D=0A>>>=0D=0A>>>=20=20=20=20=20=20=20=20=20= =20return=20migrate_longterm_unpinnable_folios(&movable_folio_list,=20pofs)= ;=0D=0A>>>=20=20=20=7D=0D=0A>>>=0D=0A>>>=0D=0A>>>=20--=0D=0A>>>=20Cheers,= =0D=0A>>>=0D=0A>>>=20David=20/=20dhildenb=0D=0A>>=20=0D=0A>>=20Hi=0D=0A>>= =20=0D=0A>>=20Thank=20you=20for=20your=20comment=20and=20patch.=0D=0A>>=20B= y=20the=20way,=20what=20if=20there=20are=20any_unpinnable=20pages=20and=20a= lso=20pages=20in=20the=20movable_folio_list,=0D=0A>>=20but=20migrate_longte= rm_unpinnable_folios=20failed=20to=20migrate=20and=20return=20other=20erros= =20instead=20of=20-EAGAIN?=0D=0A>>=20In=20that=20case,=20I=20think=20the=20= CMA=20or=20other=20unpinnable=20pages=20would=20be=20pinned.=0D=0A>=0D=0A>O= h,=20I=20think=20what=20we=20have=20to=20do=20is=20call=20pofs_unpin(pofs)(= )=20in=20case=20we=20=0D=0A>return=20with=20-EAGAIN=20early.=20That's=20wha= t=20=0D=0A>migrate_longterm_unpinnable_folios()=20would=20do.=0D=0A=0D=0AI= =20did=20not=20understand.=20Do=20you=20mean=20we=20need=20to=20call=20pofs= _unpin=20in=20case=20of=20any_unpinnable?=0D=0AI=20think=20your=20following= =20code=20seems=20to=20be=20good=20to=20me.=0D=0A=20=20return=20any_unpinna= ble=20?=20-EAGAIN=20:=200;=0D=0A=0D=0A>=0D=0A>If=20we=20happen=20to=20call= =20migrate_longterm_unpinnable_folios(),=20it=20would=20=0D=0A>already=20un= pin=20all=20folios=20by=20calling=20pofs_unpin(pofs).=20So=20we=20can=20jus= t=20=0D=0A>return=20whatever=20error=20we=20actually=20saw.=0D=0A=0D=0AOh,= =20I=20didn't=20see=20that=20pofs_unpin=20within=20migrate_longterm_unpinna= ble_folios,=20I=20missed=20it.=0D=0AThen=20I=20think=20your=20previous=20ch= ange=20is=20good=20enough.=0D=0A=0D=0A>=0D=0A>Do=20you=20have=20the=20capac= ity=20to=20send=20a=20proper=20fix?=0D=0A=0D=0AIf=20you=20meant=20to=20allo= w=20us=20to=20use=20your=20code=20and=20make=20a=20patch,=20we=20will=20do.= =0D=0A=0D=0ABR=0D=0A=0D=0A>=0D=0A>--=20=0D=0A>Cheers,=0D=0A>=0D=0A>David=20= /=20dhildenb