Skip to content

Commit

Permalink
[PATCH] avoid unaligned access when accessing poll stack
Browse files Browse the repository at this point in the history
Commit 70674f9:

  [PATCH] Optimize select/poll by putting small data sets on the stack

resulted in the poll stack being 4-byte aligned on 64-bit architectures,
causing misaligned accesses to elements in the array.

This patch fixes it by declaring the stack in terms of 'long' instead
of 'char'.

Force alignment of poll and select stacks to long to avoid unaligned
access on 64 bit architectures.

Signed-off-by: Jes Sorensen <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Jes Sorensen authored and Linus Torvalds committed Mar 31, 2006
1 parent d21c356 commit 30c14e4
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions fs/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ static int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
int ret, size, max_fdset;
struct fdtable *fdt;
/* Allocate small arguments on the stack to save memory and be faster */
char stack_fds[SELECT_STACK_ALLOC];
long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];

ret = -EINVAL;
if (n < 0)
Expand Down Expand Up @@ -639,8 +639,10 @@ int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, s64 *timeout)
struct poll_list *walk;
struct fdtable *fdt;
int max_fdset;
/* Allocate small arguments on the stack to save memory and be faster */
char stack_pps[POLL_STACK_ALLOC];
/* Allocate small arguments on the stack to save memory and be
faster - use long to make sure the buffer is aligned properly
on 64 bit archs to avoid unaligned access */
long stack_pps[POLL_STACK_ALLOC/sizeof(long)];
struct poll_list *stack_pp = NULL;

/* Do a sanity check on nfds ... */
Expand Down

0 comments on commit 30c14e4

Please sign in to comment.