|
@@ -205,6 +205,11 @@ static inline void ClearSlabDebug(struct page *page)
|
|
|
#define ARCH_SLAB_MINALIGN __alignof__(unsigned long long)
|
|
|
#endif
|
|
|
|
|
|
+/*
|
|
|
+ * The page->inuse field is 16 bit thus we have this limitation
|
|
|
+ */
|
|
|
+#define MAX_OBJECTS_PER_SLAB 65535
|
|
|
+
|
|
|
/* Internal SLUB flags */
|
|
|
#define __OBJECT_POISON 0x80000000 /* Poison object */
|
|
|
|
|
@@ -1736,8 +1741,17 @@ static inline int slab_order(int size, int min_objects,
|
|
|
{
|
|
|
int order;
|
|
|
int rem;
|
|
|
+ int min_order = slub_min_order;
|
|
|
|
|
|
- for (order = max(slub_min_order,
|
|
|
+ /*
|
|
|
+ * If we would create too many object per slab then reduce
|
|
|
+ * the slab order even if it goes below slub_min_order.
|
|
|
+ */
|
|
|
+ while (min_order > 0 &&
|
|
|
+ (PAGE_SIZE << min_order) >= MAX_OBJECTS_PER_SLAB * size)
|
|
|
+ min_order--;
|
|
|
+
|
|
|
+ for (order = max(min_order,
|
|
|
fls(min_objects * size - 1) - PAGE_SHIFT);
|
|
|
order <= max_order; order++) {
|
|
|
|
|
@@ -1751,6 +1765,9 @@ static inline int slab_order(int size, int min_objects,
|
|
|
if (rem <= slab_size / fract_leftover)
|
|
|
break;
|
|
|
|
|
|
+ /* If the next size is too high then exit now */
|
|
|
+ if (slab_size * 2 >= MAX_OBJECTS_PER_SLAB * size)
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
return order;
|
|
@@ -2037,7 +2054,7 @@ static int calculate_sizes(struct kmem_cache *s)
|
|
|
* The page->inuse field is only 16 bit wide! So we cannot have
|
|
|
* more than 64k objects per slab.
|
|
|
*/
|
|
|
- if (!s->objects || s->objects > 65535)
|
|
|
+ if (!s->objects || s->objects > MAX_OBJECTS_PER_SLAB)
|
|
|
return 0;
|
|
|
return 1;
|
|
|
|