klist.c: bit 0 in pointer can't be used as flag

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Monday, January 26, 2009 - 12:05 pm

Gitweb:     http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c0e69a...
Commit:     c0e69a5bbc6fc74184aa043aadb9a53bc58f953b
Parent:     8adb711f3668b034e7b956fac951ed08b53e0d55
Author:     Jesper Nilsson <Jesper.Nilsson@axis.com>
AuthorDate: Wed Jan 14 11:19:08 2009 +0100
Committer:  Greg Kroah-Hartman <gregkh@suse.de>
CommitDate: Tue Jan 20 20:52:10 2009 -0800

    klist.c: bit 0 in pointer can't be used as flag
    
    The commit a1ed5b0cffe4b16a93a6a3390e8cee0fbef94f86
    (klist: don't iterate over deleted entries) introduces use of the
    low bit in a pointer to indicate if the knode is dead or not,
    assuming that this bit is always free.
    
    This is not true for all architectures, CRIS for example may align data
    on byte borders.
    
    The result is a bunch of warnings on bootup, devices not being
    added correctly etc, reported by Hinko Kocevar <hinko.kocevar@cetrtapot.si>:
    
    ------------[ cut here ]------------
    WARNING: at lib/klist.c:62 ()
    Modules linked in:
    
    Stack from c1fe1cf0:
           c01cc7f4 c1fe1d11 c000eb4e c000e4de 00000000 00000000 c1f4f78f c1f50c2d
           c01d008c c1fdd1a0 c1fdd1a0 c1fe1d38 c0192954 c1fe0000 00000000 c1fe1dc0
           00000002 7fffffff c1fe1da8 c0192d50 c1fe1dc0 00000002 7fffffff c1ff9fcc
    Call Trace: [<c000eb4e>] [<c000e4de>] [<c0192954>] [<c0192d50>] [<c001d49e>] [<c000b688>] [<c0192a3c>]
           [<c000b63e>] [<c000b63e>] [<c001a542>] [<c00b55b0>] [<c00411c0>] [<c00b559c>] [<c01918e6>] [<c0191988>]
           [<c01919d0>] [<c00cd9c8>] [<c00cdd6a>] [<c0034178>] [<c000409a>] [<c0015576>] [<c0029130>] [<c0029078>]
           [<c0029170>] [<c0012336>] [<c00b4076>] [<c00b4770>] [<c006d6e4>] [<c006d974>] [<c006dca0>] [<c0028d6c>]
           [<c0028e12>] [<c0006424>] <4>---[ end trace 4eaa2a86a8e2da22 ]---
    ------------[ cut here ]------------
    Repeat ad nauseam.
    
    Wed, Jan 14, 2009 at 12:11:32AM +0100, Bastien ROUCARIES wrote:
    > Perhaps using a pointerhackalign trick on this structure where
    > #define pointerhackalign(x) __attribute__ ((aligned (x)))
    > and declare
    > struct klist_node {
    > ...
    > }  pointerhackalign(2);
    >
    > Because  __attribute__ ((aligned (x))) could only increase alignment
    > it will safe to do that and serve as documentation purpose :)
    
    That works, but we need to do it not for the struct klist_node,
    but for the struct we insert into the void * in klist_node,
    which is struct klist.
    
    Reported-by: Hinko Kocevar <hinko.kocevar@cetrtapot.si
    Cc: Bastien ROUCARIES <roucaries.bastien@gmail.com>
    Signed-off-by: Jesper Nilsson <jesper.nilsson@axis.com>
    Cc: stable <stable@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 include/linux/klist.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/linux/klist.h b/include/linux/klist.h
index d5a27af..e91a4e5 100644
--- a/include/linux/klist.h
+++ b/include/linux/klist.h
@@ -22,7 +22,7 @@ struct klist {
 	struct list_head	k_list;
 	void			(*get)(struct klist_node *);
 	void			(*put)(struct klist_node *);
-};
+} __attribute__ ((aligned (4)));
 
 #define KLIST_INIT(_name, _get, _put)					\
 	{ .k_lock	= __SPIN_LOCK_UNLOCKED(_name.k_lock),		\
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
klist.c: bit 0 in pointer can't be used as flag, Linux Kernel Mailing ..., (Mon Jan 26, 12:05 pm)