From: Matt Helsley <matthltc@us.ibm.com>
To: Erik Jacobson <erikj@sgi.com>
Cc: linux-kernel@vger.kernel.org, guillaume.thouvenin@bull.net
Subject: Re: [PATCH] connector: Some fixes for ia64 unaligned access errors
Date: Mon, 11 Dec 2006 15:52:46 -0800 [thread overview]
Message-ID: <1165881166.24721.71.camel@localhost.localdomain> (raw)
In-Reply-To: <20061207232213.GA29340@sgi.com>
On Thu, 2006-12-07 at 17:22 -0600, Erik Jacobson wrote:
> On ia64, the various functions that make up cn_proc.c cause kernel
> unaligned access errors.
>
> If you are using these, for example, to get notification about
> all tasks forking and exiting, you get multiple unaligned access errors
> per process.
>
> Here, we just adjust how the variables are declared and use memcopy to
> avoid the error messages.
>
> Signed-off-by: Erik Jacobson <erikj@sgi.com>
Acked-by: Matt Helsley <matthltc@us.ibm.com>
> ---
>
> cn_proc.c | 94 +++++++++++++++++++++++++++++++-------------------------------
> 1 file changed, 47 insertions(+), 47 deletions(-)
> --- linux.orig/drivers/connector/cn_proc.c 2006-11-29 15:57:37.000000000 -0600
> +++ linux/drivers/connector/cn_proc.c 2006-12-07 16:50:03.195035791 -0600
> @@ -49,7 +49,7 @@
> void proc_fork_connector(struct task_struct *task)
> {
> struct cn_msg *msg;
> - struct proc_event *ev;
> + struct proc_event ev;
> __u8 buffer[CN_PROC_MSG_SIZE];
> struct timespec ts;
>
> @@ -57,19 +57,19 @@
> return;
>
> msg = (struct cn_msg*)buffer;
> - ev = (struct proc_event*)msg->data;
> - get_seq(&msg->seq, &ev->cpu);
> + get_seq(&msg->seq, &ev.cpu);
> ktime_get_ts(&ts); /* get high res monotonic timestamp */
> - ev->timestamp_ns = timespec_to_ns(&ts);
> - ev->what = PROC_EVENT_FORK;
> - ev->event_data.fork.parent_pid = task->real_parent->pid;
> - ev->event_data.fork.parent_tgid = task->real_parent->tgid;
> - ev->event_data.fork.child_pid = task->pid;
> - ev->event_data.fork.child_tgid = task->tgid;
> + ev.timestamp_ns = timespec_to_ns(&ts);
> + ev.what = PROC_EVENT_FORK;
> + ev.event_data.fork.parent_pid = task->real_parent->pid;
> + ev.event_data.fork.parent_tgid = task->real_parent->tgid;
> + ev.event_data.fork.child_pid = task->pid;
> + ev.event_data.fork.child_tgid = task->tgid;
>
> memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
> msg->ack = 0; /* not used */
> - msg->len = sizeof(*ev);
> + msg->len = sizeof(ev);
> + memcpy(msg->data, &ev, sizeof(ev));
> /* If cn_netlink_send() failed, the data is not sent */
> cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL);
> }
> @@ -77,7 +77,7 @@
> void proc_exec_connector(struct task_struct *task)
> {
> struct cn_msg *msg;
> - struct proc_event *ev;
> + struct proc_event ev;
> struct timespec ts;
> __u8 buffer[CN_PROC_MSG_SIZE];
>
> @@ -85,24 +85,24 @@
> return;
>
> msg = (struct cn_msg*)buffer;
> - ev = (struct proc_event*)msg->data;
> - get_seq(&msg->seq, &ev->cpu);
> + get_seq(&msg->seq, &ev.cpu);
> ktime_get_ts(&ts); /* get high res monotonic timestamp */
> - ev->timestamp_ns = timespec_to_ns(&ts);
> - ev->what = PROC_EVENT_EXEC;
> - ev->event_data.exec.process_pid = task->pid;
> - ev->event_data.exec.process_tgid = task->tgid;
> + ev.timestamp_ns = timespec_to_ns(&ts);
> + ev.what = PROC_EVENT_EXEC;
> + ev.event_data.exec.process_pid = task->pid;
> + ev.event_data.exec.process_tgid = task->tgid;
>
> memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
> msg->ack = 0; /* not used */
> - msg->len = sizeof(*ev);
> + msg->len = sizeof(ev);
> + memcpy(msg->data, &ev, sizeof(ev));
> cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL);
> }
>
> void proc_id_connector(struct task_struct *task, int which_id)
> {
> struct cn_msg *msg;
> - struct proc_event *ev;
> + struct proc_event ev;
> __u8 buffer[CN_PROC_MSG_SIZE];
> struct timespec ts;
>
> @@ -110,32 +110,32 @@
> return;
>
> msg = (struct cn_msg*)buffer;
> - ev = (struct proc_event*)msg->data;
> - ev->what = which_id;
> - ev->event_data.id.process_pid = task->pid;
> - ev->event_data.id.process_tgid = task->tgid;
> + ev.what = which_id;
> + ev.event_data.id.process_pid = task->pid;
> + ev.event_data.id.process_tgid = task->tgid;
> if (which_id == PROC_EVENT_UID) {
> - ev->event_data.id.r.ruid = task->uid;
> - ev->event_data.id.e.euid = task->euid;
> + ev.event_data.id.r.ruid = task->uid;
> + ev.event_data.id.e.euid = task->euid;
> } else if (which_id == PROC_EVENT_GID) {
> - ev->event_data.id.r.rgid = task->gid;
> - ev->event_data.id.e.egid = task->egid;
> + ev.event_data.id.r.rgid = task->gid;
> + ev.event_data.id.e.egid = task->egid;
> } else
> return;
> - get_seq(&msg->seq, &ev->cpu);
> + get_seq(&msg->seq, &ev.cpu);
> ktime_get_ts(&ts); /* get high res monotonic timestamp */
> - ev->timestamp_ns = timespec_to_ns(&ts);
> + ev.timestamp_ns = timespec_to_ns(&ts);
>
> memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
> msg->ack = 0; /* not used */
> - msg->len = sizeof(*ev);
> + msg->len = sizeof(ev);
> + memcpy(msg->data, &ev, sizeof(ev));
> cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL);
> }
>
> void proc_exit_connector(struct task_struct *task)
> {
> struct cn_msg *msg;
> - struct proc_event *ev;
> + struct proc_event ev;
> __u8 buffer[CN_PROC_MSG_SIZE];
> struct timespec ts;
>
> @@ -143,19 +143,19 @@
> return;
>
> msg = (struct cn_msg*)buffer;
> - ev = (struct proc_event*)msg->data;
> - get_seq(&msg->seq, &ev->cpu);
> + get_seq(&msg->seq, &ev.cpu);
> ktime_get_ts(&ts); /* get high res monotonic timestamp */
> - ev->timestamp_ns = timespec_to_ns(&ts);
> - ev->what = PROC_EVENT_EXIT;
> - ev->event_data.exit.process_pid = task->pid;
> - ev->event_data.exit.process_tgid = task->tgid;
> - ev->event_data.exit.exit_code = task->exit_code;
> - ev->event_data.exit.exit_signal = task->exit_signal;
> + ev.timestamp_ns = timespec_to_ns(&ts);
> + ev.what = PROC_EVENT_EXIT;
> + ev.event_data.exit.process_pid = task->pid;
> + ev.event_data.exit.process_tgid = task->tgid;
> + ev.event_data.exit.exit_code = task->exit_code;
> + ev.event_data.exit.exit_signal = task->exit_signal;
>
> memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
> msg->ack = 0; /* not used */
> - msg->len = sizeof(*ev);
> + msg->len = sizeof(ev);
> + memcpy(msg->data, &ev, sizeof(ev));
> cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL);
> }
>
> @@ -170,7 +170,7 @@
> static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
> {
> struct cn_msg *msg;
> - struct proc_event *ev;
> + struct proc_event ev;
> __u8 buffer[CN_PROC_MSG_SIZE];
> struct timespec ts;
>
> @@ -178,16 +178,16 @@
> return;
>
> msg = (struct cn_msg*)buffer;
> - ev = (struct proc_event*)msg->data;
> msg->seq = rcvd_seq;
> ktime_get_ts(&ts); /* get high res monotonic timestamp */
> - ev->timestamp_ns = timespec_to_ns(&ts);
> - ev->cpu = -1;
> - ev->what = PROC_EVENT_NONE;
> - ev->event_data.ack.err = err;
> + ev.timestamp_ns = timespec_to_ns(&ts);
> + ev.cpu = -1;
> + ev.what = PROC_EVENT_NONE;
> + ev.event_data.ack.err = err;
> memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
> msg->ack = rcvd_ack + 1;
> - msg->len = sizeof(*ev);
> + msg->len = sizeof(ev);
> + memcpy(msg->data, &ev, sizeof(ev));
> cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL);
> }
>
next prev parent reply other threads:[~2006-12-11 23:52 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-07 23:22 Erik Jacobson
2006-12-09 3:20 ` Pete Zaitcev
2006-12-09 7:47 ` Matt Helsley
2006-12-09 21:09 ` Erik Jacobson
2006-12-10 2:34 ` Pete Zaitcev
2006-12-11 23:52 ` Matt Helsley
2006-12-12 1:29 ` Pete Zaitcev
2006-12-12 1:50 ` David Miller
2006-12-12 3:09 ` Matt Helsley
2006-12-12 3:41 ` David Miller
2006-12-12 2:07 ` Chen, Kenneth W
2006-12-11 23:52 ` Matt Helsley [this message]
2006-12-12 17:54 ` Erik Jacobson
2006-12-13 0:45 ` Andrew Morton
2006-12-13 2:31 ` Erik Jacobson
2006-12-13 2:38 ` Andrew Morton
2006-12-13 6:08 ` Erik Jacobson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1165881166.24721.71.camel@localhost.localdomain \
--to=matthltc@us.ibm.com \
--cc=erikj@sgi.com \
--cc=guillaume.thouvenin@bull.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®