----- Original Message -----
----- Original Message -----
>
> Hi Dave
>
> I found a problem with the net -s command. It concerns line 1451 in net.c
>
> struct_socket = inode - SIZE(socket);
>
> As I understand it we have the type
>
> struct socket_alloc {
> struct socket socket;
> struct inode vfs_inode;
> }
>
> and we have the address of the second field and want the address of
> the first. The calculation, using the size of the socket struct,
> used in net.c require that the second field is aligned directly
> after the first field. This is unfortunately not true in cases I
> have seen. By changing the line 1451 to:
>
> struct_socket = inode - MEMBER_OFFSET("socket_alloc",
"vfs_inode");
>
> things work better.
>
> Is this something you would like to change in Crash? I assume you
> will move the offset calculation to somewhere else so it is only
> performed once.
Probably so...
Although I'm curious -- what kernel version do you see this on?
It works as expected on RHEL5, RHEL6 and a Fedora 16 3.1.7-based
kernel. What do you see when you do this:
crash> socket_alloc -o
struct socket_alloc {
[0] struct socket socket;
[48] struct inode vfs_inode;
}
SIZE: 616
crash> socket
struct socket {
socket_state state;
short int type;
long unsigned int flags;
struct socket_wq *wq;
struct file *file;
struct sock *sk;
const struct proto_ops *ops;
}
SIZE: 48
crash>
And just for the changelog description, what havoc does it wreak?
Thanks,
Dave
Interesing -- I see the problem with the 3 sample ARM dumpfiles I have
on hand. I would have thought the same issue would be seen with
a 32-bit x86, but it looks like it's an ARM compiler issue?
Check this comparison -- while the inode structure is different in
these two kernels, the socket structure is the same:
X86: ARM:
crash> socket_alloc -o crash> socket_alloc -o
struct socket_alloc { struct socket_alloc {
[0] struct socket socket; [0] struct socket socket;
[28] struct inode vfs_inode; [32] struct inode vfs_inode;
} }
SIZE: 388 SIZE: 584
crash> socket -o crash> socket -o
struct socket { struct socket {
[0] socket_state state; [0] socket_state state;
[4] short int type; [4] short int type;
[8] long unsigned int flags; [8] long unsigned int flags;
[12] struct socket_wq *wq; [12] struct socket_wq *wq;
[16] struct file *file; [16] struct file *file;
[20] struct sock *sk; [20] struct sock *sk;
[24] const struct proto_ops *ops; [24] const struct proto_ops *ops;
} }
SIZE: 28 SIZE: 28
crash> crash>
But for whatever reason, the ARM kernel pushes the vfs_inode to
offset 32 even though the preceding socket structure is 28 bytes long.
Anyway, using the offset instead of the size is a better idea, so I'll
make that change.
Although -- my sample ARM dumpfiles don't have any tasks with open sockets,
so I still am interested in seeing what the failure looks like for the
changelog entry.
Thanks,
Dave