Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp1651916rwl; Wed, 5 Apr 2023 22:07:23 -0700 (PDT) X-Google-Smtp-Source: AKy350ZIdqGA3LG9skO0O9ofVUuFVkdCWlThmbQdxFjhaYMJbCwktwtJ24vOYdRjh4NzSZ2tT8s4 X-Received: by 2002:a17:906:f296:b0:933:6ae6:374d with SMTP id gu22-20020a170906f29600b009336ae6374dmr4401998ejb.73.1680757643041; Wed, 05 Apr 2023 22:07:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680757643; cv=none; d=google.com; s=arc-20160816; b=PC3eNuYqaz1LWHsNJ0gfEmMe9+yl2OCxVzR0WAUy3hHWRtrmmR9Q7ufWyOva73V6jd Nk+nu0xt1S0gkoojQrdaTQLAsZNPqqjfO61STq88kodMD5YYvwCxxiIzGCek0jhQv6Fk iyg94jYVuV4te378U0uYIHoG+d4uEjZ6DLy3Dq7ua6m2BqxSkLD49CAXH4Ix/veAgzF9 y1/42/SeG84VP5pq/6t7OZrPGSUvm+WLf3sj9EAwvpaPSas3YOoFA+BwOYhyil71KHwz f8sq5rygBgDZlm0pIQZS1fZ7AP7rKJ6kprhgJuNfHgyA66GDIs4Unmkdc0CoOjHiRgAh Dtbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from:cc :references:to:content-language:subject:user-agent:mime-version:date :message-id:dkim-signature; bh=Z9NWRDMM2n/kxguV//cLAHyu90e8p2Pc/b51mWqqC5g=; b=SzFZBLQiS8ulLUR3bEnngUwaw/AVnj5HxokeUikdCuo5R/rN9ZqEDvXtrTVdcBYxhh UcFsw7KsblQCTbGFOET3ni0xJAisyWfj5KSJezTsiOe2TR7JUCxI0upHgXHznSE9mIY8 DDZw0MFViRiq4dFfpaxryVWSpCMtCadK+2O0wuY70DHVfI5PKR4vlWJ6lXe4+aMFZOqA 7jqTsDbZo1MwRJfPLIKzefrXIw/6pKfZrLNDLs+e4L7wJtima7wcAnx7WBA0+HFAkLyz Sk4rhb14oc4li/B/RrIUMrbJe2LRnVwvUlp9dvJmGllvfgeLpLviHMidFkMISMTUCKfa YVhg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@asahilina.net header.s=default header.b=kLYzPn+m; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=asahilina.net Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id og4-20020a1709071dc400b00948fd62ad43si394669ejc.1027.2023.04.05.22.06.58; Wed, 05 Apr 2023 22:07:23 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@asahilina.net header.s=default header.b=kLYzPn+m; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=asahilina.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234889AbjDFFDJ (ORCPT + 99 others); Thu, 6 Apr 2023 01:03:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53010 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231696AbjDFFDH (ORCPT ); Thu, 6 Apr 2023 01:03:07 -0400 Received: from mail.marcansoft.com (marcansoft.com [212.63.210.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E61AE6E9F; Wed, 5 Apr 2023 22:03:05 -0700 (PDT) Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) (Authenticated sender: lina@asahilina.net) by mail.marcansoft.com (Postfix) with ESMTPSA id 7962F42459; Thu, 6 Apr 2023 05:02:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=asahilina.net; s=default; t=1680757384; bh=9LSGzmx6M9H0xI3wvYbHSNfzzJs4iZ0NJj4FDdwyAIE=; h=Date:Subject:To:References:Cc:From:In-Reply-To; b=kLYzPn+mAQDFNM45Jb7a4fO3xxRPCcwGN935IYwDXFXm6WLjQB+j0Tn3xA5fpOeWq uPwlA/5xFoVUyvPPL5kCib8VXaQEQlkCfLDeRJ7nCNdJzCeibJoxLwTkHy94mPIWmQ JaDW+A26avYbKFJ/YxrNj7maTs9THieWUbFp9acxCxaOXdfyrPjgGkAUyVppUmCXE3 hYf4xj1Bq3z9QEGxDWtyL/BHpFnfeGSAR5KUrlmk2VF/JF3CHuyyM4BuX1/fA4cYQb Y+psf0sDIkuFFCF040KYI2vkrObwPDaTWqkCXh6s61gnilCrB3bj5EiQKixZB92Hj5 pGyeBIKe1Z0wA== Message-ID: <6200f93d-6d95-5d03-cc1c-22d7924d66eb@asahilina.net> Date: Thu, 6 Apr 2023 14:02:55 +0900 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.0 Subject: Re: [PATCH RFC 18/18] drm/asahi: Add the Asahi driver for Apple AGX GPUs Content-Language: en-US To: David Airlie References: <20230307-rust-drm-v1-0-917ff5bc80a8@asahilina.net> <20230307-rust-drm-v1-18-917ff5bc80a8@asahilina.net> Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , =?UTF-8?Q?Bj=c3=b6rn_Roy_Baron?= , Sumit Semwal , =?UTF-8?Q?Christian_K=c3=b6nig?= , Luben Tuikov , Jarkko Sakkinen , Dave Hansen , Alyssa Rosenzweig , Karol Herbst , Ella Stanforth , Faith Ekstrand , Mary , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org, linux-sgx@vger.kernel.org, asahi@lists.linux.dev From: Asahi Lina In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-1.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/04/2023 23.44, Daniel Vetter wrote: > On Tue, Mar 07, 2023 at 11:25:43PM +0900, Asahi Lina wrote: >> +/// Look up a GEM object handle for a `File` and return an `ObjectRef` for it. >> +pub(crate) fn lookup_handle(file: &DrmFile, handle: u32) -> Result { >> + Ok(ObjectRef::new(shmem::Object::lookup_handle(file, handle)?)) >> +} > > So maybe my expectations for rust typing is a bit too much, but I kinda > expected this to be fully generic: > > - trait Driver (drm_driver) knows the driver's object type > - a generic create_handle function could ensure that for drm_file (which > is always for a specific drm_device and hence Driver) can ensure at the > type level that you only put the right objects into the drm_file > - a generic lookup_handle function on the drm_file knows the Driver trait > and so can give you back the right type right away. > > Why the wrapping, what do I miss? Sigh, so this is one of the many ways I'm trying to work around the "Rust doesn't do subclasses" problem (so we can figure out what the best one is ^^). The generic shmem::Object::lookup_handle() call *is* fully generic and will get you back a driver-specific object. But since Rust doesn't do subclassing, what you get back isn't a driver-specific type T, but rather a (reference to a) shmem::Object. T represents the inner driver-specific data/functionality (only), and the outer shmem::Object includes the actual drm_gem_shmem_object plus a T. This is backwards from C, where you expect the opposite situation where T contains a shmem object, but that just doesn't work with Rust because there's no way to build a safe API around that model as far as I know. Now the problem is from the higher layers I want object operations that interact with the shmem::Object (that is, they call generic GEM functions on the object). Options so far: 1. Add an outer wrapper and put that functionality there. 2. Just have the functions on T as helpers, so you need to call T::foo(obj) instead of obj.foo(). 3. Use the undocumented method receiver trait thing to make shmem::Object a valid `self` type, plus add auto-Deref to shmem::Object. Then obj.foo() works. #1 is what I use here. #2 is how the driver-specific File ioctl callbacks are implemented, and also sched::Job. #3 is used for fence callbacks (FenceObject). None of them are great, and I'd love to hear what people think of the various options... There are other unexplored options, like in this GEM case it could be covered with a driver-internal auxiliary trait impl'd on shmem::Object buuut that doesn't work when you actually need callbacks on T itself to circle back to shmem::Object, as is the case with File/Job/FenceObject. ~~ Lina