Commit 9d3488a8 authored by Andrew Morton's avatar Andrew Morton Committed by Dave Jones

[PATCH] POSIX timers interface long/int cleanup

From: Eric Piel <Eric.Piel@Bull.Net>

Fixes some long/int confusion on 64-bit machines which was causing failures
on ia64 - we end up trying to set bits in the 32-63 range on an int and the
kernel locks up.

Also cleans up idr.h.

George has acked this change.
parent a3fa4e81
......@@ -13,40 +13,44 @@
#define RESERVED_ID_BITS 8
#if BITS_PER_LONG == 32
#define IDR_BITS 5
#define IDR_FULL 0xffffffff
#if BITS_PER_LONG == 32
# define IDR_BITS 5
# define IDR_FULL 0xffffffff
#elif BITS_PER_LONG == 64
#define IDR_BITS 6
#define IDR_FULL 0xffffffffffffffff
# define IDR_BITS 6
# define IDR_FULL 0xffffffffffffffff
#else
#error "BITS_PER_LONG is not 32 or 64"
# error "BITS_PER_LONG is not 32 or 64"
#endif
#define IDR_MASK ((1 << IDR_BITS)-1)
/* Leave the possibility of an incomplete final layer */
#define MAX_LEVEL (BITS_PER_LONG - RESERVED_ID_BITS + IDR_BITS - 1) / IDR_BITS
#define MAX_ID_SHIFT (BITS_PER_LONG - RESERVED_ID_BITS)
#define MAX_ID_BIT (1L << MAX_ID_SHIFT)
/* Define the size of the id's */
#define BITS_PER_INT (sizeof(int)*8)
#define MAX_ID_SHIFT (BITS_PER_INT - RESERVED_ID_BITS)
#define MAX_ID_BIT (1 << MAX_ID_SHIFT)
#define MAX_ID_MASK (MAX_ID_BIT - 1)
/* Leave the possibility of an incomplete final layer */
#define MAX_LEVEL (MAX_ID_SHIFT + IDR_BITS - 1) / IDR_BITS
/* Number of id_layer structs to leave in free list */
#define IDR_FREE_MAX MAX_LEVEL + MAX_LEVEL
struct idr_layer {
unsigned long bitmap; // A zero bit means "space here"
int count; // When zero, we can release it
struct idr_layer *ary[1<<IDR_BITS];
unsigned long bitmap; /* A zero bit means "space here" */
struct idr_layer *ary[1<<IDR_BITS];
int count; /* When zero, we can release it */
};
struct idr {
struct idr_layer *top;
int layers;
long count;
struct idr_layer *id_free;
int id_free_cnt;
spinlock_t lock;
long count;
int layers;
int id_free_cnt;
spinlock_t lock;
};
/*
......
......@@ -150,7 +150,7 @@ EXPORT_SYMBOL(idr_pre_get);
static inline int sub_alloc(struct idr *idp, int shift, void *ptr)
{
long n, v = 0;
int n, v = 0;
struct idr_layer *p;
struct idr_layer **pa[MAX_LEVEL];
struct idr_layer ***paa = &pa[0];
......@@ -211,7 +211,7 @@ static inline int sub_alloc(struct idr *idp, int shift, void *ptr)
int idr_get_new(struct idr *idp, void *ptr)
{
long v;
int v;
if (idp->id_free_cnt < idp->layers + 1)
return (-1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment