public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH -mm] Taskstats fix the structure members alignment issue
@ 2007-04-20 16:43 Balbir Singh
  2007-04-20 19:15 ` Andrew Morton
  0 siblings, 1 reply; 5+ messages in thread
From: Balbir Singh @ 2007-04-20 16:43 UTC (permalink / raw)
  To: Andrew Morton; +Cc: nagar, jlan, Balbir Singh, linux-kernel


We broke the the alignment of members of taskstats to the 8 byte boundary
with the CSA patches. In the current kernel, the taskstats structure is
not suitable for use by 32 bit applications in a 64 bit kernel.

On x86_64

Offsets of taskstats' members (64 bit kernel, 64 bit application)

@taskstats'offsetof[@taskstats'indices] = (
        0,      # version
        4,      # ac_exitcode
        8,      # ac_flag
        9,      # ac_nice
        16,     # cpu_count
        24,     # cpu_delay_total
        32,     # blkio_count
        40,     # blkio_delay_total
        48,     # swapin_count
        56,     # swapin_delay_total
        64,     # cpu_run_real_total
        72,     # cpu_run_virtual_total
        80,     # ac_comm
        112,    # ac_sched
        113,    # ac_pad
        116,    # ac_uid
        120,    # ac_gid
        124,    # ac_pid
        128,    # ac_ppid
        132,    # ac_btime
        136,    # ac_etime
        144,    # ac_utime
        152,    # ac_stime
        160,    # ac_minflt
        168,    # ac_majflt
        176,    # coremem
        184,    # virtmem
        192,    # hiwater_rss
        200,    # hiwater_vm
        208,    # read_char
        216,    # write_char
        224,    # read_syscalls
        232,    # write_syscalls
        240,    # read_bytes
        248,    # write_bytes
        256,    # cancelled_write_bytes
    );


Offsets of taskstats' members (64 bit kernel, 32 bit application)

@taskstats'offsetof[@taskstats'indices] = (
        0,      # version
        4,      # ac_exitcode
        8,      # ac_flag
        9,      # ac_nice
        12,     # cpu_count
        20,     # cpu_delay_total
        28,     # blkio_count
        36,     # blkio_delay_total
        44,     # swapin_count
        52,     # swapin_delay_total
        60,     # cpu_run_real_total
        68,     # cpu_run_virtual_total
        76,     # ac_comm
        108,    # ac_sched
        109,    # ac_pad
        112,    # ac_uid
        116,    # ac_gid
        120,    # ac_pid
        124,    # ac_ppid
        128,    # ac_btime
        132,    # ac_etime
        140,    # ac_utime
        148,    # ac_stime
        156,    # ac_minflt
        164,    # ac_majflt
        172,    # coremem
        180,    # virtmem
        188,    # hiwater_rss
        196,    # hiwater_vm
        204,    # read_char
        212,    # write_char
        220,    # read_syscalls
        228,    # write_syscalls
        236,    # read_bytes
        244,    # write_bytes
        252,    # cancelled_write_bytes
    );


This is one way to solve the problem without re-arranging structure members is
to pack the structure. The patch adds an __attribute__((aligned(8))) to the
taskstats structure members so that 32 bit applications using taskstats
can work with a 64 bit kernel.

Using __attribute__((packed)) would break the 64 bit alignment of members.

The fix was tested on x86_64. After the fix, we got

Offsets of taskstats' members (64 bit kernel, 64 bit application)

@taskstats'offsetof[@taskstats'indices] = (
        0,      # version
        4,      # ac_exitcode
        8,      # ac_flag
        9,      # ac_nice
        16,     # cpu_count
        24,     # cpu_delay_total
        32,     # blkio_count
        40,     # blkio_delay_total
        48,     # swapin_count
        56,     # swapin_delay_total
        64,     # cpu_run_real_total
        72,     # cpu_run_virtual_total
        80,     # ac_comm
        112,    # ac_sched
        113,    # ac_pad
        120,    # ac_uid
        124,    # ac_gid
        128,    # ac_pid
        132,    # ac_ppid
        136,    # ac_btime
        144,    # ac_etime
        152,    # ac_utime
        160,    # ac_stime
        168,    # ac_minflt
        176,    # ac_majflt
        184,    # coremem
        192,    # virtmem
        200,    # hiwater_rss
        208,    # hiwater_vm
        216,    # read_char
        224,    # write_char
        232,    # read_syscalls
        240,    # write_syscalls
        248,    # read_bytes
        256,    # write_bytes
        264,    # cancelled_write_bytes
    );


Offsets of taskstats' members (64 bit kernel, 32 bit application)

@taskstats'offsetof[@taskstats'indices] = (
        0,      # version
        4,      # ac_exitcode
        8,      # ac_flag
        9,      # ac_nice
        16,     # cpu_count
        24,     # cpu_delay_total
        32,     # blkio_count
        40,     # blkio_delay_total
        48,     # swapin_count
        56,     # swapin_delay_total
        64,     # cpu_run_real_total
        72,     # cpu_run_virtual_total
        80,     # ac_comm
        112,    # ac_sched
        113,    # ac_pad
        120,    # ac_uid
        124,    # ac_gid
        128,    # ac_pid
        132,    # ac_ppid
        136,    # ac_btime
        144,    # ac_etime
        152,    # ac_utime
        160,    # ac_stime
        168,    # ac_minflt
        176,    # ac_majflt
        184,    # coremem
        192,    # virtmem
        200,    # hiwater_rss
        208,    # hiwater_vm
        216,    # read_char
        224,    # write_char
        232,    # read_syscalls
        240,    # write_syscalls
        248,    # read_bytes
        256,    # write_bytes
        264,    # cancelled_write_bytes
    );


Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
---

 include/linux/taskstats.h |   11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff -puN include/linux/taskstats.h~fix-taskstats-alignment include/linux/taskstats.h
--- linux-2.6.20/include/linux/taskstats.h~fix-taskstats-alignment	2007-04-19 12:28:25.000000000 +0530
+++ linux-2.6.20-balbir/include/linux/taskstats.h	2007-04-19 13:21:48.000000000 +0530
@@ -66,7 +66,7 @@ struct taskstats {
 	/* Delay waiting for cpu, while runnable
 	 * count, delay_total NOT updated atomically
 	 */
-	__u64	cpu_count;
+	__u64	cpu_count __attribute__((aligned(8)));
 	__u64	cpu_delay_total;
 
 	/* Following four fields atomically updated using task->delays->lock */
@@ -101,14 +101,17 @@ struct taskstats {
 
 	/* Basic Accounting Fields start */
 	char	ac_comm[TS_COMM_LEN];	/* Command name */
-	__u8	ac_sched;		/* Scheduling discipline */
+	__u8	ac_sched __attribute__((aligned(8)));
+					/* Scheduling discipline */
 	__u8	ac_pad[3];
-	__u32	ac_uid;			/* User ID */
+	__u32	ac_uid __attribute__((aligned(8)));
+					/* User ID */
 	__u32	ac_gid;			/* Group ID */
 	__u32	ac_pid;			/* Process ID */
 	__u32	ac_ppid;		/* Parent process ID */
 	__u32	ac_btime;		/* Begin time [sec since 1970] */
-	__u64	ac_etime;		/* Elapsed time [usec] */
+	__u64	ac_etime __attribute__((aligned(8)));
+					/* Elapsed time [usec] */
 	__u64	ac_utime;		/* User CPU time [usec] */
 	__u64	ac_stime;		/* SYstem CPU time [usec] */
 	__u64	ac_minflt;		/* Minor Page Fault Count */
_

-- 
	Warm Regards,
	Balbir Singh
	Linux Technology Center
	IBM, ISTL

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

* Re: [PATCH -mm] Taskstats fix the structure members alignment issue
  2007-04-20 16:43 [PATCH -mm] Taskstats fix the structure members alignment issue Balbir Singh
@ 2007-04-20 19:15 ` Andrew Morton
  2007-04-21 12:59   ` Balbir Singh
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2007-04-20 19:15 UTC (permalink / raw)
  To: Balbir Singh; +Cc: nagar, jlan, linux-kernel

On Fri, 20 Apr 2007 22:13:41 +0530
Balbir Singh <balbir@in.ibm.com> wrote:

> 
> We broke the the alignment of members of taskstats to the 8 byte boundary
> with the CSA patches. In the current kernel, the taskstats structure is
> not suitable for use by 32 bit applications in a 64 bit kernel.
> 

ugh, that was bad of us.

> ...
> The patch adds an __attribute__((aligned(8))) to the
> taskstats structure members so that 32 bit applications using taskstats
> can work with a 64 bit kernel.

But there might be 32-bit applications out there which are using the
present wrong structure?

otoh, I assume that those applications would be using taskstats.h and would
hence encounter this bug and we would have heard about it, is that correct?

otoh^2, 32-bit applications running under 32-bit kernels will presently be
functioning correctly, and your change will require that those applications
be recompiled, I think?


This patch looks like 2.6.20 and 2.6.21 material, but very carefully...

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

* Re: [PATCH -mm] Taskstats fix the structure members alignment issue
  2007-04-20 19:15 ` Andrew Morton
@ 2007-04-21 12:59   ` Balbir Singh
  2007-04-21 19:33     ` Andrew Morton
  0 siblings, 1 reply; 5+ messages in thread
From: Balbir Singh @ 2007-04-21 12:59 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Balbir Singh, nagar, jlan, linux-kernel

Andrew Morton wrote:
> On Fri, 20 Apr 2007 22:13:41 +0530
> Balbir Singh <balbir@in.ibm.com> wrote:
> 
>> We broke the the alignment of members of taskstats to the 8 byte boundary
>> with the CSA patches. In the current kernel, the taskstats structure is
>> not suitable for use by 32 bit applications in a 64 bit kernel.
>>
> 
> ugh, that was bad of us.

Yes :-)

> 
>> ...
>> The patch adds an __attribute__((aligned(8))) to the
>> taskstats structure members so that 32 bit applications using taskstats
>> can work with a 64 bit kernel.
> 
> But there might be 32-bit applications out there which are using the
> present wrong structure?
> 
> otoh, I assume that those applications would be using taskstats.h and would
> hence encounter this bug and we would have heard about it, is that correct?
> 

Yes, correct.

> otoh^2, 32-bit applications running under 32-bit kernels will presently be
> functioning correctly, and your change will require that those applications
> be recompiled, I think?
> 

Yes, correct. They would be broken with this fix. We could  bump up the
version TASKSTATS_VERSION to 4. Would you like a new patch the version
bumped up?

> 
> This patch looks like 2.6.20 and 2.6.21 material, but very carefully...

Yes, 2.6.20 and 2.6.21 sound correct.

-- 
	Warm Regards,
	Balbir Singh
	Linux Technology Center
	IBM, ISTL

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

* Re: [PATCH -mm] Taskstats fix the structure members alignment issue
  2007-04-21 12:59   ` Balbir Singh
@ 2007-04-21 19:33     ` Andrew Morton
  2007-04-22  5:00       ` Balbir Singh
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2007-04-21 19:33 UTC (permalink / raw)
  To: balbir; +Cc: Balbir Singh, nagar, jlan, linux-kernel

On Sat, 21 Apr 2007 18:29:21 +0530 Balbir Singh <balbir@linux.vnet.ibm.com> wrote:

> >> The patch adds an __attribute__((aligned(8))) to the
> >> taskstats structure members so that 32 bit applications using taskstats
> >> can work with a 64 bit kernel.
> > 
> > But there might be 32-bit applications out there which are using the
> > present wrong structure?
> > 
> > otoh, I assume that those applications would be using taskstats.h and would
> > hence encounter this bug and we would have heard about it, is that correct?
> > 
> 
> Yes, correct.
> 
> > otoh^2, 32-bit applications running under 32-bit kernels will presently be
> > functioning correctly, and your change will require that those applications
> > be recompiled, I think?
> > 
> 
> Yes, correct. They would be broken with this fix. We could  bump up the
> version TASKSTATS_VERSION to 4. Would you like a new patch the version
> bumped up?

I can do that.

> > 
> > This patch looks like 2.6.20 and 2.6.21 material, but very carefully...
> 
> Yes, 2.6.20 and 2.6.21 sound correct.

OK.  I guess we have little choice but to slam it in asap, with a 2.6.20.x backport
before too many people start using the old interface.

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

* Re: [PATCH -mm] Taskstats fix the structure members alignment issue
  2007-04-21 19:33     ` Andrew Morton
@ 2007-04-22  5:00       ` Balbir Singh
  0 siblings, 0 replies; 5+ messages in thread
From: Balbir Singh @ 2007-04-22  5:00 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Balbir Singh, nagar, jlan, linux-kernel

Andrew Morton wrote:
> On Sat, 21 Apr 2007 18:29:21 +0530 Balbir Singh <balbir@linux.vnet.ibm.com> wrote:
> 
>>>> The patch adds an __attribute__((aligned(8))) to the
>>>> taskstats structure members so that 32 bit applications using taskstats
>>>> can work with a 64 bit kernel.
>>> But there might be 32-bit applications out there which are using the
>>> present wrong structure?
>>>
>>> otoh, I assume that those applications would be using taskstats.h and would
>>> hence encounter this bug and we would have heard about it, is that correct?
>>>
>> Yes, correct.
>>
>>> otoh^2, 32-bit applications running under 32-bit kernels will presently be
>>> functioning correctly, and your change will require that those applications
>>> be recompiled, I think?
>>>
>> Yes, correct. They would be broken with this fix. We could  bump up the
>> version TASKSTATS_VERSION to 4. Would you like a new patch the version
>> bumped up?
> 
> I can do that.

Thanks

> 
>>> This patch looks like 2.6.20 and 2.6.21 material, but very carefully...
>> Yes, 2.6.20 and 2.6.21 sound correct.
> 
> OK.  I guess we have little choice but to slam it in asap, with a 2.6.20.x backport
> before too many people start using the old interface.

Thanks, again!

-- 
	Balbir Singh
	Linux Technology Center
	IBM, ISTL

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

end of thread, other threads:[~2007-04-22  5:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-20 16:43 [PATCH -mm] Taskstats fix the structure members alignment issue Balbir Singh
2007-04-20 19:15 ` Andrew Morton
2007-04-21 12:59   ` Balbir Singh
2007-04-21 19:33     ` Andrew Morton
2007-04-22  5:00       ` Balbir Singh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox