diff options
Diffstat (limited to 'mm/slab.c')
| -rw-r--r-- | mm/slab.c | 27 |
1 files changed, 13 insertions, 14 deletions
| @@ -207,11 +207,6 @@ typedef unsigned int kmem_bufctl_t; | |||
| 207 | #define BUFCTL_ACTIVE (((kmem_bufctl_t)(~0U))-2) | 207 | #define BUFCTL_ACTIVE (((kmem_bufctl_t)(~0U))-2) |
| 208 | #define SLAB_LIMIT (((kmem_bufctl_t)(~0U))-3) | 208 | #define SLAB_LIMIT (((kmem_bufctl_t)(~0U))-3) |
| 209 | 209 | ||
| 210 | /* Max number of objs-per-slab for caches which use off-slab slabs. | ||
| 211 | * Needed to avoid a possible looping condition in cache_grow(). | ||
| 212 | */ | ||
| 213 | static unsigned long offslab_limit; | ||
| 214 | |||
| 215 | /* | 210 | /* |
| 216 | * struct slab | 211 | * struct slab |
| 217 | * | 212 | * |
| @@ -1356,12 +1351,6 @@ void __init kmem_cache_init(void) | |||
| 1356 | NULL, NULL); | 1351 | NULL, NULL); |
| 1357 | } | 1352 | } |
| 1358 | 1353 | ||
| 1359 | /* Inc off-slab bufctl limit until the ceiling is hit. */ | ||
| 1360 | if (!(OFF_SLAB(sizes->cs_cachep))) { | ||
| 1361 | offslab_limit = sizes->cs_size - sizeof(struct slab); | ||
| 1362 | offslab_limit /= sizeof(kmem_bufctl_t); | ||
| 1363 | } | ||
| 1364 | |||
| 1365 | sizes->cs_dmacachep = kmem_cache_create(names->name_dma, | 1354 | sizes->cs_dmacachep = kmem_cache_create(names->name_dma, |
| 1366 | sizes->cs_size, | 1355 | sizes->cs_size, |
| 1367 | ARCH_KMALLOC_MINALIGN, | 1356 | ARCH_KMALLOC_MINALIGN, |
| @@ -1780,6 +1769,7 @@ static void set_up_list3s(struct kmem_cache *cachep, int index) | |||
| 1780 | static size_t calculate_slab_order(struct kmem_cache *cachep, | 1769 | static size_t calculate_slab_order(struct kmem_cache *cachep, |
| 1781 | size_t size, size_t align, unsigned long flags) | 1770 | size_t size, size_t align, unsigned long flags) |
| 1782 | { | 1771 | { |
| 1772 | unsigned long offslab_limit; | ||
| 1783 | size_t left_over = 0; | 1773 | size_t left_over = 0; |
| 1784 | int gfporder; | 1774 | int gfporder; |
| 1785 | 1775 | ||
| @@ -1791,9 +1781,18 @@ static size_t calculate_slab_order(struct kmem_cache *cachep, | |||
| 1791 | if (!num) | 1781 | if (!num) |
| 1792 | continue; | 1782 | continue; |
| 1793 | 1783 | ||
| 1794 | /* More than offslab_limit objects will cause problems */ | 1784 | if (flags & CFLGS_OFF_SLAB) { |
| 1795 | if ((flags & CFLGS_OFF_SLAB) && num > offslab_limit) | 1785 | /* |
| 1796 | break; | 1786 | * Max number of objs-per-slab for caches which |
| 1787 | * use off-slab slabs. Needed to avoid a possible | ||
| 1788 | * looping condition in cache_grow(). | ||
| 1789 | */ | ||
| 1790 | offslab_limit = size - sizeof(struct slab); | ||
| 1791 | offslab_limit /= sizeof(kmem_bufctl_t); | ||
| 1792 | |||
| 1793 | if (num > offslab_limit) | ||
| 1794 | break; | ||
| 1795 | } | ||
| 1797 | 1796 | ||
| 1798 | /* Found something acceptable - save it away */ | 1797 | /* Found something acceptable - save it away */ |
| 1799 | cachep->num = num; | 1798 | cachep->num = num; |
