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
...@@ -14,37 +14,41 @@ ...@@ -14,37 +14,41 @@
#define RESERVED_ID_BITS 8 #define RESERVED_ID_BITS 8
#if BITS_PER_LONG == 32 #if BITS_PER_LONG == 32
#define IDR_BITS 5 # define IDR_BITS 5
#define IDR_FULL 0xffffffff # define IDR_FULL 0xffffffff
#elif BITS_PER_LONG == 64 #elif BITS_PER_LONG == 64
#define IDR_BITS 6 # define IDR_BITS 6
#define IDR_FULL 0xffffffffffffffff # define IDR_FULL 0xffffffffffffffff
#else #else
#error "BITS_PER_LONG is not 32 or 64" # error "BITS_PER_LONG is not 32 or 64"
#endif #endif
#define IDR_MASK ((1 << IDR_BITS)-1) #define IDR_MASK ((1 << IDR_BITS)-1)
/* Leave the possibility of an incomplete final layer */ /* Define the size of the id's */
#define MAX_LEVEL (BITS_PER_LONG - RESERVED_ID_BITS + IDR_BITS - 1) / IDR_BITS #define BITS_PER_INT (sizeof(int)*8)
#define MAX_ID_SHIFT (BITS_PER_LONG - RESERVED_ID_BITS)
#define MAX_ID_BIT (1L << MAX_ID_SHIFT) #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) #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 */ /* Number of id_layer structs to leave in free list */
#define IDR_FREE_MAX MAX_LEVEL + MAX_LEVEL #define IDR_FREE_MAX MAX_LEVEL + MAX_LEVEL
struct idr_layer { struct idr_layer {
unsigned long bitmap; // A zero bit means "space here" unsigned long bitmap; /* A zero bit means "space here" */
int count; // When zero, we can release it
struct idr_layer *ary[1<<IDR_BITS]; struct idr_layer *ary[1<<IDR_BITS];
int count; /* When zero, we can release it */
}; };
struct idr { struct idr {
struct idr_layer *top; struct idr_layer *top;
int layers;
long count;
struct idr_layer *id_free; struct idr_layer *id_free;
long count;
int layers;
int id_free_cnt; int id_free_cnt;
spinlock_t lock; spinlock_t lock;
}; };
......
...@@ -150,7 +150,7 @@ EXPORT_SYMBOL(idr_pre_get); ...@@ -150,7 +150,7 @@ EXPORT_SYMBOL(idr_pre_get);
static inline int sub_alloc(struct idr *idp, int shift, void *ptr) 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 *p;
struct idr_layer **pa[MAX_LEVEL]; struct idr_layer **pa[MAX_LEVEL];
struct idr_layer ***paa = &pa[0]; struct idr_layer ***paa = &pa[0];
...@@ -211,7 +211,7 @@ static inline int sub_alloc(struct idr *idp, int shift, void *ptr) ...@@ -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) int idr_get_new(struct idr *idp, void *ptr)
{ {
long v; int v;
if (idp->id_free_cnt < idp->layers + 1) if (idp->id_free_cnt < idp->layers + 1)
return (-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