68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
/* This used to ICE due to a backend problem on s390. */
|
|
|
|
/* { dg-do compile } */
|
|
/* { dg-options "-O1 -mpacked-stack" } */
|
|
|
|
typedef unsigned int __u32;
|
|
typedef struct
|
|
{
|
|
volatile int counter;
|
|
} __attribute__ ((aligned (4))) atomic_t;
|
|
static __inline__ __attribute__ ((always_inline))
|
|
void atomic_inc (volatile atomic_t * v)
|
|
{
|
|
(
|
|
{
|
|
typeof (v->counter) old_val, new_val;
|
|
__asm__ __volatile__ (
|
|
" l %0,0(%3)\n"
|
|
"0: lr %1,%0\n"
|
|
" ar %1,%4\n"
|
|
" cs %0,%1,0(%3)\n"
|
|
" jl 0b":
|
|
"=&d" (old_val), "=&d" (new_val), "=m" (((atomic_t *) (v))->counter):
|
|
"a" (v), "d" (1), "m" (((atomic_t *) (v))->counter):
|
|
"cc", "memory");
|
|
});
|
|
}
|
|
extern unsigned long volatile __attribute__ ((section (".data"))) jiffies;
|
|
struct inet_peer
|
|
{
|
|
unsigned long dtime;
|
|
atomic_t refcnt;
|
|
};
|
|
static volatile int peer_total;
|
|
int inet_peer_threshold = 65536 + 128;
|
|
int inet_peer_minttl = 120 * 100;
|
|
int inet_peer_maxttl = 10 * 60 * 100;
|
|
static int
|
|
cleanup_once (unsigned long ttl)
|
|
{
|
|
struct inet_peer *p;
|
|
if (p != ((void *) 0))
|
|
{
|
|
if (((
|
|
{
|
|
1;}
|
|
) && ((long) (jiffies) - (long) (p->dtime + ttl) < 0)))
|
|
{
|
|
return -1;
|
|
}
|
|
atomic_inc (&p->refcnt);
|
|
}
|
|
}
|
|
struct inet_peer *
|
|
inet_getpeer (__u32 daddr, int create)
|
|
{
|
|
int i;
|
|
int ttl;
|
|
if (peer_total >= inet_peer_threshold)
|
|
ttl = inet_peer_minttl;
|
|
else
|
|
ttl =
|
|
inet_peer_maxttl - (inet_peer_maxttl -
|
|
inet_peer_minttl) / 100 * peer_total /
|
|
inet_peer_threshold * 100;
|
|
for (i = 0; i < 30 && !cleanup_once (ttl); i++);
|
|
}
|