[NET]: reduce sizeof(struct inet_peer), cleanup, change in peer_check_expire()
1) shrink struct inet_peer on 64 bits platforms.
This commit is contained in:
committed by
David S. Miller
parent
ea614d7f4f
commit
4663afe2c8
@@ -19,7 +19,7 @@ struct inet_peer
|
|||||||
{
|
{
|
||||||
struct inet_peer *avl_left, *avl_right;
|
struct inet_peer *avl_left, *avl_right;
|
||||||
struct inet_peer *unused_next, **unused_prevp;
|
struct inet_peer *unused_next, **unused_prevp;
|
||||||
unsigned long dtime; /* the time of last use of not
|
__u32 dtime; /* the time of last use of not
|
||||||
* referenced entries */
|
* referenced entries */
|
||||||
atomic_t refcnt;
|
atomic_t refcnt;
|
||||||
__be32 v4daddr; /* peer's address */
|
__be32 v4daddr; /* peer's address */
|
||||||
@@ -35,21 +35,8 @@ void inet_initpeers(void) __init;
|
|||||||
/* can be called with or without local BH being disabled */
|
/* can be called with or without local BH being disabled */
|
||||||
struct inet_peer *inet_getpeer(__be32 daddr, int create);
|
struct inet_peer *inet_getpeer(__be32 daddr, int create);
|
||||||
|
|
||||||
extern spinlock_t inet_peer_unused_lock;
|
|
||||||
extern struct inet_peer **inet_peer_unused_tailp;
|
|
||||||
/* can be called from BH context or outside */
|
/* can be called from BH context or outside */
|
||||||
static inline void inet_putpeer(struct inet_peer *p)
|
extern void inet_putpeer(struct inet_peer *p);
|
||||||
{
|
|
||||||
spin_lock_bh(&inet_peer_unused_lock);
|
|
||||||
if (atomic_dec_and_test(&p->refcnt)) {
|
|
||||||
p->unused_prevp = inet_peer_unused_tailp;
|
|
||||||
p->unused_next = NULL;
|
|
||||||
*inet_peer_unused_tailp = p;
|
|
||||||
inet_peer_unused_tailp = &p->unused_next;
|
|
||||||
p->dtime = jiffies;
|
|
||||||
}
|
|
||||||
spin_unlock_bh(&inet_peer_unused_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern spinlock_t inet_peer_idlock;
|
extern spinlock_t inet_peer_idlock;
|
||||||
/* can be called with or without local BH being disabled */
|
/* can be called with or without local BH being disabled */
|
||||||
|
@@ -94,10 +94,8 @@ int inet_peer_minttl = 120 * HZ; /* TTL under high load: 120 sec */
|
|||||||
int inet_peer_maxttl = 10 * 60 * HZ; /* usual time to live: 10 min */
|
int inet_peer_maxttl = 10 * 60 * HZ; /* usual time to live: 10 min */
|
||||||
|
|
||||||
static struct inet_peer *inet_peer_unused_head;
|
static struct inet_peer *inet_peer_unused_head;
|
||||||
/* Exported for inet_putpeer inline function. */
|
static struct inet_peer **inet_peer_unused_tailp = &inet_peer_unused_head;
|
||||||
struct inet_peer **inet_peer_unused_tailp = &inet_peer_unused_head;
|
static DEFINE_SPINLOCK(inet_peer_unused_lock);
|
||||||
DEFINE_SPINLOCK(inet_peer_unused_lock);
|
|
||||||
#define PEER_MAX_CLEANUP_WORK 30
|
|
||||||
|
|
||||||
static void peer_check_expire(unsigned long dummy);
|
static void peer_check_expire(unsigned long dummy);
|
||||||
static DEFINE_TIMER(peer_periodic_timer, peer_check_expire, 0, 0);
|
static DEFINE_TIMER(peer_periodic_timer, peer_check_expire, 0, 0);
|
||||||
@@ -340,7 +338,8 @@ static int cleanup_once(unsigned long ttl)
|
|||||||
spin_lock_bh(&inet_peer_unused_lock);
|
spin_lock_bh(&inet_peer_unused_lock);
|
||||||
p = inet_peer_unused_head;
|
p = inet_peer_unused_head;
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
if (time_after(p->dtime + ttl, jiffies)) {
|
__u32 delta = (__u32)jiffies - p->dtime;
|
||||||
|
if (delta < ttl) {
|
||||||
/* Do not prune fresh entries. */
|
/* Do not prune fresh entries. */
|
||||||
spin_unlock_bh(&inet_peer_unused_lock);
|
spin_unlock_bh(&inet_peer_unused_lock);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -432,7 +431,7 @@ out_free:
|
|||||||
/* Called with local BH disabled. */
|
/* Called with local BH disabled. */
|
||||||
static void peer_check_expire(unsigned long dummy)
|
static void peer_check_expire(unsigned long dummy)
|
||||||
{
|
{
|
||||||
int i;
|
unsigned long now = jiffies;
|
||||||
int ttl;
|
int ttl;
|
||||||
|
|
||||||
if (peer_total >= inet_peer_threshold)
|
if (peer_total >= inet_peer_threshold)
|
||||||
@@ -441,7 +440,10 @@ static void peer_check_expire(unsigned long dummy)
|
|||||||
ttl = inet_peer_maxttl
|
ttl = inet_peer_maxttl
|
||||||
- (inet_peer_maxttl - inet_peer_minttl) / HZ *
|
- (inet_peer_maxttl - inet_peer_minttl) / HZ *
|
||||||
peer_total / inet_peer_threshold * HZ;
|
peer_total / inet_peer_threshold * HZ;
|
||||||
for (i = 0; i < PEER_MAX_CLEANUP_WORK && !cleanup_once(ttl); i++);
|
while (!cleanup_once(ttl)) {
|
||||||
|
if (jiffies != now)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Trigger the timer after inet_peer_gc_mintime .. inet_peer_gc_maxtime
|
/* Trigger the timer after inet_peer_gc_mintime .. inet_peer_gc_maxtime
|
||||||
* interval depending on the total number of entries (more entries,
|
* interval depending on the total number of entries (more entries,
|
||||||
@@ -455,3 +457,16 @@ static void peer_check_expire(unsigned long dummy)
|
|||||||
peer_total / inet_peer_threshold * HZ;
|
peer_total / inet_peer_threshold * HZ;
|
||||||
add_timer(&peer_periodic_timer);
|
add_timer(&peer_periodic_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void inet_putpeer(struct inet_peer *p)
|
||||||
|
{
|
||||||
|
spin_lock_bh(&inet_peer_unused_lock);
|
||||||
|
if (atomic_dec_and_test(&p->refcnt)) {
|
||||||
|
p->unused_prevp = inet_peer_unused_tailp;
|
||||||
|
p->unused_next = NULL;
|
||||||
|
*inet_peer_unused_tailp = p;
|
||||||
|
inet_peer_unused_tailp = &p->unused_next;
|
||||||
|
p->dtime = (__u32)jiffies;
|
||||||
|
}
|
||||||
|
spin_unlock_bh(&inet_peer_unused_lock);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user