From patchwork Tue Nov 20 18:58:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ho, Kenny" X-Patchwork-Id: 10691151 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7F9A25A4 for ; Tue, 20 Nov 2018 18:59:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E2352ACD3 for ; Tue, 20 Nov 2018 18:59:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 627162ACD5; Tue, 20 Nov 2018 18:59:15 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D33CC2ACD3 for ; Tue, 20 Nov 2018 18:59:14 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C68846E450; Tue, 20 Nov 2018 18:59:07 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM05-DM3-obe.outbound.protection.outlook.com (mail-eopbgr730089.outbound.protection.outlook.com [40.107.73.89]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1EB7F6E3D1; Tue, 20 Nov 2018 18:59:01 +0000 (UTC) Received: from CY4PR1201CA0022.namprd12.prod.outlook.com (2603:10b6:910:16::32) by SN1PR12MB0751.namprd12.prod.outlook.com (2a01:111:e400:c45b::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1339.26; Tue, 20 Nov 2018 18:58:58 +0000 Received: from BY2NAM03FT025.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e4a::209) by CY4PR1201CA0022.outlook.office365.com (2603:10b6:910:16::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1339.23 via Frontend Transport; Tue, 20 Nov 2018 18:58:58 +0000 Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Received: from SATLEXCHOV02.amd.com (165.204.84.17) by BY2NAM03FT025.mail.protection.outlook.com (10.152.84.232) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1339.10 via Frontend Transport; Tue, 20 Nov 2018 18:58:58 +0000 Received: from kho-5039A.amd.com (10.180.168.240) by SATLEXCHOV02.amd.com (10.181.40.72) with Microsoft SMTP Server id 14.3.389.1; Tue, 20 Nov 2018 12:58:56 -0600 From: Kenny Ho To: , , , , , Subject: [PATCH RFC 2/5] cgroup: Add mechanism to register vendor specific DRM devices Date: Tue, 20 Nov 2018 13:58:11 -0500 Message-ID: <20181120185814.13362-3-Kenny.Ho@amd.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181120185814.13362-1-Kenny.Ho@amd.com> References: <20181120185814.13362-1-Kenny.Ho@amd.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:165.204.84.17; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39860400002)(396003)(376002)(136003)(346002)(2980300002)(428003)(189003)(199004)(50466002)(478600001)(48376002)(426003)(186003)(575784001)(86362001)(217873002)(47776003)(26005)(2906002)(72206003)(77096007)(2201001)(51416003)(7696005)(50226002)(76176011)(2870700001)(8936002)(336012)(8676002)(81166006)(446003)(68736007)(81156014)(14444005)(126002)(476003)(2616005)(110136005)(11346002)(486006)(53416004)(104016004)(53936002)(1076002)(305945005)(105586002)(6666004)(36756003)(97736004)(356004)(5660300001)(316002)(106466001)(39060400002); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0751; H:SATLEXCHOV02.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; BY2NAM03FT025; 1:XQalNFINAH9EcP9YuscZkO3cmEB1FuFHE8S0Y67xhZf1BhidZiQAwG/0CbQrg9dndjD/uEzE8xykMl7cfSUbqdwPNV65QbHEkxmVAWAS601vvx7tgivZfagdk0A/87x4 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c9785fbf-f1bf-4551-272d-08d64f1a3a5b X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(2390098)(7020095)(4652040)(8989299)(5600074)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060); SRVR:SN1PR12MB0751; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0751; 3:Q6Nounuvh+sDYXcntK0KxxH9gnWINJNokxX+ekLGCpdYRKrCsYzvDmEJdMNuztbl7iqrd/i1iqYAXY6ybep5S8tROyIpFxikkucIUo39A7mGPu0mmRLNsB0jE9xRGwltp2OqJSkH5B4OfnoY2LTUzkXYPr8dkw82ruLeKCC7mXJkiEkrPZheNfY+aQ0dhWMJ9txOJIXdXsuruwP03fMwQQQWgBs+3OF9HDw+++fVAEwNrYnC+RQlWlvj2I0OqlKvIBBr8Y3N3xWnpiZxBamFFRTuw7qtOGj0IpvkmmSOfvegXjnD1XzJXF2SHLgyB43WeCLkzQwvxERgSNmqY/kN0CI3TNz4SfXggXL7nG18rSw=; 25:jUmEfpfkv1PFRE+kxr2kp4rjctC8yPI5h6dTTDJ7TS6dW2sFLXrDWC24wkzOanQ3dFoiCJTh/wdaru4xA2L4SiwXOBPj3jKncqOeH4juvz0k7WDYhjcmFl+pspD+Vw+QJoa47CPWtinGtgF5V2Gy8RG2U98lvY8fecRL5MaPHSRXJiGPSh5KJCEgg8FfkZ0OxYlUxEncjwglomEdZSDlrz2V23UkHLvDjhLhGwxeGhw/zZyaBH7TGf43y6r/BG2ix1r8xqA5yUjwuG0ccWyXpMX6o7SGanSeE35pK8pknxC6Jfwt/cd202AUwFHqyo4fAn9/+YG54eqK2KiOHDY1dmYuuWk3VCXWjX3TkPlh9Gk= X-MS-TrafficTypeDiagnostic: SN1PR12MB0751: X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0751; 31:uORcmyxpybwYKT+jcRJet/wTH5RJoPkIfKORLSDVzk0uZ5JRnbUMgfLyWN/BqCuX5JK4f326NO+vcymUIdUM4veQPLyeop9xhRaEW2SwpsYay3c6FwSV1+nGAx2q4LxCsjhRoToCZ/tNOqCySPQWFG73mFhjT3+vk1iFu2YVe+pEAGlHSekdsRuxzrCasAmgTNJ4U2pgFNTDzLK+0R0yXe5THrmLSTsshXCzcfs9Gwk=; 20:LdNi35vWFIXntm+t3JSyktpFlxRp/YaxH/dSpjoNtu9mh26vdY0Z90I5U2Ylm1fq1WTpkASGK+LSzw476HvTsiTsQXPvEhCAidu7XK6kDUdtkoz2wo6FIEge8vnejdam/S9hKs1eO1r50ooh9g0kteT9sbiulURCJl+8cyN4NsxpWwQ4RbeqFtLJNIroNpgnFno79cRECa3xrq1PUWnLEDksVpAN8HRaGsCmq66F1TeTsJ0P1vfhoFtxcKfazKInyjM4EEcTwVr3iyVpkYKvAxCfq6qyehBAJAhElQ4S4b25mKbho8Zj5Yuc6RZn8N0qGgwQneja2VIEV6Fej7/FriUTgnicTb8pFGRzG/d2wpXFbbLrDIu6OfJ0rbrytGQwD9hF+VD3KwyAkabl4PUrZtmvKg1Dfj2LAByDenAPJStX2HkArgkiXLx9x1ETzB4du5K8UlNS+MCzBeaH1q0bzK/1B4nYX6TA9kFVhGY9/mlzmdu7wXABYJi65SN0ATCN X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93003095)(3231442)(944501410)(52105112)(3002001)(10201501046)(6055026)(148016)(149066)(150057)(6041310)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123560045)(201708071742011)(7699051)(76991095); SRVR:SN1PR12MB0751; BCL:0; PCL:0; RULEID:; SRVR:SN1PR12MB0751; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0751; 4:p7b0SV3+ULOQhRTmne5ulM1de8pwxenZDtSqIH11j910HgWztUZuyrcBslYLGp9isAg/0tJIBSorbDlvERdMk46lVS8xp0a3J7WDol8wLoifLTKkCIeMbexoR77m9t6I5EjUxWcbNJB+R4QBsnKQNG3sDYdg0bU71pJo8bO/XcnxLJHkgvFc03H3MqihjQOc1BzIgtD1/362YA970oaRSx9UE38rJzGXJRi7gwQgBQ8QYofzyKI01zpV/FZUmNFz7/OhOZ6Qp8mRfP0rL85pdQ== X-Forefront-PRVS: 08626BE3A5 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR12MB0751; 23:FZyV1oJlM2nde7qeF/hFHgxML+hkwUs4suPC57bzt?= vLmck9eo10rfhLlS+Tdf4fGUUEmKRuUsWFZaATubSuIgmRCH3efn9VwXSGp4MwLxy0uJXNwllkYfXmcQBSR7E2OTkZ8BhlwPRltmk0nPHbNiCfcOzUUnd1EqzilWy2/xenI3l91lVtr8qtQ8tsKtgdutwGuDhCUgEll7xh+oANYkirZQkJGF6R3KCSqTcYqKSOK7Bj7CJg2bqGfwId/dobYwhdZ0BEEABBlYbGHWYtXxYn0IHjjfzpkZ3ilqMkErcIhH4rhqqiFJ9HyNKediBL1P8fztCuiXLaC5cYoeHYcvZxoAvkWiMkN64uRlZUL5l92Qe0ek1Xl7SBjbUVwSAe0Il3xtQr0za6sqsi4C8qqLcWADWe/v1njquK5QmfR58AdSEriXFu3/Tk8/Irza0oxYx74/8xjJFlr50vlIEj0IHKRTsZbeHsSN1laCKWFCjT3KcpOzqReC/taos7VSgZUL8mGBKhlbwXiVM7Mkxt2IPMn8WxX9QrlUjNPn231iqUaaAH00dptw0e9dLWezYnB1r0Z0hgqPoW8YlwNtLxlwTsMmJTzp9Qrf7ykACl9gGct7BPSuxgdsOHDgdev4CLvX86HaWmFMm0AYOI7tQalClXOhFgOEpMNE8IfmmLpAr9qbZZqSNTyWvQbn4LS3USRNS0clOJGUAQ/pdgfmb6IRpnUwyyoucQbC3uhQzuBIrbFP9yqs7p0NW0LAsd7Kro14UB4x872e93TNHcjA8euds2OaqfBfeu65Denyx6od/RRJf8U75yeMgsMtR+pIq0x4V5zqABR1DSKSYSQlY5jUvg5n72lZ2DxpZqAcNBSa21CCTt+nK+du/4vlZUJGzinV4mKTrPabmzHTqmKjR2fF3I+yPcLmaJCNV8b32CFB+GW/Qug4T1TwT0MVmZIhZD0K04YrlV6eGcS6Ji436F9d0+GKgrl4n2jMgLUF46S4W8NP+4mT/Fex+iTqKIrU95sK7nDGEGZqhDbS8gDoOxVzE61Io/3tWB0c0Ue/dMnkDSdWFjMsI0ly0euiwG7AFEsPKDY183gqFAZhcuI2x4iKN76Ub5Tsd7/jtVLN8h1q2IcIo83I5DEgXMqZZMyoU5Xz7DVC225LNfJoJ0lM9TZnP2HI+w4HkqgfOBf3QGJhwNS64TgP04jcCMyQaYLP0QIQ2RSzM/oFOU8anVoM+Kns7VUFPckbXP3rqVCwTmVq6g= X-Microsoft-Antispam-Message-Info: r8WoLvOiIDHmQHM1pis0BbFqoNHBP1KWW9mepmQCSukq86Fudqo0+3rDRd8XJO3kA/BiX9VelKPlVTAYwSLwlgmVzxAEXN4qBRWoQ51zJSbCBYnunbSMkfGvjRQCKX2HTOnnuAN0kNk1JLAdsOt3oHrIRYUVCPjtXQSFyapvHXA/a88FV+t6tsHLTzseWbsyLgfOi3peN9aUR4VkXf7J0LqxvbCdsGkOeSBdZGQdN1v/SxdPkqHy0w5H8tcC+HTYDqw4MvKaB+20+2P/lmgT0JNvoHxwUyggb20BrpDkcO+Fv7E2D5hpj+eswO2MGr53hij9Izx1fwlRDDuMbVtG+IAYhzO+FZkv1hc67zyRoII= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0751; 6:F+BtzcSWoF14s/BDLTNZaLXq0mTJC3uDT6SCUVU1SKrW0g4vfiakdAi4ClFE5E3ppZpuNxAIGbbHlL/vkGEDaUhTsJiHfJgozGhfjS+ChG1BDoai5pzeDDIEyAGPgY1kSjvnbkXnkLPOLDphI9jKHAdM3OdMTNOmuTKFBSvTz7C1GeSjekSZU101SprD3pn3Bnl3sbl2N7LkXdc7jmyt8GnKLFHWGro2JjF01QJymhYkZhkzo1BREBbqkyx4bPczfThKj8wWJcMrpYf5wLoc4bauq0kMpJUxB3WB/qj6osM4j0WXhuVc5ieionAIWK4ANf4QEYBm/yNktJTWMcGXWwmZXfKedhCQE7OmwrjO/hBh/N3dtxjitAacu4KKoTLHcU8psjbbD1MaY6BUu8a0ZsIKBqZtasntEsZ2oaqowte8SPKp1C+Pg7rYR5STWQ4Ar0qtCDw+5AHrSZraLIkKDg==; 5:Y617rodYDvvKUYDsKCWC7iJoRYyGnBhR/vzg069BvUhvgPO02DauS8HJfSTAe1zoMsQK4Zch1jDzd7aaVNCrQG1o99XDy954MJ9YEinc4HjQph6fr66wrPIU2BMpLc8UXMFQ1I3Y7ROKtECe5edhbgp0EPuemendX3R8DqXZYEk=; 7:BE72pHe+L478RN2YnhgBPGYR6UWd/zRqcji/44U8V7QaXBXOTQCQ5hUM/aSWRKKbxR0VHB/3SHVgclC79gAyqaMdUVH+5ZN0SeQqX2elQkLvR8XN3jlgF5HV5wq++lP4NzcdT5TU0M99C1RKJmlEKA== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0751; 20:OWAcjSvM4DnwuVv/0dTzzAYZI1+zv88S1iArtYx3uhnBopmMUbRRm/asAP6utaRIud9eRYRzts3f9l/VgdHi7MzdmSfIY9k2R5lkcnR2puigErRpLCgSCqcCBdLR1hMP3BW5ZcsqFhlf6CxOhE88cFxGe0oAEH9n7BRvwOV0cVNyN5vqFgTaFkJyfWWifwXZU0ARAENW3NIbqxR6LMICR8cuXSpVOgHyHukd33MxU4WQwqYdCP2oNHQeb/SguBEB X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Nov 2018 18:58:58.4425 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c9785fbf-f1bf-4551-272d-08d64f1a3a5b X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXCHOV02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0751 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Since many parts of the DRM subsystem has vendor-specific implementations, we introduce mechanisms for vendor to register their specific resources and control files to the DRM cgroup subsystem. A vendor will register itself with the DRM cgroup subsystem first before registering individual DRM devices to the cgroup subsystem. In addition to the cgroup_subsys_state that is common to all DRM devices, a device-specific state is introduced and it is allocated according to the vendor of the device. Change-Id: I908ee6975ea0585e4c30eafde4599f87094d8c65 Signed-off-by: Kenny Ho --- include/drm/drm_cgroup.h | 39 ++++++++++++++++ include/drm/drmcgrp_vendors.h | 7 +++ include/linux/cgroup_drm.h | 26 +++++++++++ kernel/cgroup/drm.c | 84 +++++++++++++++++++++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 include/drm/drm_cgroup.h create mode 100644 include/drm/drmcgrp_vendors.h diff --git a/include/drm/drm_cgroup.h b/include/drm/drm_cgroup.h new file mode 100644 index 000000000000..26cbea7059a6 --- /dev/null +++ b/include/drm/drm_cgroup.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: MIT + * Copyright 2018 Advanced Micro Devices, Inc. + */ +#ifndef __DRM_CGROUP_H__ +#define __DRM_CGROUP_H__ + +#define DRMCGRP_VENDOR(_x) _x ## _drmcgrp_vendor_id, +enum drmcgrp_vendor_id { +#include + DRMCGRP_VENDOR_COUNT, +}; +#undef DRMCGRP_VENDOR + +#define DRMCGRP_VENDOR(_x) extern struct drmcgrp_vendor _x ## _drmcgrp_vendor; +#include +#undef DRMCGRP_VENDOR + + + +#ifdef CONFIG_CGROUP_DRM + +extern struct drmcgrp_vendor *drmcgrp_vendors[]; + +int drmcgrp_register_vendor(struct drmcgrp_vendor *vendor, enum drmcgrp_vendor_id id); +int drmcgrp_register_device(struct drm_device *device, enum drmcgrp_vendor_id id); + +#else +static int drmcgrp_register_vendor(struct drmcgrp_vendor *vendor, enum drmcgrp_vendor_id id) +{ + return 0; +} + +static int drmcgrp_register_device(struct drm_device *device, enum drmcgrp_vendor_id id) +{ + return 0; +} + +#endif /* CONFIG_CGROUP_DRM */ +#endif /* __DRM_CGROUP_H__ */ diff --git a/include/drm/drmcgrp_vendors.h b/include/drm/drmcgrp_vendors.h new file mode 100644 index 000000000000..b04d8649851b --- /dev/null +++ b/include/drm/drmcgrp_vendors.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: MIT + * Copyright 2018 Advanced Micro Devices, Inc. + */ +#if IS_ENABLED(CONFIG_CGROUP_DRM) + + +#endif diff --git a/include/linux/cgroup_drm.h b/include/linux/cgroup_drm.h index 79ab38b0f46d..a776662d9593 100644 --- a/include/linux/cgroup_drm.h +++ b/include/linux/cgroup_drm.h @@ -6,10 +6,36 @@ #ifdef CONFIG_CGROUP_DRM +#include #include +#include +#include + +/* limit defined per the way drm_minor_alloc operates */ +#define MAX_DRM_DEV (64 * DRM_MINOR_RENDER) + +struct drmcgrp_device { + enum drmcgrp_vendor_id vid; + struct drm_device *dev; + struct mutex mutex; +}; + +/* vendor-common resource counting goes here */ +/* this struct should be included in the vendor specific resource */ +struct drmcgrp_device_resource { + struct drmcgrp_device *ddev; +}; + +struct drmcgrp_vendor { + struct cftype *(*get_cftypes)(void); + struct drmcgrp_device_resource *(*alloc_dev_resource)(void); + void (*free_dev_resource)(struct drmcgrp_device_resource *dev_resource); +}; + struct drmcgrp { struct cgroup_subsys_state css; + struct drmcgrp_device_resource *dev_resources[MAX_DRM_DEV]; }; static inline struct drmcgrp *css_drmcgrp(struct cgroup_subsys_state *css) diff --git a/kernel/cgroup/drm.c b/kernel/cgroup/drm.c index d9e194b9aead..f9630cc389bc 100644 --- a/kernel/cgroup/drm.c +++ b/kernel/cgroup/drm.c @@ -1,8 +1,30 @@ // SPDX-License-Identifier: MIT // Copyright 2018 Advanced Micro Devices, Inc. +#include #include #include +#include +#include +#include #include +#include +#include + +/* generate an array of drm cgroup vendor pointers */ +#define DRMCGRP_VENDOR(_x)[_x ## _drmcgrp_vendor_id] = NULL, +struct drmcgrp_vendor *drmcgrp_vendors[] = { +#include +}; +#undef DRMCGRP_VENDOR +EXPORT_SYMBOL(drmcgrp_vendors); + +static DEFINE_MUTEX(drmcgrp_mutex); + +/* indexed by drm_minor for access speed */ +static struct drmcgrp_device *known_drmcgrp_devs[MAX_DRM_DEV]; + +static int max_minor; + static u64 drmcgrp_test_read(struct cgroup_subsys_state *css, struct cftype *cft) @@ -13,6 +35,12 @@ static u64 drmcgrp_test_read(struct cgroup_subsys_state *css, static void drmcgrp_css_free(struct cgroup_subsys_state *css) { struct drmcgrp *drmcgrp = css_drmcgrp(css); + int i; + + for (i = 0; i <= max_minor; i++) { + if (drmcgrp->dev_resources[i] != NULL) + drmcgrp_vendors[known_drmcgrp_devs[i]->vid]->free_dev_resource(drmcgrp->dev_resources[i]); + } kfree(css_drmcgrp(css)); } @@ -21,11 +49,27 @@ static struct cgroup_subsys_state * drmcgrp_css_alloc(struct cgroup_subsys_state *parent_css) { struct drmcgrp *drmcgrp; + int i; drmcgrp = kzalloc(sizeof(struct drmcgrp), GFP_KERNEL); if (!drmcgrp) return ERR_PTR(-ENOMEM); + for (i = 0; i <= max_minor; i++) { + if (known_drmcgrp_devs[i] != NULL) { + struct drmcgrp_device_resource *ddr = + drmcgrp_vendors[known_drmcgrp_devs[i]->vid]->alloc_dev_resource(); + + if (IS_ERR(ddr)) { + drmcgrp_css_free(&drmcgrp->css); + return ERR_PTR(-ENOMEM); + } + + drmcgrp->dev_resources[i] = ddr; + drmcgrp->dev_resources[i]->ddev = known_drmcgrp_devs[i]; + } + } + return &drmcgrp->css; } @@ -44,3 +88,43 @@ struct cgroup_subsys drm_cgrp_subsys = { .legacy_cftypes = files, .dfl_cftypes = files, }; + +int drmcgrp_register_vendor(struct drmcgrp_vendor *vendor, enum drmcgrp_vendor_id id) +{ + int rc = 0; + struct cftype *cfts; + + // TODO: root css created before any registration + if (drmcgrp_vendors[id] == NULL) { + drmcgrp_vendors[id] = vendor; + cfts = vendor->get_cftypes(); + if (cfts != NULL) + rc = cgroup_add_legacy_cftypes(&drm_cgrp_subsys, cfts); + } + return rc; +} +EXPORT_SYMBOL(drmcgrp_register_vendor); + + +int drmcgrp_register_device(struct drm_device *dev, enum drmcgrp_vendor_id id) +{ + struct drmcgrp_device *ddev; + + ddev = kzalloc(sizeof(struct drmcgrp_device), GFP_KERNEL); + if (!ddev) + return -ENOMEM; + + mutex_lock(&drmcgrp_mutex); + + ddev->vid = id; + ddev->dev = dev; + mutex_init(&ddev->mutex); + + known_drmcgrp_devs[dev->primary->index] = ddev; + + max_minor = max(max_minor, dev->primary->index); + + mutex_unlock(&drmcgrp_mutex); + return 0; +} +EXPORT_SYMBOL(drmcgrp_register_device);