Mercurial > hg > nginx
annotate src/os/unix/ngx_sunpro_atomic_sparc64.h @ 7669:52b34c3f89b4
Too large st_blocks values are now ignored (ticket #157).
With XFS, using "allocsize=64m" mount option results in large preallocation
being reported in the st_blocks as returned by fstat() till the file is
closed. This in turn results in incorrect cache size calculations and
wrong clearing based on max_size.
To avoid too aggressive cache clearing on such volumes, st_blocks values
which result in sizes larger than st_size and eight blocks (an arbitrary
limit) are no longer trusted, and we use st_size instead.
The ngx_de_fs_size() counterpart is intentionally not modified, as
it is used on closed files and hence not affected by this problem.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 22 Jun 2020 18:02:59 +0300 |
parents | d620f497c50f |
children |
rev | line source |
---|---|
561 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
561 | 5 */ |
6 | |
7 | |
8 #if (NGX_PTR_SIZE == 4) | |
9 #define NGX_CASA ngx_casa | |
10 #else | |
11 #define NGX_CASA ngx_casxa | |
12 #endif | |
13 | |
14 | |
15 ngx_atomic_uint_t | |
16 ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); | |
17 | |
18 ngx_atomic_uint_t | |
19 ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); | |
20 | |
21 /* the code in src/os/unix/ngx_sunpro_sparc64.il */ | |
22 | |
23 | |
24 static ngx_inline ngx_atomic_uint_t | |
25 ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, | |
26 ngx_atomic_uint_t set) | |
27 { | |
1186
c114defa4518
fix atomic operations on sparc64 built by SunPro C
Igor Sysoev <igor@sysoev.ru>
parents:
611
diff
changeset
|
28 set = NGX_CASA(set, old, lock); |
561 | 29 |
30 return (set == old); | |
577 | 31 } |
561 | 32 |
33 | |
34 static ngx_inline ngx_atomic_int_t | |
35 ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) | |
36 { | |
37 ngx_atomic_uint_t old, res; | |
38 | |
39 old = *value; | |
40 | |
41 for ( ;; ) { | |
42 | |
43 res = old + add; | |
44 | |
1186
c114defa4518
fix atomic operations on sparc64 built by SunPro C
Igor Sysoev <igor@sysoev.ru>
parents:
611
diff
changeset
|
45 res = NGX_CASA(res, old, value); |
561 | 46 |
47 if (res == old) { | |
48 return res; | |
49 } | |
50 | |
51 old = res; | |
52 } | |
53 } | |
563 | 54 |
55 | |
56 #define ngx_memory_barrier() \ | |
57 __asm (".volatile"); \ | |
58 __asm ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad"); \ | |
59 __asm (".nonvolatile") | |
611 | 60 |
61 #define ngx_cpu_pause() |