netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] ACPI: export acpi events via generic netlink
@ 2007-06-19  3:40 Zhang Rui
  2007-07-03 17:18 ` Johannes Berg
  2007-07-03 19:45 ` Len Brown
  0 siblings, 2 replies; 7+ messages in thread
From: Zhang Rui @ 2007-06-19  3:40 UTC (permalink / raw)
  To: linux-acpi, netdev; +Cc: lenb, hadi

[-- Attachment #1: Type: text/plain, Size: 6521 bytes --]

From: Zhang Rui <rui.zhang@intel.com>

Export ACPI events via Generic Netlink.
An "acpi_event" genetlink family message is sent
when an ACPI event is generated.

Note:	The behavior of how ACPI event works nowadays is not changed.
	Use genetlink to export ACPI event instead of
	/proc/acpi/event someday, but not now.
	This patch only adds the function of sending genetlink messages
	when an ACPI event is generated.
Attachment is a simple user space utility which can be used to receive
acpi event notifications via netlink.

Thanks to Jamal for his great help.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/acpi/bus.c      |    4 +
 drivers/acpi/event.c    |  166 +++++++++++++++++++++++++++++++++++++++++++++---
 include/acpi/acpi_bus.h |    3 
 3 files changed, 165 insertions(+), 8 deletions(-)

Index: linux-2.6.22-rc5/drivers/acpi/bus.c
===================================================================
--- linux-2.6.22-rc5.orig/drivers/acpi/bus.c	2007-06-18 13:44:18.000000000 +0800
+++ linux-2.6.22-rc5/drivers/acpi/bus.c	2007-06-19 10:02:33.000000000 +0800
@@ -292,6 +292,10 @@
 	if (!device)
 		return -EINVAL;
 
+	if (acpi_bus_generate_genetlink_event(device, type, data))
+		printk(KERN_WARNING PREFIX
+			"Failed to generate an ACPI event via genetlink!\n");
+
 	/* drop event on the floor if no one's listening */
 	if (!event_is_open)
 		return 0;
Index: linux-2.6.22-rc5/drivers/acpi/event.c
===================================================================
--- linux-2.6.22-rc5.orig/drivers/acpi/event.c	2007-06-18 13:42:17.000000000 +0800
+++ linux-2.6.22-rc5/drivers/acpi/event.c	2007-06-19 11:07:15.000000000 +0800
@@ -11,6 +11,8 @@
 #include <linux/init.h>
 #include <linux/poll.h>
 #include <acpi/acpi_drivers.h>
+#include <net/netlink.h>
+#include <net/genetlink.h>
 
 #define _COMPONENT		ACPI_SYSTEM_COMPONENT
 ACPI_MODULE_NAME("event");
@@ -48,7 +50,6 @@
 	static int chars_remaining = 0;
 	static char *ptr;
 
-
 	if (!chars_remaining) {
 		memset(&event, 0, sizeof(struct acpi_bus_event));
 
@@ -106,23 +107,174 @@
 	.poll = acpi_system_poll_event,
 };
 
+#ifdef CONFIG_NET
+unsigned int acpi_event_seqnum;
+struct acpi_genl_event {
+	acpi_device_class device_class;
+	char bus_id[15];
+	u32 type;
+	u32 data;
+};
+
+/* attributes of acpi_genl_family */
+enum {
+	ACPI_GENL_ATTR_UNSPEC,
+	ACPI_GENL_ATTR_EVENT,	/* ACPI event info needed by user space */
+	__ACPI_GENL_ATTR_MAX,
+};
+#define ACPI_GENL_ATTR_MAX (__ACPI_GENL_ATTR_MAX - 1)
+
+/* commands supported by the acpi_genl_family */
+enum {
+	ACPI_GENL_CMD_UNSPEC,
+	ACPI_GENL_CMD_EVENT,	/* kernel->user notifications for ACPI events */
+	__ACPI_GENL_CMD_MAX,
+};
+#define ACPI_GENL_CMD_MAX (__ACPI_GENL_CMD_MAX - 1)
+
+#define ACPI_GENL_NAME		"acpi_event"
+#define ACPI_GENL_VERSION	0x01
+
+static struct genl_family acpi_event_genl_family = {
+	.id = GENL_ID_GENERATE,
+	.name = ACPI_GENL_NAME,
+	.version = ACPI_GENL_VERSION,
+	.maxattr = ACPI_GENL_ATTR_MAX,
+};
+
+/* .doit: standard command callback */
+static int acpi_genl_cmd_event(struct sk_buff *skb, struct genl_info *info)
+{
+	struct acpi_genl_event *event = info->userhdr;
+
+	if (!event)
+		ACPI_DEBUG_PRINT((ACPI_DB_WARN, "ACPI event: NULL\n"));
+
+	return 0;
+}
+
+static struct genl_ops acpi_event_genl_ops = {
+	.cmd = ACPI_GENL_CMD_EVENT,
+	.doit = acpi_genl_cmd_event,
+};
+
+int acpi_bus_generate_genetlink_event(struct acpi_device *device,
+				      u8 type, int data)
+{
+	struct sk_buff *skb;
+	struct nlattr *attr;
+	struct acpi_genl_event *event;
+	void *msg_header;
+	int size;
+	int result;
+
+	/* allocate memory */
+	size = nla_total_size(sizeof(struct acpi_genl_event)) +
+	    nla_total_size(0);
+
+	skb = genlmsg_new(size, GFP_ATOMIC);
+	if (!skb)
+		return -ENOMEM;
+
+	/* add the genetlink message header */
+	msg_header = genlmsg_put(skb, 0, acpi_event_seqnum++,
+				 &acpi_event_genl_family, 0,
+				 ACPI_GENL_CMD_EVENT);
+	if (!msg_header) {
+		nlmsg_free(skb);
+		return -ENOMEM;
+	}
+
+	/* fill the data */
+	attr =
+	    nla_reserve(skb, ACPI_GENL_ATTR_EVENT,
+			sizeof(struct acpi_genl_event));
+	if (!attr) {
+		nlmsg_free(skb);
+		return -EINVAL;
+	}
+
+	event = nla_data(attr);
+	if (!event) {
+		nlmsg_free(skb);
+		return -EINVAL;
+	}
+
+	memset(event, 0, sizeof(struct acpi_genl_event));
+
+	strcpy(event->device_class, device->pnp.device_class);
+	strcpy(event->bus_id, device->dev.bus_id);
+	event->type = type;
+	event->data = data;
+
+	/* send multicast genetlink message */
+	result = genlmsg_end(skb, msg_header);
+	if (result < 0) {
+		nlmsg_free(skb);
+		return result;
+	}
+
+	result =
+	    genlmsg_multicast(skb, 0, acpi_event_genl_family.id, GFP_ATOMIC);
+	if (result)
+		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+				  "Failed to send a Genetlink message!\n"));
+	return 0;
+}
+EXPORT_SYMBOL(acpi_bus_generate_genetlink_event);
+
+static int acpi_event_genetlink_init(void)
+{
+	int result;
+
+	result = genl_register_family(&acpi_event_genl_family);
+	if (result)
+		return result;
+
+	result =
+	    genl_register_ops(&acpi_event_genl_family, &acpi_event_genl_ops);
+	if (result)
+		genl_unregister_family(&acpi_event_genl_family);
+
+	return result;
+}
+
+#else
+int acpi_bus_generate_genetlink_event(struct acpi_device *device, u8 type,
+				      int data)
+{
+	return 0;
+}
+EXPORT_SYMBOL(acpi_bus_generate_genetlink_event);
+
+static int acpi_event_genetlink_init(void)
+{
+	return -ENODEV;
+}
+#endif
+
 static int __init acpi_event_init(void)
 {
 	struct proc_dir_entry *entry;
 	int error = 0;
 
-
 	if (acpi_disabled)
 		return 0;
 
+	/* create genetlink for acpi event */
+	error = acpi_event_genetlink_init();
+	if (error)
+		printk(KERN_WARNING PREFIX
+		       "Failed to create genetlink family for ACPI event\n");
+
 	/* 'event' [R] */
 	entry = create_proc_entry("event", S_IRUSR, acpi_root_dir);
 	if (entry)
 		entry->proc_fops = &acpi_system_event_ops;
-	else {
-		error = -ENODEV;
-	}
-	return error;
+	else
+		return -ENODEV;
+
+	return 0;
 }
 
-subsys_initcall(acpi_event_init);
+fs_initcall(acpi_event_init);
Index: linux-2.6.22-rc5/include/acpi/acpi_bus.h
===================================================================
--- linux-2.6.22-rc5.orig/include/acpi/acpi_bus.h	2007-06-18 13:44:19.000000000 +0800
+++ linux-2.6.22-rc5/include/acpi/acpi_bus.h	2007-06-19 09:18:14.000000000 +0800
@@ -321,7 +321,8 @@
 };
 
 extern struct kset acpi_subsys;
-
+extern int acpi_bus_generate_genetlink_event(struct acpi_device *device,
+						u8 type, int data);
 /*
  * External Functions
  */


[-- Attachment #2: acpi_genl.tgz --]
[-- Type: application/x-compressed-tar, Size: 6472 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] ACPI: export acpi events via generic netlink
  2007-06-19  3:40 [PATCH] ACPI: export acpi events via generic netlink Zhang Rui
@ 2007-07-03 17:18 ` Johannes Berg
  2007-07-03 19:45 ` Len Brown
  1 sibling, 0 replies; 7+ messages in thread
From: Johannes Berg @ 2007-07-03 17:18 UTC (permalink / raw)
  To: Zhang Rui; +Cc: linux-acpi, netdev, lenb, hadi

[-- Attachment #1: Type: text/plain, Size: 2143 bytes --]

On Tue, 2007-06-19 at 11:40 +0800, Zhang Rui wrote:

> +/* attributes of acpi_genl_family */
> +enum {
> +	ACPI_GENL_ATTR_UNSPEC,
> +	ACPI_GENL_ATTR_EVENT,	/* ACPI event info needed by user space */
> +	__ACPI_GENL_ATTR_MAX,
> +};
> +#define ACPI_GENL_ATTR_MAX (__ACPI_GENL_ATTR_MAX - 1)
> +
> +/* commands supported by the acpi_genl_family */
> +enum {
> +	ACPI_GENL_CMD_UNSPEC,
> +	ACPI_GENL_CMD_EVENT,	/* kernel->user notifications for ACPI events */
> +	__ACPI_GENL_CMD_MAX,
> +};
> +#define ACPI_GENL_CMD_MAX (__ACPI_GENL_CMD_MAX - 1)

Shouldn't you put these into some header file instead of copying them
into your userspace tool?

> +#define ACPI_GENL_NAME		"acpi_event"
> +#define ACPI_GENL_VERSION	0x01

and maybe those too?

> +/* .doit: standard command callback */
> +static int acpi_genl_cmd_event(struct sk_buff *skb, struct genl_info *info)
> +{
> +	struct acpi_genl_event *event = info->userhdr;
> +
> +	if (!event)
> +		ACPI_DEBUG_PRINT((ACPI_DB_WARN, "ACPI event: NULL\n"));
> +
> +	return 0;
> +}
> +
> +static struct genl_ops acpi_event_genl_ops = {
> +	.cmd = ACPI_GENL_CMD_EVENT,
> +	.doit = acpi_genl_cmd_event,
> +};

This I don't understand, why would userspace ever send events to the
kernel? I think you should just leave this out completely.

> +	result =
> +	    genlmsg_multicast(skb, 0, acpi_event_genl_family.id, GFP_ATOMIC);

If my patches are merged you should now register a multicast group.

Here's how I do it in nl80211 now:

| static struct genl_multicast_group nl80211_config_mcgrp = {
| 	.name = "config",
| };

during init:

| err = genl_register_mc_group(&nl80211_fam, &nl80211_config_mcgrp);
| if (err)
| 	goto err_out;


for sending the message:

| genlmsg_multicast(msg, 0, nl80211_config_mcgrp.id, GFP_KERNEL);

(I suppose you want GFP_ATOMIC for a reason)

In userspace you query the new multicast group attribute(s) [but let's
see what Jamal wants me to change there first] and bind to that group
using
| int group = ...;
| setsockopt(s, 270 /*SOL_NETLINK*/, NETLINK_ADD_MEMBERSHIP, &group, sizeof(group));.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 190 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] ACPI: export acpi events via generic netlink
  2007-06-19  3:40 [PATCH] ACPI: export acpi events via generic netlink Zhang Rui
  2007-07-03 17:18 ` Johannes Berg
@ 2007-07-03 19:45 ` Len Brown
  2007-07-04 12:01   ` Johannes Berg
  1 sibling, 1 reply; 7+ messages in thread
From: Len Brown @ 2007-07-03 19:45 UTC (permalink / raw)
  To: Zhang Rui; +Cc: linux-acpi, netdev, hadi

Thanks for including the demo program, Rui, it works for me (tm).

Applied -- with the incremental patch below, which I think
is correct because the only caller is bus.c, which is part of
the base kernel, not a module.  Modules will call
acpi_bus_generate_event(), not acpi_bus_generate_genetlink_event()
directly.

thanks,
-Len

commit b563d6f30d937510e02541930b1558d0f5759413
Author: Len Brown <len.brown@intel.com>
Date:   Tue Jul 3 15:32:23 2007 -0400

    ACPI: netlink: remove unnecessary EXPORT_SYMBOL
    
    Signed-off-by: Len Brown <len.brown@intel.com>

diff --git a/drivers/acpi/event.c b/drivers/acpi/event.c
index 98627b0..de4def9 100644
--- a/drivers/acpi/event.c
+++ b/drivers/acpi/event.c
@@ -221,7 +221,6 @@ int acpi_bus_generate_genetlink_event(struct acpi_device *device,
 				  "Failed to send a Genetlink message!\n"));
 	return 0;
 }
-EXPORT_SYMBOL(acpi_bus_generate_genetlink_event);
 
 static int acpi_event_genetlink_init(void)
 {
@@ -245,7 +244,6 @@ int acpi_bus_generate_genetlink_event(struct acpi_device *device, u8 type,
 {
 	return 0;
 }
-EXPORT_SYMBOL(acpi_bus_generate_genetlink_event);
 
 static int acpi_event_genetlink_init(void)
 {

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] ACPI: export acpi events via generic netlink
  2007-07-03 19:45 ` Len Brown
@ 2007-07-04 12:01   ` Johannes Berg
  2007-07-05  8:24     ` Zhang Rui
  0 siblings, 1 reply; 7+ messages in thread
From: Johannes Berg @ 2007-07-04 12:01 UTC (permalink / raw)
  To: Len Brown; +Cc: Zhang Rui, linux-acpi, netdev, hadi

[-- Attachment #1: Type: text/plain, Size: 526 bytes --]

On Tue, 2007-07-03 at 15:45 -0400, Len Brown wrote:
> Thanks for including the demo program, Rui, it works for me (tm).
> 
> Applied -- with the incremental patch below, which I think
> is correct because the only caller is bus.c, which is part of
> the base kernel, not a module.

Dang, mail crossing :)

Are you open to reworking this on top of my multicast patches that I
hope to get in soonish, or should I respin my multicast patches to
ensure ACPI has a stable family and multicast group number?

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 190 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] ACPI: export acpi events via generic netlink
  2007-07-04 12:01   ` Johannes Berg
@ 2007-07-05  8:24     ` Zhang Rui
  2007-07-05  8:35       ` Johannes Berg
  0 siblings, 1 reply; 7+ messages in thread
From: Zhang Rui @ 2007-07-05  8:24 UTC (permalink / raw)
  To: Johannes Berg; +Cc: Len Brown, linux-acpi@vger, netdev, hadi

On Wed, 2007-07-04 at 14:01 +0200, Johannes Berg wrote:
> On Tue, 2007-07-03 at 15:45 -0400, Len Brown wrote:
> > Thanks for including the demo program, Rui, it works for me (tm).
> > 
> > Applied -- with the incremental patch below, which I think
> > is correct because the only caller is bus.c, which is part of
> > the base kernel, not a module.

> Are you open to reworking this on top of my multicast patches that I
> hope to get in soonish, or should I respin my multicast patches to
> ensure ACPI has a stable family and multicast group number?
> 
Hi, Johannes,

I missed the discussion about the multicast issues.
You don't need to reserve a family and group ID for ACPI. I'll rework
this on your patches.:)

But I don't know when these mutlicast patches can be merged while I hope
the function of exporting ACPI event via genetlink can be added ASAP.

I'm okay to hold off on this patch if you think the multicast patches
can be merged soon. Or else I tend to apply it first and send an
additional patch together with your patches later.

Thanks,
Rui

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] ACPI: export acpi events via generic netlink
  2007-07-05  8:24     ` Zhang Rui
@ 2007-07-05  8:35       ` Johannes Berg
  2007-07-05  8:54         ` Zhang Rui
  0 siblings, 1 reply; 7+ messages in thread
From: Johannes Berg @ 2007-07-05  8:35 UTC (permalink / raw)
  To: Zhang Rui; +Cc: Len Brown, linux-acpi@vger, netdev, hadi

[-- Attachment #1: Type: text/plain, Size: 829 bytes --]

On Thu, 2007-07-05 at 16:24 +0800, Zhang Rui wrote:

> I missed the discussion about the multicast issues.
> You don't need to reserve a family and group ID for ACPI. I'll rework
> this on your patches.:)

I don't want to hold you, don't worry, I can handle it as well.

> But I don't know when these mutlicast patches can be merged while I hope
> the function of exporting ACPI event via genetlink can be added ASAP.
> 
> I'm okay to hold off on this patch if you think the multicast patches
> can be merged soon. Or else I tend to apply it first and send an
> additional patch together with your patches later.

I personally think it's ready to go and haven't received any further
comments, but maybe something will come up still. I'll wait a few days
and then repost as an actual .23 submission.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 190 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] ACPI: export acpi events via generic netlink
  2007-07-05  8:35       ` Johannes Berg
@ 2007-07-05  8:54         ` Zhang Rui
  0 siblings, 0 replies; 7+ messages in thread
From: Zhang Rui @ 2007-07-05  8:54 UTC (permalink / raw)
  To: Johannes Berg; +Cc: Len Brown, linux-acpi@vger, netdev, hadi

On Thu, 2007-07-05 at 10:35 +0200, Johannes Berg wrote:
> On Thu, 2007-07-05 at 16:24 +0800, Zhang Rui wrote:
> 
> > I missed the discussion about the multicast issues.
> > You don't need to reserve a family and group ID for ACPI. I'll rework
> > this on your patches.:)
> 
> I don't want to hold you, don't worry, I can handle it as well.
I got your comments on my original patch and it seems that we don't need
to change a lot with your patches applied. :)

> > But I don't know when these mutlicast patches can be merged while I hope
> > the function of exporting ACPI event via genetlink can be added ASAP.
> > 
> > I'm okay to hold off on this patch if you think the multicast patches
> > can be merged soon. Or else I tend to apply it first and send an
> > additional patch together with your patches later.
> 
> I personally think it's ready to go and haven't received any further
> comments, but maybe something will come up still. I'll wait a few days
> and then repost as an actual .23 submission.
That would be great. Can we add the ACPI genetlink patch to your patch
set and send them together? I'll refresh it based on your comments.

Thanks,
Rui

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2007-07-05  8:54 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-19  3:40 [PATCH] ACPI: export acpi events via generic netlink Zhang Rui
2007-07-03 17:18 ` Johannes Berg
2007-07-03 19:45 ` Len Brown
2007-07-04 12:01   ` Johannes Berg
2007-07-05  8:24     ` Zhang Rui
2007-07-05  8:35       ` Johannes Berg
2007-07-05  8:54         ` Zhang Rui

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).