* [PATCH v5 1/5] drm/ras: Introduce the DRM RAS infrastructure over generic netlink
[not found] <20260202064356.286243-7-riana.tauro@intel.com>
@ 2026-02-02 6:43 ` Riana Tauro
2026-02-02 10:08 ` kernel test robot
2026-02-02 22:52 ` kernel test robot
0 siblings, 2 replies; 3+ messages in thread
From: Riana Tauro @ 2026-02-02 6:43 UTC (permalink / raw)
To: intel-xe, dri-devel
Cc: aravind.iddamsetty, anshuman.gupta, rodrigo.vivi, joonas.lahtinen,
simona.vetter, airlied, pratik.bari, joshua.santosh.ranjan,
ashwin.kumar.kulkarni, shubham.kumar, ravi.kishore.koppuravuri,
raag.jadav, Zack McKevitt, Lijo Lazar, Hawking Zhang,
Jakub Kicinski, David S. Miller, Paolo Abeni, Eric Dumazet,
netdev, Riana Tauro
From: Rodrigo Vivi <rodrigo.vivi@intel.com>
Introduces the DRM RAS infrastructure over generic netlink.
The new interface allows drivers to expose RAS nodes and their
associated error counters to userspace in a structured and extensible
way. Each drm_ras node can register its own set of error counters, which
are then discoverable and queryable through netlink operations. This
lays the groundwork for reporting and managing hardware error states
in a unified manner across different DRM drivers.
Currently is only supports error-counter nodes. But it can be
extended later.
The registration is also no tied to any drm node, so it can be
used by accel devices as well.
It uses the new and mandatory YAML description format stored in
Documentation/netlink/specs/. This forces a single generic netlink
family namespace for the entire drm: "drm-ras".
But multiple-endpoints are supported within the single family.
Any modification to this API needs to be applied to
Documentation/netlink/specs/drm_ras.yaml before regenerating the
code:
$ tools/net/ynl/pyynl/ynl_gen_c.py --spec \
Documentation/netlink/specs/drm_ras.yaml --mode uapi --header \
> include/uapi/drm/drm_ras.h
$ tools/net/ynl/pyynl/ynl_gen_c.py --spec \
Documentation/netlink/specs/drm_ras.yaml --mode kernel --header \
> include/drm/drm_ras_nl.h
$ tools/net/ynl/pyynl/ynl_gen_c.py --spec \
Documentation/netlink/specs/drm_ras.yaml --mode kernel --source \
> drivers/gpu/drm/drm_ras_nl.c
Cc: Zack McKevitt <zachary.mckevitt@oss.qualcomm.com>
Cc: Lijo Lazar <lijo.lazar@amd.com>
Cc: Hawking Zhang <Hawking.Zhang@amd.com>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: David S. Miller <davem@davemloft.net>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: netdev@vger.kernel.org
Co-developed-by: Aravind Iddamsetty <aravind.iddamsetty@linux.intel.com>
Signed-off-by: Aravind Iddamsetty <aravind.iddamsetty@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Riana Tauro <riana.tauro@intel.com>
Reviewed-by: Zack McKevitt <zachary.mckevitt@oss.qualcomm.com>
---
Documentation/gpu/drm-ras.rst | 109 +++++++
Documentation/gpu/index.rst | 1 +
Documentation/netlink/specs/drm_ras.yaml | 130 +++++++++
drivers/gpu/drm/Kconfig | 9 +
drivers/gpu/drm/Makefile | 1 +
drivers/gpu/drm/drm_drv.c | 6 +
drivers/gpu/drm/drm_ras.c | 351 +++++++++++++++++++++++
drivers/gpu/drm/drm_ras_genl_family.c | 42 +++
drivers/gpu/drm/drm_ras_nl.c | 54 ++++
include/drm/drm_ras.h | 76 +++++
include/drm/drm_ras_genl_family.h | 17 ++
include/drm/drm_ras_nl.h | 24 ++
include/uapi/drm/drm_ras.h | 49 ++++
13 files changed, 869 insertions(+)
create mode 100644 Documentation/gpu/drm-ras.rst
create mode 100644 Documentation/netlink/specs/drm_ras.yaml
create mode 100644 drivers/gpu/drm/drm_ras.c
create mode 100644 drivers/gpu/drm/drm_ras_genl_family.c
create mode 100644 drivers/gpu/drm/drm_ras_nl.c
create mode 100644 include/drm/drm_ras.h
create mode 100644 include/drm/drm_ras_genl_family.h
create mode 100644 include/drm/drm_ras_nl.h
create mode 100644 include/uapi/drm/drm_ras.h
diff --git a/Documentation/gpu/drm-ras.rst b/Documentation/gpu/drm-ras.rst
new file mode 100644
index 000000000000..cec60cf5d17d
--- /dev/null
+++ b/Documentation/gpu/drm-ras.rst
@@ -0,0 +1,109 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+============================
+DRM RAS over Generic Netlink
+============================
+
+The DRM RAS (Reliability, Availability, Serviceability) interface provides a
+standardized way for GPU/accelerator drivers to expose error counters and
+other reliability nodes to user space via Generic Netlink. This allows
+diagnostic tools, monitoring daemons, or test infrastructure to query hardware
+health in a uniform way across different DRM drivers.
+
+Key Goals:
+
+* Provide a standardized RAS solution for GPU and accelerator drivers, enabling
+ data center monitoring and reliability operations.
+* Implement a single drm-ras Generic Netlink family to meet modern Netlink YAML
+ specifications and centralize all RAS-related communication in one namespace.
+* Support a basic error counter interface, addressing the immediate, essential
+ monitoring needs.
+* Offer a flexible, future-proof interface that can be extended to support
+ additional types of RAS data in the future.
+* Allow multiple nodes per driver, enabling drivers to register separate
+ nodes for different IP blocks, sub-blocks, or other logical subdivisions
+ as applicable.
+
+Nodes
+=====
+
+Nodes are logical abstractions representing an error source or block within
+the device. Currently, only error counter nodes is supported.
+
+Drivers are responsible for registering and unregistering nodes via the
+`drm_ras_node_register()` and `drm_ras_node_unregister()` APIs.
+
+Node Management
+-------------------
+
+.. kernel-doc:: drivers/gpu/drm/drm_ras.c
+ :doc: DRM RAS Node Management
+.. kernel-doc:: drivers/gpu/drm/drm_ras.c
+ :internal:
+
+Generic Netlink Usage
+=====================
+
+The interface is implemented as a Generic Netlink family named ``drm-ras``.
+User space tools can:
+
+* List registered nodes with the ``get-nodes`` command.
+* List all error counters in an node with the ``get-error-counters`` command.
+* Query error counters using the ``query-error-counter`` command.
+
+YAML-based Interface
+--------------------
+
+The interface is described in a YAML specification:
+
+:ref:`Documentation/netlink/specs/drm_ras.yaml`
+
+This YAML is used to auto-generate user space bindings via
+``tools/net/ynl/pyynl/ynl_gen_c.py``, and drives the structure of netlink
+attributes and operations.
+
+Usage Notes
+-----------
+
+* User space must first enumerate nodes to obtain their IDs.
+* Node IDs or Node names can be used for all further queries, such as error counters.
+* Error counters can be queried by either the Error ID or Error name.
+* Query Parameters should be defined as part of the uAPI to ensure user interface stability.
+* The interface supports future extension by adding new node types and
+ additional attributes.
+
+Example: List nodes using ynl
+
+.. code-block:: bash
+
+ sudo ynl --family drm_ras --dump list-nodes
+ [{'device-name': '0000:03:00.0',
+ 'node-id': 0,
+ 'node-name': 'correctable-errors',
+ 'node-type': 'error-counter'},
+ {'device-name': '0000:03:00.0',
+ 'node-id': 1,
+ 'node-name': 'nonfatal-errors',
+ 'node-type': 'error-counter'},
+ {'device-name': '0000:03:00.0',
+ 'node-id': 2,
+ 'node-name': 'fatal-errors',
+ 'node-type': 'error-counter'}]
+
+Example: List all error counters using ynl
+
+.. code-block:: bash
+
+
+ sudo ynl --family drm_ras --dump get-error-counters --json '{"node-id":1}'
+ [{'error-id': 1, 'error-name': 'error_name_1', 'error-value': 0},
+ {'error-id': 2, 'error-name': 'error_name_2', 'error-value': 0}]
+
+
+Example: Query an error counter for a given node
+
+.. code-block:: bash
+
+ sudo ynl --family drm_ras --do query-error-counter --json '{"node-id":2, "error-id":1}'
+ {'error-id': 1, 'error-name': 'error_name_1', 'error-value': 0}
+
diff --git a/Documentation/gpu/index.rst b/Documentation/gpu/index.rst
index 7dcb15850afd..60c73fdcfeed 100644
--- a/Documentation/gpu/index.rst
+++ b/Documentation/gpu/index.rst
@@ -9,6 +9,7 @@ GPU Driver Developer's Guide
drm-mm
drm-kms
drm-kms-helpers
+ drm-ras
drm-uapi
drm-usage-stats
driver-uapi
diff --git a/Documentation/netlink/specs/drm_ras.yaml b/Documentation/netlink/specs/drm_ras.yaml
new file mode 100644
index 000000000000..be0e379c5bc9
--- /dev/null
+++ b/Documentation/netlink/specs/drm_ras.yaml
@@ -0,0 +1,130 @@
+# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+---
+name: drm-ras
+protocol: genetlink
+uapi-header: drm/drm_ras.h
+
+doc: >-
+ DRM RAS (Reliability, Availability, Serviceability) over Generic Netlink.
+ Provides a standardized mechanism for DRM drivers to register "nodes"
+ representing hardware/software components capable of reporting error counters.
+ Userspace tools can query the list of nodes or individual error counters
+ via the Generic Netlink interface.
+
+definitions:
+ -
+ type: enum
+ name: node-type
+ value-start: 1
+ entries: [error-counter]
+ doc: >-
+ Type of the node. Currently, only error-counter nodes are
+ supported, which expose reliability counters for a hardware/software
+ component.
+
+attribute-sets:
+ -
+ name: node-attrs
+ attributes:
+ -
+ name: node-id
+ type: u32
+ doc: >-
+ Unique identifier for the node.
+ Assigned dynamically by the DRM RAS core upon registration.
+ -
+ name: device-name
+ type: string
+ doc: >-
+ Device name chosen by the driver at registration.
+ Can be a PCI BDF, UUID, or module name if unique.
+ -
+ name: node-name
+ type: string
+ doc: >-
+ Node name chosen by the driver at registration.
+ Can be an IP block name, or any name that identifies the
+ RAS node inside the device.
+ -
+ name: node-type
+ type: u32
+ doc: Type of this node, identifying its function.
+ enum: node-type
+ -
+ name: error-counter-attrs
+ attributes:
+ -
+ name: node-id
+ type: u32
+ doc: Node ID targeted by this error counter operation.
+ -
+ name: error-id
+ type: u32
+ doc: Unique identifier for a specific error counter within an node.
+ -
+ name: error-name
+ type: string
+ doc: Name of the error.
+ -
+ name: error-value
+ type: u32
+ doc: Current value of the requested error counter.
+
+operations:
+ list:
+ -
+ name: list-nodes
+ doc: >-
+ Retrieve the full list of currently registered DRM RAS nodes.
+ Each node includes its dynamically assigned ID, name, and type.
+ **Important:** User space must call this operation first to obtain
+ the node IDs. These IDs are required for all subsequent
+ operations on nodes, such as querying error counters.
+ attribute-set: node-attrs
+ flags: [admin-perm]
+ dump:
+ reply:
+ attributes:
+ - node-id
+ - device-name
+ - node-name
+ - node-type
+ -
+ name: get-error-counters
+ doc: >-
+ Retrieve the full list of error counters for a given node.
+ The response include the id, the name, and even the current
+ value of each counter.
+ attribute-set: error-counter-attrs
+ flags: [admin-perm]
+ dump:
+ request:
+ attributes:
+ - node-id
+ reply:
+ attributes:
+ - error-id
+ - error-name
+ - error-value
+ -
+ name: query-error-counter
+ doc: >-
+ Query the information of a specific error counter for a given node.
+ Users must provide the node ID and the error counter ID.
+ The response contains the id, the name, and the current value
+ of the counter.
+ attribute-set: error-counter-attrs
+ flags: [admin-perm]
+ do:
+ request:
+ attributes:
+ - node-id
+ - error-id
+ reply:
+ attributes:
+ - error-id
+ - error-name
+ - error-value
+
+kernel-family:
+ headers: ["drm/drm_ras_nl.h"]
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index d3d52310c9cc..d29ac485b6ac 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -130,6 +130,15 @@ config DRM_PANIC_SCREEN_QR_VERSION
Smaller QR code are easier to read, but will contain less debugging
data. Default is 40.
+config DRM_RAS
+ bool "DRM RAS support"
+ depends on DRM
+ help
+ Enables the DRM RAS (Reliability, Availability and Serviceability)
+ support for DRM drivers. This provides a Generic Netlink interface
+ for error reporting and queries.
+ If in doubt, say "N".
+
config DRM_DEBUG_DP_MST_TOPOLOGY_REFS
bool "Enable refcount backtrace history in the DP MST helpers"
depends on STACKTRACE_SUPPORT
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 0c21029c446f..d1ad4ce873a3 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -95,6 +95,7 @@ drm-$(CONFIG_DRM_ACCEL) += ../../accel/drm_accel.o
drm-$(CONFIG_DRM_PANIC) += drm_panic.o
drm-$(CONFIG_DRM_DRAW) += drm_draw.o
drm-$(CONFIG_DRM_PANIC_SCREEN_QR_CODE) += drm_panic_qr.o
+drm-$(CONFIG_DRM_RAS) += drm_ras.o drm_ras_nl.o drm_ras_genl_family.o
obj-$(CONFIG_DRM) += drm.o
obj-$(CONFIG_DRM_PANEL_ORIENTATION_QUIRKS) += drm_panel_orientation_quirks.o
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 2915118436ce..6b965c3d3307 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -53,6 +53,7 @@
#include <drm/drm_panic.h>
#include <drm/drm_print.h>
#include <drm/drm_privacy_screen_machine.h>
+#include <drm/drm_ras_genl_family.h>
#include "drm_crtc_internal.h"
#include "drm_internal.h"
@@ -1223,6 +1224,7 @@ static const struct file_operations drm_stub_fops = {
static void drm_core_exit(void)
{
+ drm_ras_genl_family_unregister();
drm_privacy_screen_lookup_exit();
drm_panic_exit();
accel_core_exit();
@@ -1261,6 +1263,10 @@ static int __init drm_core_init(void)
drm_privacy_screen_lookup_init();
+ ret = drm_ras_genl_family_register();
+ if (ret < 0)
+ goto error;
+
drm_core_init_complete = true;
DRM_DEBUG("Initialized\n");
diff --git a/drivers/gpu/drm/drm_ras.c b/drivers/gpu/drm/drm_ras.c
new file mode 100644
index 000000000000..7bc77ea24fe2
--- /dev/null
+++ b/drivers/gpu/drm/drm_ras.c
@@ -0,0 +1,351 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/xarray.h>
+#include <net/genetlink.h>
+
+#include <drm/drm_ras.h>
+
+/**
+ * DOC: DRM RAS Node Management
+ *
+ * This module provides the infrastructure to manage RAS (Reliability,
+ * Availability, and Serviceability) nodes for DRM drivers. Each
+ * DRM driver may register one or more RAS nodes, which represent
+ * logical components capable of reporting error counters and other
+ * reliability metrics.
+ *
+ * The nodes are stored in a global xarray `drm_ras_xa` to allow
+ * efficient lookup by ID. Nodes can be registered or unregistered
+ * dynamically at runtime.
+ *
+ * A Generic Netlink family `drm_ras` exposes three main operations to
+ * userspace:
+ *
+ * 1. LIST_NODES: Dump all currently registered RAS nodes.
+ * The user receives an array of node IDs, names, and types.
+ *
+ * 2. GET_ERROR_COUNTERS: Dump all error counters of a given node.
+ * The user receives an array of error IDs, names, and current value.
+ *
+ * 3. QUERY_ERROR_COUNTER: Query a specific error counter for a given node.
+ * Userspace must provide the node ID and the counter ID, and
+ * receives the ID, the error name, and its current value.
+ *
+ * Node registration:
+ * - drm_ras_node_register(): Registers a new node and assigns
+ * it a unique ID in the xarray.
+ * - drm_ras_node_unregister(): Removes a previously registered
+ * node from the xarray.
+ *
+ * Node type:
+ * - ERROR_COUNTER:
+ * + Currently, only error counters are supported.
+ * + The driver must implement the query_error_counter() callback to provide
+ * the name and the value of the error counter.
+ * + The driver must provide a error_counter_range.last value informing the
+ * last valid error ID.
+ * + The driver can provide a error_counter_range.first value informing the
+ * frst valid error ID.
+ * + The error counters in the driver doesn't need to be contiguous, but the
+ * driver must return -ENOENT to the query_error_counter as an indication
+ * that the ID should be skipped and not listed in the netlink API.
+ *
+ * Netlink handlers:
+ * - drm_ras_nl_list_nodes_dumpit(): Implements the LIST_NODES
+ * operation, iterating over the xarray.
+ * - drm_ras_nl_get_error_counters_dumpit(): Implements the GET_ERROR_COUNTERS
+ * operation, iterating over the know valid error_counter_range.
+ * - drm_ras_nl_query_error_counter_doit(): Implements the QUERY_ERROR_COUNTER
+ * operation, fetching a counter value from a specific node.
+ */
+
+static DEFINE_XARRAY_ALLOC(drm_ras_xa);
+
+/*
+ * The netlink callback context carries dump state across multiple dumpit calls
+ */
+struct drm_ras_ctx {
+ /* Which xarray id to restart the dump from */
+ unsigned long restart;
+};
+
+/**
+ * drm_ras_nl_list_nodes_dumpit() - Dump all registered RAS nodes
+ * @skb: Netlink message buffer
+ * @cb: Callback context for multi-part dumps
+ *
+ * Iterates over all registered RAS nodes in the global xarray and appends
+ * their attributes (ID, name, type) to the given netlink message buffer.
+ * Uses @cb->ctx to track progress in case the message buffer fills up, allowing
+ * multi-part dump support. On buffer overflow, updates the context to resume
+ * from the last node on the next invocation.
+ *
+ * Return: 0 if all nodes fit in @skb, number of bytes added to @skb if
+ * the buffer filled up (requires multi-part continuation), or
+ * a negative error code on failure.
+ */
+int drm_ras_nl_list_nodes_dumpit(struct sk_buff *skb,
+ struct netlink_callback *cb)
+{
+ const struct genl_info *info = genl_info_dump(cb);
+ struct drm_ras_ctx *ctx = (void *)cb->ctx;
+ struct drm_ras_node *node;
+ struct nlattr *hdr;
+ unsigned long id;
+ int ret;
+
+ xa_for_each_start(&drm_ras_xa, id, node, ctx->restart) {
+ hdr = genlmsg_iput(skb, info);
+ if (!hdr) {
+ ret = -EMSGSIZE;
+ break;
+ }
+
+ ret = nla_put_u32(skb, DRM_RAS_A_NODE_ATTRS_NODE_ID, node->id);
+ if (ret) {
+ genlmsg_cancel(skb, hdr);
+ break;
+ }
+
+ ret = nla_put_string(skb, DRM_RAS_A_NODE_ATTRS_DEVICE_NAME,
+ node->device_name);
+ if (ret) {
+ genlmsg_cancel(skb, hdr);
+ break;
+ }
+
+ ret = nla_put_string(skb, DRM_RAS_A_NODE_ATTRS_NODE_NAME,
+ node->node_name);
+ if (ret) {
+ genlmsg_cancel(skb, hdr);
+ break;
+ }
+
+ ret = nla_put_u32(skb, DRM_RAS_A_NODE_ATTRS_NODE_TYPE,
+ node->type);
+ if (ret) {
+ genlmsg_cancel(skb, hdr);
+ break;
+ }
+
+ genlmsg_end(skb, hdr);
+ }
+
+ if (ret == -EMSGSIZE)
+ ctx->restart = id;
+
+ return ret;
+}
+
+static int get_node_error_counter(u32 node_id, u32 error_id,
+ const char **name, u32 *value)
+{
+ struct drm_ras_node *node;
+
+ node = xa_load(&drm_ras_xa, node_id);
+ if (!node || !node->query_error_counter)
+ return -ENOENT;
+
+ if (error_id < node->error_counter_range.first ||
+ error_id > node->error_counter_range.last)
+ return -EINVAL;
+
+ return node->query_error_counter(node, error_id, name, value);
+}
+
+static int msg_reply_value(struct sk_buff *msg, u32 error_id,
+ const char *error_name, u32 value)
+{
+ int ret;
+
+ ret = nla_put_u32(msg, DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_ID, error_id);
+ if (ret)
+ return ret;
+
+ ret = nla_put_string(msg, DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_NAME,
+ error_name);
+ if (ret)
+ return ret;
+
+ return nla_put_u32(msg, DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_VALUE,
+ value);
+}
+
+static int doit_reply_value(struct genl_info *info, u32 node_id,
+ u32 error_id)
+{
+ struct sk_buff *msg;
+ struct nlattr *hdr;
+ const char *error_name;
+ u32 value;
+ int ret;
+
+ msg = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
+ if (!msg)
+ return -ENOMEM;
+
+ hdr = genlmsg_iput(msg, info);
+ if (!hdr) {
+ nlmsg_free(msg);
+ return -EMSGSIZE;
+ }
+
+ ret = get_node_error_counter(node_id, error_id,
+ &error_name, &value);
+ if (ret)
+ return ret;
+
+ ret = msg_reply_value(msg, error_id, error_name, value);
+ if (ret) {
+ genlmsg_cancel(msg, hdr);
+ nlmsg_free(msg);
+ return ret;
+ }
+
+ genlmsg_end(msg, hdr);
+
+ return genlmsg_reply(msg, info);
+}
+
+/**
+ * drm_ras_nl_get_error_counters_dumpit() - Dump all Error Counters
+ * @skb: Netlink message buffer
+ * @cb: Callback context for multi-part dumps
+ *
+ * Iterates over all error counters in a given Node and appends
+ * their attributes (ID, name, value) to the given netlink message buffer.
+ * Uses @cb->ctx to track progress in case the message buffer fills up, allowing
+ * multi-part dump support. On buffer overflow, updates the context to resume
+ * from the last node on the next invocation.
+ *
+ * Return: 0 if all errors fit in @skb, number of bytes added to @skb if
+ * the buffer filled up (requires multi-part continuation), or
+ * a negative error code on failure.
+ */
+int drm_ras_nl_get_error_counters_dumpit(struct sk_buff *skb,
+ struct netlink_callback *cb)
+{
+ const struct genl_info *info = genl_info_dump(cb);
+ struct drm_ras_ctx *ctx = (void *)cb->ctx;
+ struct drm_ras_node *node;
+ struct nlattr *hdr;
+ const char *error_name;
+ u32 node_id, error_id, value;
+ int ret;
+
+ if (!info->attrs || !info->attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID])
+ return -EINVAL;
+
+ node_id = nla_get_u32(info->attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID]);
+
+ node = xa_load(&drm_ras_xa, node_id);
+ if (!node)
+ return -ENOENT;
+
+ for (error_id = max(node->error_counter_range.first, ctx->restart);
+ error_id <= node->error_counter_range.last;
+ error_id++) {
+ ret = get_node_error_counter(node_id, error_id,
+ &error_name, &value);
+ /*
+ * For non-contiguous range, driver return -ENOENT as indication
+ * to skip this ID when listing all errors.
+ */
+ if (ret == -ENOENT)
+ continue;
+ if (ret)
+ return ret;
+
+ hdr = genlmsg_iput(skb, info);
+
+ if (!hdr) {
+ ret = -EMSGSIZE;
+ break;
+ }
+
+ ret = msg_reply_value(skb, error_id, error_name, value);
+ if (ret) {
+ genlmsg_cancel(skb, hdr);
+ break;
+ }
+
+ genlmsg_end(skb, hdr);
+ }
+
+ if (ret == -EMSGSIZE)
+ ctx->restart = error_id;
+
+ return ret;
+}
+
+/**
+ * drm_ras_nl_query_error_counter_doit() - Query an error counter of an node
+ * @skb: Netlink message buffer
+ * @info: Generic Netlink info containing attributes of the request
+ *
+ * Extracts the node ID and error ID from the netlink attributes and
+ * retrieves the current value of the corresponding error counter. Sends the
+ * result back to the requesting user via the standard Genl reply.
+ *
+ * Return: 0 on success, or negative errno on failure.
+ */
+int drm_ras_nl_query_error_counter_doit(struct sk_buff *skb,
+ struct genl_info *info)
+{
+ u32 node_id, error_id;
+
+ if (!info->attrs ||
+ !info->attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID] ||
+ !info->attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_ID])
+ return -EINVAL;
+
+ node_id = nla_get_u32(info->attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID]);
+ error_id = nla_get_u32(info->attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_ID]);
+
+ return doit_reply_value(info, node_id, error_id);
+}
+
+/**
+ * drm_ras_node_register() - Register a new RAS node
+ * @node: Node structure to register
+ *
+ * Adds the given RAS node to the global node xarray and assigns it
+ * a unique ID. Both @node->name and @node->type must be valid.
+ *
+ * Return: 0 on success, or negative errno on failure:
+ */
+int drm_ras_node_register(struct drm_ras_node *node)
+{
+ if (!node->device_name || !node->node_name)
+ return -EINVAL;
+
+ /* Currently, only Error Counter Endpoinnts are supported */
+ if (node->type != DRM_RAS_NODE_TYPE_ERROR_COUNTER)
+ return -EINVAL;
+
+ /* Mandatorty entries for Error Counter Node */
+ if (node->type == DRM_RAS_NODE_TYPE_ERROR_COUNTER &&
+ (!node->error_counter_range.last || !node->query_error_counter))
+ return -EINVAL;
+
+ return xa_alloc(&drm_ras_xa, &node->id, node, xa_limit_32b, GFP_KERNEL);
+}
+EXPORT_SYMBOL(drm_ras_node_register);
+
+/**
+ * drm_ras_node_unregister() - Unregister a previously registered node
+ * @node: Node structure to unregister
+ *
+ * Removes the given node from the global node xarray using its ID.
+ */
+void drm_ras_node_unregister(struct drm_ras_node *node)
+{
+ xa_erase(&drm_ras_xa, node->id);
+}
+EXPORT_SYMBOL(drm_ras_node_unregister);
diff --git a/drivers/gpu/drm/drm_ras_genl_family.c b/drivers/gpu/drm/drm_ras_genl_family.c
new file mode 100644
index 000000000000..2d818b8c3808
--- /dev/null
+++ b/drivers/gpu/drm/drm_ras_genl_family.c
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#include <drm/drm_ras_genl_family.h>
+#include <drm/drm_ras_nl.h>
+
+/* Track family registration so the drm_exit can be called at any time */
+static bool registered;
+
+/**
+ * drm_ras_genl_family_register() - Register drm-ras genl family
+ *
+ * Only to be called one at drm_drv_init()
+ */
+int drm_ras_genl_family_register(void)
+{
+ int ret;
+
+ registered = false;
+
+ ret = genl_register_family(&drm_ras_nl_family);
+ if (ret)
+ return ret;
+
+ registered = true;
+ return 0;
+}
+
+/**
+ * drm_ras_genl_family_unregister() - Unregister drm-ras genl family
+ *
+ * To be called one at drm_drv_exit() at any moment, but only once.
+ */
+void drm_ras_genl_family_unregister(void)
+{
+ if (registered) {
+ genl_unregister_family(&drm_ras_nl_family);
+ registered = false;
+ }
+}
diff --git a/drivers/gpu/drm/drm_ras_nl.c b/drivers/gpu/drm/drm_ras_nl.c
new file mode 100644
index 000000000000..fcd1392410e4
--- /dev/null
+++ b/drivers/gpu/drm/drm_ras_nl.c
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+/* Do not edit directly, auto-generated from: */
+/* Documentation/netlink/specs/drm_ras.yaml */
+/* YNL-GEN kernel source */
+
+#include <net/netlink.h>
+#include <net/genetlink.h>
+
+#include <uapi/drm/drm_ras.h>
+#include <drm/drm_ras_nl.h>
+
+/* DRM_RAS_CMD_GET_ERROR_COUNTERS - dump */
+static const struct nla_policy drm_ras_get_error_counters_nl_policy[DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID + 1] = {
+ [DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID] = { .type = NLA_U32, },
+};
+
+/* DRM_RAS_CMD_QUERY_ERROR_COUNTER - do */
+static const struct nla_policy drm_ras_query_error_counter_nl_policy[DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_ID + 1] = {
+ [DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID] = { .type = NLA_U32, },
+ [DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_ID] = { .type = NLA_U32, },
+};
+
+/* Ops table for drm_ras */
+static const struct genl_split_ops drm_ras_nl_ops[] = {
+ {
+ .cmd = DRM_RAS_CMD_LIST_NODES,
+ .dumpit = drm_ras_nl_list_nodes_dumpit,
+ .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DUMP,
+ },
+ {
+ .cmd = DRM_RAS_CMD_GET_ERROR_COUNTERS,
+ .dumpit = drm_ras_nl_get_error_counters_dumpit,
+ .policy = drm_ras_get_error_counters_nl_policy,
+ .maxattr = DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID,
+ .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DUMP,
+ },
+ {
+ .cmd = DRM_RAS_CMD_QUERY_ERROR_COUNTER,
+ .doit = drm_ras_nl_query_error_counter_doit,
+ .policy = drm_ras_query_error_counter_nl_policy,
+ .maxattr = DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_ID,
+ .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
+ },
+};
+
+struct genl_family drm_ras_nl_family __ro_after_init = {
+ .name = DRM_RAS_FAMILY_NAME,
+ .version = DRM_RAS_FAMILY_VERSION,
+ .netnsok = true,
+ .parallel_ops = true,
+ .module = THIS_MODULE,
+ .split_ops = drm_ras_nl_ops,
+ .n_split_ops = ARRAY_SIZE(drm_ras_nl_ops),
+};
diff --git a/include/drm/drm_ras.h b/include/drm/drm_ras.h
new file mode 100644
index 000000000000..bba47a282ef8
--- /dev/null
+++ b/include/drm/drm_ras.h
@@ -0,0 +1,76 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef __DRM_RAS_H__
+#define __DRM_RAS_H__
+
+#include "drm_ras_nl.h"
+
+/**
+ * struct drm_ras_node - A DRM RAS Node
+ */
+struct drm_ras_node {
+ /** @id: Unique identifier for the node. Dynamically assigned. */
+ u32 id;
+ /**
+ * @device_name: Human-readable name of the device. Given by the driver.
+ */
+ const char *device_name;
+ /** @node_name: Human-readable name of the node. Given by the driver. */
+ const char *node_name;
+ /** @type: Type of the node (enum drm_ras_node_type). */
+ enum drm_ras_node_type type;
+
+ /* Error-Counter Related Callback and Variables */
+
+ /** @error_counter_range: Range of valid Error IDs for this node. */
+ struct {
+ /** @first: First valid Error ID. */
+ u32 first;
+ /** @last: Last valid Error ID. Mandatory entry. */
+ u32 last;
+ } error_counter_range;
+
+ /**
+ * @query_error_counter:
+ *
+ * This callback is used by drm-ras to query a specific error counter.
+ * counters supported by this node. Used for input check and to
+ * iterate in all counters.
+ *
+ * Driver should expect query_error_counters() to be called with
+ * error_id from `error_counter_range.first` to
+ * `error_counter_range.last`.
+ *
+ * The @query_error_counter is a mandatory callback for
+ * error_counter_node.
+ *
+ * Returns: 0 on success,
+ * -ENOENT when error_id is not supported as an indication that
+ * drm_ras should silently skip this entry. Used for
+ * supporting non-contiguous error ranges.
+ * Driver is responsible for maintaining the list of
+ * supported error IDs in the range of first to last.
+ * Other negative values on errors that should terminate the
+ * netlink query.
+ */
+ int (*query_error_counter)(struct drm_ras_node *ep, u32 error_id,
+ const char **name, u32 *val);
+
+ /** @priv: Driver private data */
+ void *priv;
+};
+
+struct drm_device;
+
+#if IS_ENABLED(CONFIG_DRM_RAS)
+int drm_ras_node_register(struct drm_ras_node *ep);
+void drm_ras_node_unregister(struct drm_ras_node *ep);
+#else
+static inline int drm_ras_node_register(struct drm_ras_node *ep) { return 0; }
+static inline void drm_ras_node_unregister(struct drm_ras_node *ep) { }
+#endif
+
+#endif
diff --git a/include/drm/drm_ras_genl_family.h b/include/drm/drm_ras_genl_family.h
new file mode 100644
index 000000000000..5931b53429f1
--- /dev/null
+++ b/include/drm/drm_ras_genl_family.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef __DRM_RAS_GENL_FAMILY_H__
+#define __DRM_RAS_GENL_FAMILY_H__
+
+#if IS_ENABLED(CONFIG_DRM_RAS)
+int drm_ras_genl_family_register(void);
+void drm_ras_genl_family_unregister(void);
+#else
+static inline int drm_ras_genl_family_register(void) { return 0; }
+static inline void drm_ras_genl_family_unregister(void) { }
+#endif
+
+#endif
diff --git a/include/drm/drm_ras_nl.h b/include/drm/drm_ras_nl.h
new file mode 100644
index 000000000000..9613b7d9ffdb
--- /dev/null
+++ b/include/drm/drm_ras_nl.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+/* Do not edit directly, auto-generated from: */
+/* Documentation/netlink/specs/drm_ras.yaml */
+/* YNL-GEN kernel header */
+
+#ifndef _LINUX_DRM_RAS_GEN_H
+#define _LINUX_DRM_RAS_GEN_H
+
+#include <net/netlink.h>
+#include <net/genetlink.h>
+
+#include <uapi/drm/drm_ras.h>
+#include <drm/drm_ras_nl.h>
+
+int drm_ras_nl_list_nodes_dumpit(struct sk_buff *skb,
+ struct netlink_callback *cb);
+int drm_ras_nl_get_error_counters_dumpit(struct sk_buff *skb,
+ struct netlink_callback *cb);
+int drm_ras_nl_query_error_counter_doit(struct sk_buff *skb,
+ struct genl_info *info);
+
+extern struct genl_family drm_ras_nl_family;
+
+#endif /* _LINUX_DRM_RAS_GEN_H */
diff --git a/include/uapi/drm/drm_ras.h b/include/uapi/drm/drm_ras.h
new file mode 100644
index 000000000000..3415ba345ac8
--- /dev/null
+++ b/include/uapi/drm/drm_ras.h
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+/* Do not edit directly, auto-generated from: */
+/* Documentation/netlink/specs/drm_ras.yaml */
+/* YNL-GEN uapi header */
+
+#ifndef _UAPI_LINUX_DRM_RAS_H
+#define _UAPI_LINUX_DRM_RAS_H
+
+#define DRM_RAS_FAMILY_NAME "drm-ras"
+#define DRM_RAS_FAMILY_VERSION 1
+
+/*
+ * Type of the node. Currently, only error-counter nodes are supported, which
+ * expose reliability counters for a hardware/software component.
+ */
+enum drm_ras_node_type {
+ DRM_RAS_NODE_TYPE_ERROR_COUNTER = 1,
+};
+
+enum {
+ DRM_RAS_A_NODE_ATTRS_NODE_ID = 1,
+ DRM_RAS_A_NODE_ATTRS_DEVICE_NAME,
+ DRM_RAS_A_NODE_ATTRS_NODE_NAME,
+ DRM_RAS_A_NODE_ATTRS_NODE_TYPE,
+
+ __DRM_RAS_A_NODE_ATTRS_MAX,
+ DRM_RAS_A_NODE_ATTRS_MAX = (__DRM_RAS_A_NODE_ATTRS_MAX - 1)
+};
+
+enum {
+ DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID = 1,
+ DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_ID,
+ DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_NAME,
+ DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_VALUE,
+
+ __DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX,
+ DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX = (__DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX - 1)
+};
+
+enum {
+ DRM_RAS_CMD_LIST_NODES = 1,
+ DRM_RAS_CMD_GET_ERROR_COUNTERS,
+ DRM_RAS_CMD_QUERY_ERROR_COUNTER,
+
+ __DRM_RAS_CMD_MAX,
+ DRM_RAS_CMD_MAX = (__DRM_RAS_CMD_MAX - 1)
+};
+
+#endif /* _UAPI_LINUX_DRM_RAS_H */
--
2.47.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v5 1/5] drm/ras: Introduce the DRM RAS infrastructure over generic netlink
2026-02-02 6:43 ` [PATCH v5 1/5] drm/ras: Introduce the DRM RAS infrastructure over generic netlink Riana Tauro
@ 2026-02-02 10:08 ` kernel test robot
2026-02-02 22:52 ` kernel test robot
1 sibling, 0 replies; 3+ messages in thread
From: kernel test robot @ 2026-02-02 10:08 UTC (permalink / raw)
To: Riana Tauro, intel-xe, dri-devel
Cc: oe-kbuild-all, aravind.iddamsetty, anshuman.gupta, rodrigo.vivi,
joonas.lahtinen, simona.vetter, airlied, pratik.bari,
joshua.santosh.ranjan, ashwin.kumar.kulkarni, shubham.kumar,
ravi.kishore.koppuravuri, raag.jadav, Zack McKevitt, Lijo Lazar,
Hawking Zhang, Jakub Kicinski, Paolo Abeni, Eric Dumazet, netdev,
Riana Tauro
Hi Riana,
kernel test robot noticed the following build warnings:
[auto build test WARNING on drm-xe/drm-xe-next]
[also build test WARNING on drm-misc/drm-misc-next drm/drm-next linus/master v6.16-rc1 next-20260130]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Riana-Tauro/drm-ras-Introduce-the-DRM-RAS-infrastructure-over-generic-netlink/20260202-141553
base: https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-next
patch link: https://lore.kernel.org/r/20260202064356.286243-8-riana.tauro%40intel.com
patch subject: [PATCH v5 1/5] drm/ras: Introduce the DRM RAS infrastructure over generic netlink
reproduce: (https://download.01.org/0day-ci/archive/20260202/202602021142.G5vT8UkJ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602021142.G5vT8UkJ-lkp@intel.com/
All warnings (new ones prefixed by >>):
ERROR: Cannot find file ./include/linux/hdmi.h
ERROR: Cannot find file ./include/linux/hdmi.h
WARNING: No kernel-doc for file ./include/linux/hdmi.h
WARNING: ./drivers/gpu/drm/scheduler/sched_main.c:367 function parameter 'result' not described in 'drm_sched_job_done'
Documentation/gpu/drm-ras:39: ./drivers/gpu/drm/drm_ras.c:40: ERROR: Unexpected indentation. [docutils]
>> Documentation/gpu/drm-ras:39: ./drivers/gpu/drm/drm_ras.c:41: WARNING: Block quote ends without a blank line; unexpected unindent. [docutils]
Documentation/gpu/drm-ras:39: ./drivers/gpu/drm/drm_ras.c:46: ERROR: Unexpected indentation. [docutils]
Documentation/gpu/drm-ras:39: ./drivers/gpu/drm/drm_ras.c:59: ERROR: Unexpected indentation. [docutils]
Documentation/gpu/drm-ras:39: ./drivers/gpu/drm/drm_ras.c:60: WARNING: Block quote ends without a blank line; unexpected unindent. [docutils]
Documentation/gpu/drm-uapi:607: ./drivers/gpu/drm/drm_ioctl.c:923: WARNING: Duplicate C declaration, also defined at gpu/drm-uapi:69.
Declaration is '.. c:function:: bool drm_ioctl_flags (unsigned int nr, unsigned int *flags)'. [duplicate_declaration.c]
--
ERROR: Cannot find file ./include/linux/mutex.h
ERROR: Cannot find file ./include/linux/mutex.h
WARNING: No kernel-doc for file ./include/linux/mutex.h
ERROR: Cannot find file ./include/linux/fwctl.h
WARNING: No kernel-doc for file ./include/linux/fwctl.h
>> Documentation/gpu/drm-ras.rst:59: WARNING: undefined label: 'documentation/netlink/specs/drm_ras.yaml' [ref.ref]
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v5 1/5] drm/ras: Introduce the DRM RAS infrastructure over generic netlink
2026-02-02 6:43 ` [PATCH v5 1/5] drm/ras: Introduce the DRM RAS infrastructure over generic netlink Riana Tauro
2026-02-02 10:08 ` kernel test robot
@ 2026-02-02 22:52 ` kernel test robot
1 sibling, 0 replies; 3+ messages in thread
From: kernel test robot @ 2026-02-02 22:52 UTC (permalink / raw)
To: Riana Tauro, intel-xe, dri-devel
Cc: oe-kbuild-all, aravind.iddamsetty, anshuman.gupta, rodrigo.vivi,
joonas.lahtinen, simona.vetter, airlied, pratik.bari,
joshua.santosh.ranjan, ashwin.kumar.kulkarni, shubham.kumar,
ravi.kishore.koppuravuri, raag.jadav, Zack McKevitt, Lijo Lazar,
Hawking Zhang, Jakub Kicinski, Paolo Abeni, Eric Dumazet, netdev,
Riana Tauro
Hi Riana,
kernel test robot noticed the following build errors:
[auto build test ERROR on drm-xe/drm-xe-next]
[also build test ERROR on drm-misc/drm-misc-next drm/drm-next linus/master v6.19-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Riana-Tauro/drm-ras-Introduce-the-DRM-RAS-infrastructure-over-generic-netlink/20260202-141553
base: https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-next
patch link: https://lore.kernel.org/r/20260202064356.286243-8-riana.tauro%40intel.com
patch subject: [PATCH v5 1/5] drm/ras: Introduce the DRM RAS infrastructure over generic netlink
config: csky-randconfig-002-20260203 (https://download.01.org/0day-ci/archive/20260203/202602030622.mmakbYmv-lkp@intel.com/config)
compiler: csky-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260203/202602030622.mmakbYmv-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602030622.mmakbYmv-lkp@intel.com/
All errors (new ones prefixed by >>):
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nla_put_u32':
>> include/net/netlink.h:1459:(.text+0x12): undefined reference to `nla_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nla_put_string':
include/net/netlink.h:1657:(.text+0x28): undefined reference to `nla_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nla_put_u32':
include/net/netlink.h:1459:(.text+0x3a): undefined reference to `nla_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `drm_ras_node_unregister':
>> drivers/gpu/drm/drm_ras.c:350:(.text+0x10c): undefined reference to `nla_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `__genlmsg_iput':
>> include/net/genetlink.h:342:(.text+0x246): undefined reference to `genlmsg_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nla_put_u32':
include/net/netlink.h:1459:(.text+0x262): undefined reference to `nla_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nla_put_string':
include/net/netlink.h:1657:(.text+0x27e): undefined reference to `nla_put'
>> csky-linux-ld: include/net/netlink.h:1657:(.text+0x29a): undefined reference to `nla_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nla_put_u32':
include/net/netlink.h:1459:(.text+0x2b6): undefined reference to `nla_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nlmsg_trim':
>> include/net/netlink.h:1108:(.text+0x2e4): undefined reference to `skb_trim'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `drm_ras_nl_list_nodes_dumpit':
>> drivers/gpu/drm/drm_ras.c:144:(.text+0x330): undefined reference to `genlmsg_put'
>> csky-linux-ld: drivers/gpu/drm/drm_ras.c:144:(.text+0x334): undefined reference to `nla_put'
>> csky-linux-ld: drivers/gpu/drm/drm_ras.c:144:(.text+0x344): undefined reference to `skb_trim'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `__genlmsg_iput':
include/net/genetlink.h:342:(.text+0x408): undefined reference to `genlmsg_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nlmsg_trim':
include/net/netlink.h:1108:(.text+0x45a): undefined reference to `skb_trim'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `alloc_skb':
>> include/linux/skbuff.h:1383:(.text+0x4f8): undefined reference to `__alloc_skb'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `__genlmsg_iput':
include/net/genetlink.h:342:(.text+0x510): undefined reference to `genlmsg_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `kfree_skb_reason':
>> include/linux/skbuff.h:1322:(.text+0x51e): undefined reference to `sk_skb_reason_drop'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `doit_reply_value':
drivers/gpu/drm/drm_ras.c:196:(.text+0x534): undefined reference to `genlmsg_put'
csky-linux-ld: drivers/gpu/drm/drm_ras.c:196:(.text+0x544): undefined reference to `skb_trim'
>> csky-linux-ld: drivers/gpu/drm/drm_ras.c:196:(.text+0x548): undefined reference to `__alloc_skb'
>> csky-linux-ld: drivers/gpu/drm/drm_ras.c:196:(.text+0x54c): undefined reference to `sk_skb_reason_drop'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nlmsg_trim':
include/net/netlink.h:1108:(.text+0x5a4): undefined reference to `skb_trim'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `kfree_skb_reason':
include/linux/skbuff.h:1322:(.text+0x5b6): undefined reference to `sk_skb_reason_drop'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `nlmsg_unicast':
>> include/net/netlink.h:1198:(.text+0x5d6): undefined reference to `netlink_unicast'
csky-linux-ld: drivers/gpu/drm/drm_ras.o: in function `drm_ras_nl_query_error_counter_doit':
>> drivers/gpu/drm/drm_ras.c:312:(.text+0x614): undefined reference to `skb_trim'
csky-linux-ld: drivers/gpu/drm/drm_ras.c:312:(.text+0x618): undefined reference to `sk_skb_reason_drop'
>> csky-linux-ld: drivers/gpu/drm/drm_ras.c:312:(.text+0x61c): undefined reference to `init_net'
>> csky-linux-ld: drivers/gpu/drm/drm_ras.c:312:(.text+0x620): undefined reference to `netlink_unicast'
csky-linux-ld: drivers/gpu/drm/drm_ras_genl_family.o: in function `drm_ras_genl_family_register':
>> drivers/gpu/drm/drm_ras_genl_family.c:23:(.text+0xa): undefined reference to `genl_register_family'
csky-linux-ld: drivers/gpu/drm/drm_ras_genl_family.o: in function `drm_ras_genl_family_unregister':
>> drivers/gpu/drm/drm_ras_genl_family.c:39:(.text+0x4c): undefined reference to `genl_unregister_family'
>> csky-linux-ld: drivers/gpu/drm/drm_ras_genl_family.c:42:(.text+0x64): undefined reference to `genl_register_family'
>> csky-linux-ld: drivers/gpu/drm/drm_ras_genl_family.c:42:(.text+0x68): undefined reference to `genl_unregister_family'
vim +1459 include/net/netlink.h
24c410dce335db David S. Miller 2012-04-01 1448
bfa83a9e03cf8d Thomas Graf 2005-11-10 1449 /**
bfa83a9e03cf8d Thomas Graf 2005-11-10 1450 * nla_put_u32 - Add a u32 netlink attribute to a socket buffer
bfa83a9e03cf8d Thomas Graf 2005-11-10 1451 * @skb: socket buffer to add attribute to
bfa83a9e03cf8d Thomas Graf 2005-11-10 1452 * @attrtype: attribute type
bfa83a9e03cf8d Thomas Graf 2005-11-10 1453 * @value: numeric value
bfa83a9e03cf8d Thomas Graf 2005-11-10 1454 */
bfa83a9e03cf8d Thomas Graf 2005-11-10 1455 static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
bfa83a9e03cf8d Thomas Graf 2005-11-10 1456 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1457 u32 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1458
b4391db42308c9 Arnd Bergmann 2017-09-22 @1459 return nla_put(skb, attrtype, sizeof(u32), &tmp);
bfa83a9e03cf8d Thomas Graf 2005-11-10 1460 }
bfa83a9e03cf8d Thomas Graf 2005-11-10 1461
374d345d9b5e13 Jakub Kicinski 2023-10-18 1462 /**
374d345d9b5e13 Jakub Kicinski 2023-10-18 1463 * nla_put_uint - Add a variable-size unsigned int to a socket buffer
374d345d9b5e13 Jakub Kicinski 2023-10-18 1464 * @skb: socket buffer to add attribute to
374d345d9b5e13 Jakub Kicinski 2023-10-18 1465 * @attrtype: attribute type
374d345d9b5e13 Jakub Kicinski 2023-10-18 1466 * @value: numeric value
374d345d9b5e13 Jakub Kicinski 2023-10-18 1467 */
374d345d9b5e13 Jakub Kicinski 2023-10-18 1468 static inline int nla_put_uint(struct sk_buff *skb, int attrtype, u64 value)
374d345d9b5e13 Jakub Kicinski 2023-10-18 1469 {
374d345d9b5e13 Jakub Kicinski 2023-10-18 1470 u64 tmp64 = value;
374d345d9b5e13 Jakub Kicinski 2023-10-18 1471 u32 tmp32 = value;
374d345d9b5e13 Jakub Kicinski 2023-10-18 1472
374d345d9b5e13 Jakub Kicinski 2023-10-18 1473 if (tmp64 == tmp32)
374d345d9b5e13 Jakub Kicinski 2023-10-18 1474 return nla_put_u32(skb, attrtype, tmp32);
374d345d9b5e13 Jakub Kicinski 2023-10-18 1475 return nla_put(skb, attrtype, sizeof(u64), &tmp64);
374d345d9b5e13 Jakub Kicinski 2023-10-18 1476 }
374d345d9b5e13 Jakub Kicinski 2023-10-18 1477
bfa83a9e03cf8d Thomas Graf 2005-11-10 1478 /**
569a8fc38367df David S. Miller 2012-03-29 1479 * nla_put_be32 - Add a __be32 netlink attribute to a socket buffer
569a8fc38367df David S. Miller 2012-03-29 1480 * @skb: socket buffer to add attribute to
569a8fc38367df David S. Miller 2012-03-29 1481 * @attrtype: attribute type
569a8fc38367df David S. Miller 2012-03-29 1482 * @value: numeric value
569a8fc38367df David S. Miller 2012-03-29 1483 */
569a8fc38367df David S. Miller 2012-03-29 1484 static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
569a8fc38367df David S. Miller 2012-03-29 1485 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1486 __be32 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1487
b4391db42308c9 Arnd Bergmann 2017-09-22 1488 return nla_put(skb, attrtype, sizeof(__be32), &tmp);
569a8fc38367df David S. Miller 2012-03-29 1489 }
569a8fc38367df David S. Miller 2012-03-29 1490
6c1dd3b6a35178 David S. Miller 2012-04-01 1491 /**
6c1dd3b6a35178 David S. Miller 2012-04-01 1492 * nla_put_net32 - Add 32-bit network byte order netlink attribute to a socket buffer
6c1dd3b6a35178 David S. Miller 2012-04-01 1493 * @skb: socket buffer to add attribute to
6c1dd3b6a35178 David S. Miller 2012-04-01 1494 * @attrtype: attribute type
6c1dd3b6a35178 David S. Miller 2012-04-01 1495 * @value: numeric value
6c1dd3b6a35178 David S. Miller 2012-04-01 1496 */
6c1dd3b6a35178 David S. Miller 2012-04-01 1497 static inline int nla_put_net32(struct sk_buff *skb, int attrtype, __be32 value)
6c1dd3b6a35178 David S. Miller 2012-04-01 1498 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1499 __be32 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1500
b4391db42308c9 Arnd Bergmann 2017-09-22 1501 return nla_put_be32(skb, attrtype | NLA_F_NET_BYTEORDER, tmp);
6c1dd3b6a35178 David S. Miller 2012-04-01 1502 }
6c1dd3b6a35178 David S. Miller 2012-04-01 1503
24c410dce335db David S. Miller 2012-04-01 1504 /**
24c410dce335db David S. Miller 2012-04-01 1505 * nla_put_le32 - Add a __le32 netlink attribute to a socket buffer
24c410dce335db David S. Miller 2012-04-01 1506 * @skb: socket buffer to add attribute to
24c410dce335db David S. Miller 2012-04-01 1507 * @attrtype: attribute type
24c410dce335db David S. Miller 2012-04-01 1508 * @value: numeric value
24c410dce335db David S. Miller 2012-04-01 1509 */
24c410dce335db David S. Miller 2012-04-01 1510 static inline int nla_put_le32(struct sk_buff *skb, int attrtype, __le32 value)
24c410dce335db David S. Miller 2012-04-01 1511 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1512 __le32 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1513
b4391db42308c9 Arnd Bergmann 2017-09-22 1514 return nla_put(skb, attrtype, sizeof(__le32), &tmp);
24c410dce335db David S. Miller 2012-04-01 1515 }
24c410dce335db David S. Miller 2012-04-01 1516
73520786b0793c Nicolas Dichtel 2016-04-22 1517 /**
73520786b0793c Nicolas Dichtel 2016-04-22 1518 * nla_put_u64_64bit - Add a u64 netlink attribute to a skb and align it
73520786b0793c Nicolas Dichtel 2016-04-22 1519 * @skb: socket buffer to add attribute to
73520786b0793c Nicolas Dichtel 2016-04-22 1520 * @attrtype: attribute type
73520786b0793c Nicolas Dichtel 2016-04-22 1521 * @value: numeric value
73520786b0793c Nicolas Dichtel 2016-04-22 1522 * @padattr: attribute type for the padding
73520786b0793c Nicolas Dichtel 2016-04-22 1523 */
73520786b0793c Nicolas Dichtel 2016-04-22 1524 static inline int nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
73520786b0793c Nicolas Dichtel 2016-04-22 1525 u64 value, int padattr)
73520786b0793c Nicolas Dichtel 2016-04-22 1526 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1527 u64 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1528
b4391db42308c9 Arnd Bergmann 2017-09-22 1529 return nla_put_64bit(skb, attrtype, sizeof(u64), &tmp, padattr);
73520786b0793c Nicolas Dichtel 2016-04-22 1530 }
73520786b0793c Nicolas Dichtel 2016-04-22 1531
569a8fc38367df David S. Miller 2012-03-29 1532 /**
b46f6ded906ef0 Nicolas Dichtel 2016-04-22 1533 * nla_put_be64 - Add a __be64 netlink attribute to a socket buffer and align it
569a8fc38367df David S. Miller 2012-03-29 1534 * @skb: socket buffer to add attribute to
569a8fc38367df David S. Miller 2012-03-29 1535 * @attrtype: attribute type
569a8fc38367df David S. Miller 2012-03-29 1536 * @value: numeric value
b46f6ded906ef0 Nicolas Dichtel 2016-04-22 1537 * @padattr: attribute type for the padding
569a8fc38367df David S. Miller 2012-03-29 1538 */
b46f6ded906ef0 Nicolas Dichtel 2016-04-22 1539 static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value,
b46f6ded906ef0 Nicolas Dichtel 2016-04-22 1540 int padattr)
569a8fc38367df David S. Miller 2012-03-29 1541 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1542 __be64 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1543
b4391db42308c9 Arnd Bergmann 2017-09-22 1544 return nla_put_64bit(skb, attrtype, sizeof(__be64), &tmp, padattr);
569a8fc38367df David S. Miller 2012-03-29 1545 }
569a8fc38367df David S. Miller 2012-03-29 1546
6c1dd3b6a35178 David S. Miller 2012-04-01 1547 /**
e9bbe898cbe89b Nicolas Dichtel 2016-04-22 1548 * nla_put_net64 - Add 64-bit network byte order nlattr to a skb and align it
6c1dd3b6a35178 David S. Miller 2012-04-01 1549 * @skb: socket buffer to add attribute to
6c1dd3b6a35178 David S. Miller 2012-04-01 1550 * @attrtype: attribute type
6c1dd3b6a35178 David S. Miller 2012-04-01 1551 * @value: numeric value
e9bbe898cbe89b Nicolas Dichtel 2016-04-22 1552 * @padattr: attribute type for the padding
6c1dd3b6a35178 David S. Miller 2012-04-01 1553 */
e9bbe898cbe89b Nicolas Dichtel 2016-04-22 1554 static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value,
e9bbe898cbe89b Nicolas Dichtel 2016-04-22 1555 int padattr)
6c1dd3b6a35178 David S. Miller 2012-04-01 1556 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1557 __be64 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1558
b4391db42308c9 Arnd Bergmann 2017-09-22 1559 return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, tmp,
e9bbe898cbe89b Nicolas Dichtel 2016-04-22 1560 padattr);
6c1dd3b6a35178 David S. Miller 2012-04-01 1561 }
6c1dd3b6a35178 David S. Miller 2012-04-01 1562
24c410dce335db David S. Miller 2012-04-01 1563 /**
e7479122befd70 Nicolas Dichtel 2016-04-22 1564 * nla_put_le64 - Add a __le64 netlink attribute to a socket buffer and align it
24c410dce335db David S. Miller 2012-04-01 1565 * @skb: socket buffer to add attribute to
24c410dce335db David S. Miller 2012-04-01 1566 * @attrtype: attribute type
24c410dce335db David S. Miller 2012-04-01 1567 * @value: numeric value
e7479122befd70 Nicolas Dichtel 2016-04-22 1568 * @padattr: attribute type for the padding
24c410dce335db David S. Miller 2012-04-01 1569 */
e7479122befd70 Nicolas Dichtel 2016-04-22 1570 static inline int nla_put_le64(struct sk_buff *skb, int attrtype, __le64 value,
e7479122befd70 Nicolas Dichtel 2016-04-22 1571 int padattr)
24c410dce335db David S. Miller 2012-04-01 1572 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1573 __le64 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1574
b4391db42308c9 Arnd Bergmann 2017-09-22 1575 return nla_put_64bit(skb, attrtype, sizeof(__le64), &tmp, padattr);
24c410dce335db David S. Miller 2012-04-01 1576 }
24c410dce335db David S. Miller 2012-04-01 1577
4778e0be16c291 Jiri Pirko 2012-07-27 1578 /**
4778e0be16c291 Jiri Pirko 2012-07-27 1579 * nla_put_s8 - Add a s8 netlink attribute to a socket buffer
4778e0be16c291 Jiri Pirko 2012-07-27 1580 * @skb: socket buffer to add attribute to
4778e0be16c291 Jiri Pirko 2012-07-27 1581 * @attrtype: attribute type
4778e0be16c291 Jiri Pirko 2012-07-27 1582 * @value: numeric value
4778e0be16c291 Jiri Pirko 2012-07-27 1583 */
4778e0be16c291 Jiri Pirko 2012-07-27 1584 static inline int nla_put_s8(struct sk_buff *skb, int attrtype, s8 value)
4778e0be16c291 Jiri Pirko 2012-07-27 1585 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1586 s8 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1587
b4391db42308c9 Arnd Bergmann 2017-09-22 1588 return nla_put(skb, attrtype, sizeof(s8), &tmp);
4778e0be16c291 Jiri Pirko 2012-07-27 1589 }
4778e0be16c291 Jiri Pirko 2012-07-27 1590
4778e0be16c291 Jiri Pirko 2012-07-27 1591 /**
4778e0be16c291 Jiri Pirko 2012-07-27 1592 * nla_put_s16 - Add a s16 netlink attribute to a socket buffer
4778e0be16c291 Jiri Pirko 2012-07-27 1593 * @skb: socket buffer to add attribute to
4778e0be16c291 Jiri Pirko 2012-07-27 1594 * @attrtype: attribute type
4778e0be16c291 Jiri Pirko 2012-07-27 1595 * @value: numeric value
4778e0be16c291 Jiri Pirko 2012-07-27 1596 */
4778e0be16c291 Jiri Pirko 2012-07-27 1597 static inline int nla_put_s16(struct sk_buff *skb, int attrtype, s16 value)
4778e0be16c291 Jiri Pirko 2012-07-27 1598 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1599 s16 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1600
b4391db42308c9 Arnd Bergmann 2017-09-22 1601 return nla_put(skb, attrtype, sizeof(s16), &tmp);
4778e0be16c291 Jiri Pirko 2012-07-27 1602 }
4778e0be16c291 Jiri Pirko 2012-07-27 1603
4778e0be16c291 Jiri Pirko 2012-07-27 1604 /**
4778e0be16c291 Jiri Pirko 2012-07-27 1605 * nla_put_s32 - Add a s32 netlink attribute to a socket buffer
4778e0be16c291 Jiri Pirko 2012-07-27 1606 * @skb: socket buffer to add attribute to
4778e0be16c291 Jiri Pirko 2012-07-27 1607 * @attrtype: attribute type
4778e0be16c291 Jiri Pirko 2012-07-27 1608 * @value: numeric value
4778e0be16c291 Jiri Pirko 2012-07-27 1609 */
4778e0be16c291 Jiri Pirko 2012-07-27 1610 static inline int nla_put_s32(struct sk_buff *skb, int attrtype, s32 value)
4778e0be16c291 Jiri Pirko 2012-07-27 1611 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1612 s32 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1613
b4391db42308c9 Arnd Bergmann 2017-09-22 1614 return nla_put(skb, attrtype, sizeof(s32), &tmp);
4778e0be16c291 Jiri Pirko 2012-07-27 1615 }
4778e0be16c291 Jiri Pirko 2012-07-27 1616
4778e0be16c291 Jiri Pirko 2012-07-27 1617 /**
756a2f59b73cd6 Nicolas Dichtel 2016-04-22 1618 * nla_put_s64 - Add a s64 netlink attribute to a socket buffer and align it
4778e0be16c291 Jiri Pirko 2012-07-27 1619 * @skb: socket buffer to add attribute to
4778e0be16c291 Jiri Pirko 2012-07-27 1620 * @attrtype: attribute type
4778e0be16c291 Jiri Pirko 2012-07-27 1621 * @value: numeric value
756a2f59b73cd6 Nicolas Dichtel 2016-04-22 1622 * @padattr: attribute type for the padding
4778e0be16c291 Jiri Pirko 2012-07-27 1623 */
756a2f59b73cd6 Nicolas Dichtel 2016-04-22 1624 static inline int nla_put_s64(struct sk_buff *skb, int attrtype, s64 value,
756a2f59b73cd6 Nicolas Dichtel 2016-04-22 1625 int padattr)
4778e0be16c291 Jiri Pirko 2012-07-27 1626 {
b4391db42308c9 Arnd Bergmann 2017-09-22 1627 s64 tmp = value;
b4391db42308c9 Arnd Bergmann 2017-09-22 1628
b4391db42308c9 Arnd Bergmann 2017-09-22 1629 return nla_put_64bit(skb, attrtype, sizeof(s64), &tmp, padattr);
4778e0be16c291 Jiri Pirko 2012-07-27 1630 }
4778e0be16c291 Jiri Pirko 2012-07-27 1631
374d345d9b5e13 Jakub Kicinski 2023-10-18 1632 /**
374d345d9b5e13 Jakub Kicinski 2023-10-18 1633 * nla_put_sint - Add a variable-size signed int to a socket buffer
374d345d9b5e13 Jakub Kicinski 2023-10-18 1634 * @skb: socket buffer to add attribute to
374d345d9b5e13 Jakub Kicinski 2023-10-18 1635 * @attrtype: attribute type
374d345d9b5e13 Jakub Kicinski 2023-10-18 1636 * @value: numeric value
374d345d9b5e13 Jakub Kicinski 2023-10-18 1637 */
374d345d9b5e13 Jakub Kicinski 2023-10-18 1638 static inline int nla_put_sint(struct sk_buff *skb, int attrtype, s64 value)
374d345d9b5e13 Jakub Kicinski 2023-10-18 1639 {
374d345d9b5e13 Jakub Kicinski 2023-10-18 1640 s64 tmp64 = value;
374d345d9b5e13 Jakub Kicinski 2023-10-18 1641 s32 tmp32 = value;
374d345d9b5e13 Jakub Kicinski 2023-10-18 1642
374d345d9b5e13 Jakub Kicinski 2023-10-18 1643 if (tmp64 == tmp32)
374d345d9b5e13 Jakub Kicinski 2023-10-18 1644 return nla_put_s32(skb, attrtype, tmp32);
374d345d9b5e13 Jakub Kicinski 2023-10-18 1645 return nla_put(skb, attrtype, sizeof(s64), &tmp64);
374d345d9b5e13 Jakub Kicinski 2023-10-18 1646 }
374d345d9b5e13 Jakub Kicinski 2023-10-18 1647
bfa83a9e03cf8d Thomas Graf 2005-11-10 1648 /**
bfa83a9e03cf8d Thomas Graf 2005-11-10 1649 * nla_put_string - Add a string netlink attribute to a socket buffer
bfa83a9e03cf8d Thomas Graf 2005-11-10 1650 * @skb: socket buffer to add attribute to
bfa83a9e03cf8d Thomas Graf 2005-11-10 1651 * @attrtype: attribute type
bfa83a9e03cf8d Thomas Graf 2005-11-10 1652 * @str: NUL terminated string
bfa83a9e03cf8d Thomas Graf 2005-11-10 1653 */
bfa83a9e03cf8d Thomas Graf 2005-11-10 1654 static inline int nla_put_string(struct sk_buff *skb, int attrtype,
bfa83a9e03cf8d Thomas Graf 2005-11-10 1655 const char *str)
bfa83a9e03cf8d Thomas Graf 2005-11-10 1656 {
bfa83a9e03cf8d Thomas Graf 2005-11-10 @1657 return nla_put(skb, attrtype, strlen(str) + 1, str);
bfa83a9e03cf8d Thomas Graf 2005-11-10 1658 }
bfa83a9e03cf8d Thomas Graf 2005-11-10 1659
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-02-02 22:53 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260202064356.286243-7-riana.tauro@intel.com>
2026-02-02 6:43 ` [PATCH v5 1/5] drm/ras: Introduce the DRM RAS infrastructure over generic netlink Riana Tauro
2026-02-02 10:08 ` kernel test robot
2026-02-02 22:52 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox