Gunyah resource manager defines a simple API for virtual machine log
sharing with the console service. A VM's own log can be opened by using
GH_VMID_SELF. Another VM's log can be accessed via its VMID. Once
opened, characters can be written to the log with a write command.
Characters are received with resource manager notifications (using ID
GH_RM_NOTIF_VM_CONSOLE_CHARS).
These high level rpc calls are kept in
drivers/virt/gunyah/rsc_mgr_rpc.c. Future RPC calls, e.g. to launch a VM
will also be maintained in this file.
Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
---
drivers/virt/gunyah/Makefile | 2 +-
drivers/virt/gunyah/rsc_mgr.h | 22 +++++
drivers/virt/gunyah/rsc_mgr_rpc.c | 151 ++++++++++++++++++++++++++++++
include/linux/gunyah_rsc_mgr.h | 16 ++++
4 files changed, 190 insertions(+), 1 deletion(-)
create mode 100644 drivers/virt/gunyah/rsc_mgr_rpc.c
diff --git a/drivers/virt/gunyah/Makefile b/drivers/virt/gunyah/Makefile
index 7c512490f921..73339ed445b3 100644
--- a/drivers/virt/gunyah/Makefile
+++ b/drivers/virt/gunyah/Makefile
@@ -1,5 +1,5 @@
gunyah-y += sysfs.o
obj-$(CONFIG_GUNYAH) += gunyah.o
-gunyah_rsc_mgr-y += rsc_mgr.o
+gunyah_rsc_mgr-y += rsc_mgr.o rsc_mgr_rpc.o
obj-$(CONFIG_GUNYAH_RESORUCE_MANAGER) += gunyah_rsc_mgr.o
diff --git a/drivers/virt/gunyah/rsc_mgr.h b/drivers/virt/gunyah/rsc_mgr.h
index e4f2499267bf..deb884979209 100644
--- a/drivers/virt/gunyah/rsc_mgr.h
+++ b/drivers/virt/gunyah/rsc_mgr.h
@@ -28,6 +28,28 @@
#define GH_RM_ERROR_IRQ_INUSE 0x10
#define GH_RM_ERROR_IRQ_RELEASED 0x11
+/* Message IDs: VM Management */
+#define GH_RM_RPC_VM_GET_VMID 0x56000024
+
+/* Message IDs: VM Services */
+#define GH_RM_RPC_VM_CONSOLE_OPEN_ID 0x56000081
+#define GH_RM_RPC_VM_CONSOLE_CLOSE_ID 0x56000082
+#define GH_RM_RPC_VM_CONSOLE_WRITE_ID 0x56000083
+#define GH_RM_RPC_VM_CONSOLE_FLUSH_ID 0x56000084
+
+/* Call: CONSOLE_OPEN, CONSOLE_CLOSE, CONSOLE_FLUSH */
+struct gh_vm_console_common_req {
+ u16 vmid;
+ u16 reserved0;
+} __packed;
+
+/* Call: CONSOLE_WRITE */
+struct gh_vm_console_write_req {
+ u16 vmid;
+ u16 num_bytes;
+ u8 data[0];
+} __packed;
+
int gh_rm_call(u32 message_id, void *req_buff, size_t req_buff_size,
void **resp_buf, size_t *resp_buff_size);
diff --git a/drivers/virt/gunyah/rsc_mgr_rpc.c b/drivers/virt/gunyah/rsc_mgr_rpc.c
new file mode 100644
index 000000000000..8238c6ef301f
--- /dev/null
+++ b/drivers/virt/gunyah/rsc_mgr_rpc.c
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#define pr_fmt(fmt) "gh_rsc_mgr: " fmt
+
+#include <linux/slab.h>
+#include <linux/types.h>
+#include <linux/printk.h>
+#include <linux/gunyah_rsc_mgr.h>
+
+#include "rsc_mgr.h"
+
+/**
+ * gh_rm_get_vmid() - Retrieve VMID of this virtual machine
+ * @vmid: Filled with the VMID of this VM
+ */
+int gh_rm_get_vmid(u16 *vmid)
+{
+ void *resp;
+ size_t resp_size;
+ int ret;
+ int payload = 0;
+
+ ret = gh_rm_call(GH_RM_RPC_VM_GET_VMID, &payload, sizeof(payload), &resp, &resp_size);
+ if (ret)
+ return ret;
+
+ if (resp_size != sizeof(*vmid))
+ return -EIO;
+ *vmid = *(u16 *)resp;
+ kfree(resp);
+
+ return ret;
+}
+
+/**
+ * gh_rm_console_open() - Open a console with a VM
+ * @vmid: VMID of the other VM whose console to open. If VMID is GH_VMID_SELF, the
+ * console associated with this VM is opened.
+ */
+int gh_rm_console_open(u16 vmid)
+{
+ void *resp;
+ struct gh_vm_console_common_req req_payload = {0};
+ size_t resp_size;
+ int ret;
+
+ req_payload.vmid = vmid;
+
+ ret = gh_rm_call(GH_RM_RPC_VM_CONSOLE_OPEN_ID,
+ &req_payload, sizeof(req_payload),
+ &resp, &resp_size);
+ kfree(resp);
+
+ if (!ret && resp_size)
+ pr_warn("Received unexpected payload for CONSOLE_OPEN: %lu\n", resp_size);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(gh_rm_console_open);
+
+/**
+ * gh_rm_console_close() - Close a console with a VM
+ * @vmid: The vmid of the vm whose console to close.
+ */
+int gh_rm_console_close(u16 vmid)
+{
+ void *resp;
+ struct gh_vm_console_common_req req_payload = {0};
+ size_t resp_size;
+ int ret;
+
+ req_payload.vmid = vmid;
+
+ ret = gh_rm_call(GH_RM_RPC_VM_CONSOLE_CLOSE_ID,
+ &req_payload, sizeof(req_payload),
+ &resp, &resp_size);
+ kfree(resp);
+
+ if (!ret && resp_size)
+ pr_warn("Received unexpected payload for CONSOLE_CLOSE: %lu\n", resp_size);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(gh_rm_console_close);
+
+/**
+ * gh_rm_console_write() - Write to a VM's console
+ * @vmid: The vmid of the vm whose console to write to.
+ * @buf: Buffer to write to the VM's console
+ * @size: Size of the buffer
+ */
+int gh_rm_console_write(u16 vmid, const char *buf, size_t size)
+{
+ void *resp;
+ struct gh_vm_console_write_req *req_payload;
+ size_t resp_size;
+ int ret = 0;
+ size_t req_payload_size = sizeof(*req_payload) + size;
+
+ if (size < 1 || size > (U32_MAX - sizeof(*req_payload)))
+ return -EINVAL;
+
+ req_payload = kzalloc(req_payload_size, GFP_KERNEL);
+
+ if (!req_payload)
+ return -ENOMEM;
+
+ req_payload->vmid = vmid;
+ req_payload->num_bytes = size;
+ memcpy(req_payload->data, buf, size);
+
+ ret = gh_rm_call(GH_RM_RPC_VM_CONSOLE_WRITE_ID,
+ req_payload, req_payload_size,
+ &resp, &resp_size);
+ kfree(req_payload);
+ kfree(resp);
+
+ if (!ret && resp_size)
+ pr_warn("Received unexpected payload for CONSOLE_WRITE: %lu\n", resp_size);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(gh_rm_console_write);
+
+/**
+ * gh_rm_console_flush() - Flush a console with a VM
+ * @vmid: The vmid of the vm whose console to flush
+ */
+int gh_rm_console_flush(u16 vmid)
+{
+ void *resp;
+ struct gh_vm_console_common_req req_payload = {0};
+ size_t resp_size;
+ int ret;
+
+ req_payload.vmid = vmid;
+
+ ret = gh_rm_call(GH_RM_RPC_VM_CONSOLE_FLUSH_ID,
+ &req_payload, sizeof(req_payload),
+ &resp, &resp_size);
+ kfree(resp);
+
+ if (!ret && resp_size)
+ pr_warn("Received unexpected payload for CONSOLE_FLUSH: %lu\n", resp_size);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(gh_rm_console_flush);
diff --git a/include/linux/gunyah_rsc_mgr.h b/include/linux/gunyah_rsc_mgr.h
index b3b37225b7fb..f831ca921c26 100644
--- a/include/linux/gunyah_rsc_mgr.h
+++ b/include/linux/gunyah_rsc_mgr.h
@@ -23,4 +23,20 @@ struct gh_rm_notification {
int gh_rm_register_notifier(struct notifier_block *nb);
int gh_rm_unregister_notifier(struct notifier_block *nb);
+/* Notification type Message IDs */
+#define GH_RM_NOTIF_VM_CONSOLE_CHARS 0x56100080
+
+struct gh_rm_notif_vm_console_chars {
+ u16 vmid;
+ u16 num_bytes;
+ u8 bytes[0];
+} __packed;
+
+/* RPC Calls */
+int gh_rm_get_vmid(u16 *vmid);
+int gh_rm_console_open(u16 vmid);
+int gh_rm_console_close(u16 vmid);
+int gh_rm_console_write(u16 vmid, const char *buf, size_t size);
+int gh_rm_console_flush(u16 vmid);
+
#endif
--
2.25.1
On Wed, Sep 28, 2022 at 12:56:31PM -0700, Elliot Berman wrote:
> Gunyah resource manager defines a simple API for virtual machine log
> sharing with the console service. A VM's own log can be opened by using
> GH_VMID_SELF. Another VM's log can be accessed via its VMID. Once
> opened, characters can be written to the log with a write command.
> Characters are received with resource manager notifications (using ID
> GH_RM_NOTIF_VM_CONSOLE_CHARS).
>
> These high level rpc calls are kept in
> drivers/virt/gunyah/rsc_mgr_rpc.c. Future RPC calls, e.g. to launch a VM
> will also be maintained in this file.
>
> Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
> ---
> drivers/virt/gunyah/Makefile | 2 +-
> drivers/virt/gunyah/rsc_mgr.h | 22 +++++
> drivers/virt/gunyah/rsc_mgr_rpc.c | 151 ++++++++++++++++++++++++++++++
> include/linux/gunyah_rsc_mgr.h | 16 ++++
> 4 files changed, 190 insertions(+), 1 deletion(-)
> create mode 100644 drivers/virt/gunyah/rsc_mgr_rpc.c
>
> diff --git a/drivers/virt/gunyah/Makefile b/drivers/virt/gunyah/Makefile
> index 7c512490f921..73339ed445b3 100644
> --- a/drivers/virt/gunyah/Makefile
> +++ b/drivers/virt/gunyah/Makefile
> @@ -1,5 +1,5 @@
> gunyah-y += sysfs.o
> obj-$(CONFIG_GUNYAH) += gunyah.o
>
> -gunyah_rsc_mgr-y += rsc_mgr.o
> +gunyah_rsc_mgr-y += rsc_mgr.o rsc_mgr_rpc.o
> obj-$(CONFIG_GUNYAH_RESORUCE_MANAGER) += gunyah_rsc_mgr.o
> diff --git a/drivers/virt/gunyah/rsc_mgr.h b/drivers/virt/gunyah/rsc_mgr.h
> index e4f2499267bf..deb884979209 100644
> --- a/drivers/virt/gunyah/rsc_mgr.h
> +++ b/drivers/virt/gunyah/rsc_mgr.h
> @@ -28,6 +28,28 @@
> #define GH_RM_ERROR_IRQ_INUSE 0x10
> #define GH_RM_ERROR_IRQ_RELEASED 0x11
>
> +/* Message IDs: VM Management */
> +#define GH_RM_RPC_VM_GET_VMID 0x56000024
> +
> +/* Message IDs: VM Services */
> +#define GH_RM_RPC_VM_CONSOLE_OPEN_ID 0x56000081
> +#define GH_RM_RPC_VM_CONSOLE_CLOSE_ID 0x56000082
> +#define GH_RM_RPC_VM_CONSOLE_WRITE_ID 0x56000083
> +#define GH_RM_RPC_VM_CONSOLE_FLUSH_ID 0x56000084
> +
> +/* Call: CONSOLE_OPEN, CONSOLE_CLOSE, CONSOLE_FLUSH */
> +struct gh_vm_console_common_req {
> + u16 vmid;
> + u16 reserved0;
> +} __packed;
> +
> +/* Call: CONSOLE_WRITE */
> +struct gh_vm_console_write_req {
> + u16 vmid;
> + u16 num_bytes;
> + u8 data[0];
> +} __packed;
> +
> int gh_rm_call(u32 message_id, void *req_buff, size_t req_buff_size,
> void **resp_buf, size_t *resp_buff_size);
>
> diff --git a/drivers/virt/gunyah/rsc_mgr_rpc.c b/drivers/virt/gunyah/rsc_mgr_rpc.c
> new file mode 100644
> index 000000000000..8238c6ef301f
> --- /dev/null
> +++ b/drivers/virt/gunyah/rsc_mgr_rpc.c
> @@ -0,0 +1,151 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
> + */
> +
> +#define pr_fmt(fmt) "gh_rsc_mgr: " fmt
> +
> +#include <linux/slab.h>
> +#include <linux/types.h>
> +#include <linux/printk.h>
> +#include <linux/gunyah_rsc_mgr.h>
> +
> +#include "rsc_mgr.h"
> +
> +/**
> + * gh_rm_get_vmid() - Retrieve VMID of this virtual machine
> + * @vmid: Filled with the VMID of this VM
> + */
> +int gh_rm_get_vmid(u16 *vmid)
> +{
> + void *resp;
> + size_t resp_size;
> + int ret;
> + int payload = 0;
> +
> + ret = gh_rm_call(GH_RM_RPC_VM_GET_VMID, &payload, sizeof(payload), &resp, &resp_size);
> + if (ret)
> + return ret;
> +
> + if (resp_size != sizeof(*vmid))
> + return -EIO;
> + *vmid = *(u16 *)resp;
> + kfree(resp);
> +
> + return ret;
> +}
> +
> +/**
> + * gh_rm_console_open() - Open a console with a VM
> + * @vmid: VMID of the other VM whose console to open. If VMID is GH_VMID_SELF, the
> + * console associated with this VM is opened.
> + */
> +int gh_rm_console_open(u16 vmid)
> +{
> + void *resp;
> + struct gh_vm_console_common_req req_payload = {0};
> + size_t resp_size;
> + int ret;
> +
> + req_payload.vmid = vmid;
> +
> + ret = gh_rm_call(GH_RM_RPC_VM_CONSOLE_OPEN_ID,
> + &req_payload, sizeof(req_payload),
> + &resp, &resp_size);
> + kfree(resp);
> +
> + if (!ret && resp_size)
> + pr_warn("Received unexpected payload for CONSOLE_OPEN: %lu\n", resp_size);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(gh_rm_console_open);
> +
> +/**
> + * gh_rm_console_close() - Close a console with a VM
> + * @vmid: The vmid of the vm whose console to close.
> + */
> +int gh_rm_console_close(u16 vmid)
> +{
> + void *resp;
> + struct gh_vm_console_common_req req_payload = {0};
> + size_t resp_size;
> + int ret;
> +
> + req_payload.vmid = vmid;
> +
> + ret = gh_rm_call(GH_RM_RPC_VM_CONSOLE_CLOSE_ID,
> + &req_payload, sizeof(req_payload),
> + &resp, &resp_size);
> + kfree(resp);
> +
> + if (!ret && resp_size)
> + pr_warn("Received unexpected payload for CONSOLE_CLOSE: %lu\n", resp_size);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(gh_rm_console_close);
> +
> +/**
> + * gh_rm_console_write() - Write to a VM's console
> + * @vmid: The vmid of the vm whose console to write to.
> + * @buf: Buffer to write to the VM's console
> + * @size: Size of the buffer
> + */
> +int gh_rm_console_write(u16 vmid, const char *buf, size_t size)
> +{
> + void *resp;
> + struct gh_vm_console_write_req *req_payload;
> + size_t resp_size;
> + int ret = 0;
> + size_t req_payload_size = sizeof(*req_payload) + size;
> +
> + if (size < 1 || size > (U32_MAX - sizeof(*req_payload)))
> + return -EINVAL;
> +
> + req_payload = kzalloc(req_payload_size, GFP_KERNEL);
> +
> + if (!req_payload)
> + return -ENOMEM;
> +
> + req_payload->vmid = vmid;
> + req_payload->num_bytes = size;
> + memcpy(req_payload->data, buf, size);
> +
> + ret = gh_rm_call(GH_RM_RPC_VM_CONSOLE_WRITE_ID,
> + req_payload, req_payload_size,
> + &resp, &resp_size);
> + kfree(req_payload);
> + kfree(resp);
> +
> + if (!ret && resp_size)
> + pr_warn("Received unexpected payload for CONSOLE_WRITE: %lu\n", resp_size);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(gh_rm_console_write);
> +
> +/**
> + * gh_rm_console_flush() - Flush a console with a VM
> + * @vmid: The vmid of the vm whose console to flush
> + */
> +int gh_rm_console_flush(u16 vmid)
> +{
> + void *resp;
> + struct gh_vm_console_common_req req_payload = {0};
> + size_t resp_size;
> + int ret;
> +
> + req_payload.vmid = vmid;
> +
> + ret = gh_rm_call(GH_RM_RPC_VM_CONSOLE_FLUSH_ID,
> + &req_payload, sizeof(req_payload),
> + &resp, &resp_size);
> + kfree(resp);
> +
> + if (!ret && resp_size)
> + pr_warn("Received unexpected payload for CONSOLE_FLUSH: %lu\n", resp_size);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(gh_rm_console_flush);
> diff --git a/include/linux/gunyah_rsc_mgr.h b/include/linux/gunyah_rsc_mgr.h
> index b3b37225b7fb..f831ca921c26 100644
> --- a/include/linux/gunyah_rsc_mgr.h
> +++ b/include/linux/gunyah_rsc_mgr.h
> @@ -23,4 +23,20 @@ struct gh_rm_notification {
> int gh_rm_register_notifier(struct notifier_block *nb);
> int gh_rm_unregister_notifier(struct notifier_block *nb);
>
> +/* Notification type Message IDs */
> +#define GH_RM_NOTIF_VM_CONSOLE_CHARS 0x56100080
> +
> +struct gh_rm_notif_vm_console_chars {
> + u16 vmid;
> + u16 num_bytes;
> + u8 bytes[0];
Please do not use [0] for new structures, otherwise we will just have to
fix them up again as we are trying to get rid of all of these from the
kernel. Just use "bytes[];" instead.
thanks,
greg k-h
On Fri, 2022-09-30 at 14:22 +0200, Greg Kroah-Hartman wrote:
> On Wed, Sep 28, 2022 at 12:56:31PM -0700, Elliot Berman wrote:
> > Gunyah resource manager defines a simple API for virtual machine log
> > sharing with the console service.
[]
> > diff --git a/include/linux/gunyah_rsc_mgr.h b/include/linux/gunyah_rsc_mgr.h
[]
> > +struct gh_rm_notif_vm_console_chars {
> > + u16 vmid;
> > + u16 num_bytes;
> > + u8 bytes[0];
>
> Please do not use [0] for new structures, otherwise we will just have to
> fix them up again as we are trying to get rid of all of these from the
> kernel. Just use "bytes[];" instead.
Maybe a checkpatch addition like:
---
scripts/checkpatch.pl | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 2737e4ced5745..187ed84c1f80a 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -3948,6 +3948,17 @@ sub process {
}
}
+# check for zero length array declarations in likely structs
+ if ($line =~ /^\+\t($Declare\s*$Ident)\s*\[\s*0\s*\]\s*;\s*$/ &&
+ defined $lines[$linenr] &&
+ $lines[$linenr] =~ /^[\+ ]\}\s*(?:__\w+\s*(?:$balanced_parens)?)\s*;\s*$/) {
+ if (WARN("FLEXIBLE_ARRAY_ZERO",
+ "Prefer flexible length array declarations with [] over [0]\n" . $herecurr) &&
+ $fix) {
+ $fixed[$fixlinenr] =~ s/\[\s*0\s*\]/[]/;
+ }
+ }
+
# check for multiple consecutive blank lines
if ($prevline =~ /^[\+ ]\s*$/ &&
$line =~ /^\+\s*$/ &&
On Sun, Oct 02, 2022 at 06:46:30PM -0700, Joe Perches wrote:
> On Fri, 2022-09-30 at 14:22 +0200, Greg Kroah-Hartman wrote:
> > On Wed, Sep 28, 2022 at 12:56:31PM -0700, Elliot Berman wrote:
> > > Gunyah resource manager defines a simple API for virtual machine log
> > > sharing with the console service.
> []
> > > diff --git a/include/linux/gunyah_rsc_mgr.h b/include/linux/gunyah_rsc_mgr.h
> []
> > > +struct gh_rm_notif_vm_console_chars {
> > > + u16 vmid;
> > > + u16 num_bytes;
> > > + u8 bytes[0];
> >
> > Please do not use [0] for new structures, otherwise we will just have to
> > fix them up again as we are trying to get rid of all of these from the
> > kernel. Just use "bytes[];" instead.
>
> Maybe a checkpatch addition like:
> ---
> scripts/checkpatch.pl | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> index 2737e4ced5745..187ed84c1f80a 100755
> --- a/scripts/checkpatch.pl
> +++ b/scripts/checkpatch.pl
> @@ -3948,6 +3948,17 @@ sub process {
> }
> }
>
> +# check for zero length array declarations in likely structs
> + if ($line =~ /^\+\t($Declare\s*$Ident)\s*\[\s*0\s*\]\s*;\s*$/ &&
> + defined $lines[$linenr] &&
> + $lines[$linenr] =~ /^[\+ ]\}\s*(?:__\w+\s*(?:$balanced_parens)?)\s*;\s*$/) {
> + if (WARN("FLEXIBLE_ARRAY_ZERO",
> + "Prefer flexible length array declarations with [] over [0]\n" . $herecurr) &&
> + $fix) {
> + $fixed[$fixlinenr] =~ s/\[\s*0\s*\]/[]/;
> + }
> + }
> +
> # check for multiple consecutive blank lines
> if ($prevline =~ /^[\+ ]\s*$/ &&
> $line =~ /^\+\s*$/ &&
This is a question for Gustavo, who did all the work here. Gustavo,
does the above checkpatch change look good to you?
thanks,
greg k-h
On Mon, 2022-10-03 at 07:29 +0200, Greg Kroah-Hartman wrote:
> On Sun, Oct 02, 2022 at 06:46:30PM -0700, Joe Perches wrote:
> > On Fri, 2022-09-30 at 14:22 +0200, Greg Kroah-Hartman wrote:
> > > On Wed, Sep 28, 2022 at 12:56:31PM -0700, Elliot Berman wrote:
> > > > Gunyah resource manager defines a simple API for virtual machine log
> > > > sharing with the console service.
> > []
> > > > diff --git a/include/linux/gunyah_rsc_mgr.h b/include/linux/gunyah_rsc_mgr.h
> > []
> > > > +struct gh_rm_notif_vm_console_chars {
> > > > + u16 vmid;
> > > > + u16 num_bytes;
> > > > + u8 bytes[0];
> > >
> > > Please do not use [0] for new structures, otherwise we will just have to
> > > fix them up again as we are trying to get rid of all of these from the
> > > kernel. Just use "bytes[];" instead.
> >
> > Maybe a checkpatch addition like:
> > ---
[]
> > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
[]
> > @@ -3948,6 +3948,17 @@ sub process {
> > }
> > }
> >
> > +# check for zero length array declarations in likely structs
> > + if ($line =~ /^\+\t($Declare\s*$Ident)\s*\[\s*0\s*\]\s*;\s*$/ &&
> > + defined $lines[$linenr] &&
> > + $lines[$linenr] =~ /^[\+ ]\}\s*(?:__\w+\s*(?:$balanced_parens)?)\s*;\s*$/) {
This should actually be:
$lines[$linenr] =~ /^[\+ ]\}(?:\s*__\w+\s*(?:$balanced_parens)?)*\s*;\s*$/) {
as it was missing a * for uses like
int foo[0];
} __packed __aligned(4);
and uses without any attribute at all
> > + if (WARN("FLEXIBLE_ARRAY_ZERO",
> > + "Prefer flexible length array declarations with [] over [0]\n" . $herecurr) &&
> > + $fix) {
> > + $fixed[$fixlinenr] =~ s/\[\s*0\s*\]/[]/;
> > + }
> > + }
> > +
> > # check for multiple consecutive blank lines
> > if ($prevline =~ /^[\+ ]\s*$/ &&
> > $line =~ /^\+\s*$/ &&
>
> This is a question for Gustavo, who did all the work here. Gustavo,
> does the above checkpatch change look good to you?
On 10/3/22 00:38, Joe Perches wrote:
> On Mon, 2022-10-03 at 07:29 +0200, Greg Kroah-Hartman wrote:
>> On Sun, Oct 02, 2022 at 06:46:30PM -0700, Joe Perches wrote:
>>> On Fri, 2022-09-30 at 14:22 +0200, Greg Kroah-Hartman wrote:
>>>> On Wed, Sep 28, 2022 at 12:56:31PM -0700, Elliot Berman wrote:
>>>>> Gunyah resource manager defines a simple API for virtual machine log
>>>>> sharing with the console service.
>>> []
>>>>> diff --git a/include/linux/gunyah_rsc_mgr.h b/include/linux/gunyah_rsc_mgr.h
>>> []
>>>>> +struct gh_rm_notif_vm_console_chars {
>>>>> + u16 vmid;
>>>>> + u16 num_bytes;
>>>>> + u8 bytes[0];
>>>>
>>>> Please do not use [0] for new structures, otherwise we will just have to
>>>> fix them up again as we are trying to get rid of all of these from the
>>>> kernel. Just use "bytes[];" instead.
>>>
>>> Maybe a checkpatch addition like:
>>> ---
> []
>>> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> []
>>> @@ -3948,6 +3948,17 @@ sub process {
>>> }
>>> }
>>>
>>> +# check for zero length array declarations in likely structs
>>> + if ($line =~ /^\+\t($Declare\s*$Ident)\s*\[\s*0\s*\]\s*;\s*$/ &&
>>> + defined $lines[$linenr] &&
>>> + $lines[$linenr] =~ /^[\+ ]\}\s*(?:__\w+\s*(?:$balanced_parens)?)\s*;\s*$/) {
This sounds great. We need the same for one-element arrays. :)
Both zero-length and one-element arrays are deprecated.
>
> This should actually be:
>
> $lines[$linenr] =~ /^[\+ ]\}(?:\s*__\w+\s*(?:$balanced_parens)?)*\s*;\s*$/) {
I agree. Thanks.
>
> as it was missing a * for uses like
>
> int foo[0];
> } __packed __aligned(4);
>
> and uses without any attribute at all
>
>>> + if (WARN("FLEXIBLE_ARRAY_ZERO",
>>> + "Prefer flexible length array declarations with [] over [0]\n" . $herecurr) &&
>>> + $fix) {
>>> + $fixed[$fixlinenr] =~ s/\[\s*0\s*\]/[]/;
>>> + }
>>> + }
>>> +
>>> # check for multiple consecutive blank lines
>>> if ($prevline =~ /^[\+ ]\s*$/ &&
>>> $line =~ /^\+\s*$/ &&
>>
>> This is a question for Gustavo, who did all the work here. Gustavo,
>> does the above checkpatch change look good to you?
Yep; the idea is great. :)
Another alternative to stop those fake flex-arrays from entering the codebase
is to run Coccinelle scripts during linux-next builds, as suggested by Elena
Reshetova at LSSEU a couple of months ago.
However, if these can be stopped with checkpatch it'd be really helpful, as well.
Thanks
--
Gustavo
© 2016 - 2026 Red Hat, Inc.