From nobody Wed Dec 13 19:00:13 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Sr4YV0H7sz54B2F; Wed, 13 Dec 2023 19:00:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Sr4YT6vlXz4QHQ; Wed, 13 Dec 2023 19:00:13 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1702494014; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=P3JJ11o8Dh0bikHG1ov5WE9G9KGUwjRpodkb4P2n11g=; b=MeAEqpa0zYk3sZua7QI/BBczXoyLcUAzUp2jikE64u9wEl9VT4wV6Qh3AUb2eJtnw5jD13 6L6spnqVgpeZikRm15ztCLEwOgFxAfKIWjoTNNBwo1KwHgsr2TIAFnGEaLUTNKYuhmtft9 tVdd0jvtB2gP9p2tdQQdU5E4GthGy7agbfLQB6uc5JcVNM8A/g+huB5LPyuDbB7U5PWvcG H1dAy6VHsHRcCqOmxy5cM/EWaocFF9pfXALqsdcyCFdxQUqYiICG0L3whAlpfivM8m4ZHx x6MixfdVQbbmfmv36+oY0Iwu+a4tZfmPjAGNKhzaM1EbA+MQDZOd9gRBmkPykw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1702494014; a=rsa-sha256; cv=none; b=xVcVeg5znYzbY4u06SmVyDkfkOH8VYKhWYtNosqxYnRVDIjLW+NdKFlyKvHTPm/+7P7Il0 gpfJhUwPWe/dv1Ybst8fNTV0JYK7u6w+wJW4RE7THght7NO+86YIabbSqNFQSJ9I/74L97 vCfkhu8heLunNI2ymLGwRw2fSLk3HB5mLP6574RzKoJz6fi7vWXGhNqQjX4RYrH3nm8W19 SI3KXnYSY4tp8k/VW3PTH71Z1v7B6Rw7BpM/txW7sJV43pjxQQcJuLDp6HWlQYpLF8rkOo qLVuRPuxB4HHI2dTgUGMKe9LpetGBTvB4H302aEyibONEuQXsdjNXfnCTCYKBw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1702494014; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=P3JJ11o8Dh0bikHG1ov5WE9G9KGUwjRpodkb4P2n11g=; b=DsjCL26XBhxWoGSaI3cpppz8L+J2u1vmDUIUOZF9yp7kQMGqe5KASPiGZApXmhB8LTQM6a GupDhT2PlOZkha4UtcwC4MaDt6q/e3DQWJ8i9xW2lypyjtsfwyYdTmEQqUtp3AReKVp1RT BGdY0jpa1EqDURm3kjR4V3gvR/osidrKnLhuX2+5Cb/64qb2e1/7h9hZoYkzlkcVBQfNN4 DV/XiigTs3nZemm6Zp0ctuVGkMn3/ZVJqDsXzT5C2C6lhR0NupUYlP8aJLSJtH2LUqn7X9 YHBAUl+Rm9BFNy/MPZhwwqAc02WtJw54ZAWONzGwxRMGJTBoX/pZTUk/XwAD4A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Sr4YT5zzfz18s7; Wed, 13 Dec 2023 19:00:13 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3BDJ0D76075991; Wed, 13 Dec 2023 19:00:13 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3BDJ0DYr075986; Wed, 13 Dec 2023 19:00:13 GMT (envelope-from git) Date: Wed, 13 Dec 2023 19:00:13 GMT Message-Id: <202312131900.3BDJ0DYr075986@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Jean-S=C3=A9bastien?= =?utf-8?Q?P=C3=A9dron?= Subject: git: fe84281803d6 - main - linuxkpi: Add `struct kset` support in List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dumbbell X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: fe84281803d62a6846ecab5f5a7c8b4e49b0f0e0 Auto-Submitted: auto-generated The branch main has been updated by dumbbell: URL: https://cgit.FreeBSD.org/src/commit/?id=fe84281803d62a6846ecab5f5a7c8b4e49b0f0e0 commit fe84281803d62a6846ecab5f5a7c8b4e49b0f0e0 Author: Jean-Sébastien Pédron AuthorDate: 2023-12-08 21:51:10 +0000 Commit: Jean-Sébastien Pédron CommitDate: 2023-12-13 18:57:52 +0000 linuxkpi: Add `struct kset` support in [Why] The amdgpu DRM driver started to use it in Linux 5.18. Reviewed by: manu Approved by: manu Differential Revision: https://reviews.freebsd.org/D43020 --- sys/compat/linuxkpi/common/include/linux/kobject.h | 49 +++++++ sys/compat/linuxkpi/common/src/linux_kobject.c | 141 ++++++++++++++++++++- 2 files changed, 186 insertions(+), 4 deletions(-) diff --git a/sys/compat/linuxkpi/common/include/linux/kobject.h b/sys/compat/linuxkpi/common/include/linux/kobject.h index 06d71faaa873..dadf3b3b0849 100644 --- a/sys/compat/linuxkpi/common/include/linux/kobject.h +++ b/sys/compat/linuxkpi/common/include/linux/kobject.h @@ -35,8 +35,10 @@ #include #include #include +#include struct kobject; +struct kset; struct sysctl_oid; #define KOBJ_CHANGE 0x01 @@ -57,6 +59,7 @@ struct kobject { const struct kobj_type *ktype; struct list_head entry; struct sysctl_oid *oidp; + struct kset *kset; }; extern struct kobject *mm_kobj; @@ -77,6 +80,17 @@ struct kobj_attribute { const char *buf, size_t count); }; +struct kset_uevent_ops { + /* TODO */ +}; + +struct kset { + struct list_head list; + spinlock_t list_lock; + struct kobject kobj; + const struct kset_uevent_ops *uevent_ops; +}; + static inline void kobject_init(struct kobject *kobj, const struct kobj_type *ktype) { @@ -154,6 +168,41 @@ kobject_uevent_env(struct kobject *kobj, int action, char *envp[]) */ } +void kset_init(struct kset *kset); +int kset_register(struct kset *kset); +void kset_unregister(struct kset *kset); +struct kset * kset_create_and_add(const char *name, + const struct kset_uevent_ops *u, struct kobject *parent_kobj); + +static inline struct kset * +to_kset(struct kobject *kobj) +{ + if (kobj != NULL) + return container_of(kobj, struct kset, kobj); + else + return NULL; +} + +static inline struct kset * +kset_get(struct kset *kset) +{ + if (kset != NULL) { + struct kobject *kobj; + + kobj = kobject_get(&kset->kobj); + return to_kset(kobj); + } else { + return NULL; + } +} + +static inline void +kset_put(struct kset *kset) +{ + if (kset != NULL) + kobject_put(&kset->kobj); +} + void linux_kobject_kfree_name(struct kobject *kobj); #endif /* _LINUXKPI_LINUX_KOBJECT_H_ */ diff --git a/sys/compat/linuxkpi/common/src/linux_kobject.c b/sys/compat/linuxkpi/common/src/linux_kobject.c index ddd0a58660f1..02f8b8d5b709 100644 --- a/sys/compat/linuxkpi/common/src/linux_kobject.c +++ b/sys/compat/linuxkpi/common/src/linux_kobject.c @@ -30,6 +30,10 @@ #include #include +static void kset_join(struct kobject *kobj); +static void kset_leave(struct kobject *kobj); +static void kset_kfree(struct kobject *kobj); + struct kobject * kobject_create(void) { @@ -101,12 +105,16 @@ kobject_set_name(struct kobject *kobj, const char *fmt, ...) } static int -kobject_add_complete(struct kobject *kobj, struct kobject *parent) +kobject_add_complete(struct kobject *kobj) { const struct kobj_type *t; int error; - kobj->parent = parent; + if (kobj->kset != NULL) { + kset_join(kobj); + kobj->parent = &kobj->kset->kobj; + } + error = sysfs_create_dir(kobj); if (error == 0 && kobj->ktype && kobj->ktype->default_attrs) { struct attribute **attr; @@ -120,6 +128,10 @@ kobject_add_complete(struct kobject *kobj, struct kobject *parent) if (error) sysfs_remove_dir(kobj); } + + if (error != 0) + kset_leave(kobj); + return (error); } @@ -129,13 +141,15 @@ kobject_add(struct kobject *kobj, struct kobject *parent, const char *fmt, ...) va_list args; int error; + kobj->parent = parent; + va_start(args, fmt); error = kobject_set_name_vargs(kobj, fmt, args); va_end(args); if (error) return (error); - return kobject_add_complete(kobj, parent); + return kobject_add_complete(kobj); } int @@ -155,7 +169,7 @@ kobject_init_and_add(struct kobject *kobj, const struct kobj_type *ktype, va_end(args); if (error) return (error); - return kobject_add_complete(kobj, parent); + return kobject_add_complete(kobj); } void @@ -166,6 +180,7 @@ linux_kobject_release(struct kref *kref) kobj = container_of(kref, struct kobject, kref); sysfs_remove_dir(kobj); + kset_leave(kobj); name = kobj->name; if (kobj->ktype && kobj->ktype->release) kobj->ktype->release(kobj); @@ -219,3 +234,121 @@ const struct sysfs_ops kobj_sysfs_ops = { .show = lkpi_kobj_attr_show, .store = lkpi_kobj_attr_store, }; + +const struct kobj_type linux_kset_kfree_type = { + .release = kset_kfree +}; + +static struct kset * +kset_create(const char *name, + const struct kset_uevent_ops *uevent_ops, + struct kobject *parent_kobj) +{ + struct kset *kset; + + kset = kzalloc(sizeof(*kset), GFP_KERNEL); + if (kset == NULL) + return (NULL); + + kset->uevent_ops = uevent_ops; + + kobject_set_name(&kset->kobj, "%s", name); + kset->kobj.parent = parent_kobj; + kset->kobj.kset = NULL; + + return (kset); +} + +void +kset_init(struct kset *kset) +{ + kobject_init(&kset->kobj, &linux_kset_kfree_type); + INIT_LIST_HEAD(&kset->list); + spin_lock_init(&kset->list_lock); +} + +static void +kset_join(struct kobject *kobj) +{ + struct kset *kset; + + kset = kobj->kset; + if (kset == NULL) + return; + + kset_get(kobj->kset); + + spin_lock(&kset->list_lock); + list_add_tail(&kobj->entry, &kset->list); + spin_unlock(&kset->list_lock); +} + +static void +kset_leave(struct kobject *kobj) +{ + struct kset *kset; + + kset = kobj->kset; + if (kset == NULL) + return; + + spin_lock(&kset->list_lock); + list_del_init(&kobj->entry); + spin_unlock(&kset->list_lock); + + kset_put(kobj->kset); +} + +struct kset * +kset_create_and_add(const char *name, const struct kset_uevent_ops *u, + struct kobject *parent_kobj) +{ + int ret; + struct kset *kset; + + kset = kset_create(name, u, parent_kobj); + if (kset == NULL) + return (NULL); + + ret = kset_register(kset); + if (ret != 0) { + linux_kobject_kfree_name(&kset->kobj); + kfree(kset); + return (NULL); + } + + return (kset); +} + +int +kset_register(struct kset *kset) +{ + int ret; + + if (kset == NULL) + return -EINVAL; + + kset_init(kset); + ret = kobject_add_complete(&kset->kobj); + + return ret; +} + +void +kset_unregister(struct kset *kset) +{ + if (kset == NULL) + return; + + kobject_del(&kset->kobj); + kobject_put(&kset->kobj); +} + +static void +kset_kfree(struct kobject *kobj) +{ + struct kset *kset; + + kset = to_kset(kobj); + kfree(kset); +}