mm/zsmalloc: remove unnecessary check
Subsystems (2)
RFC PATCH 1/1 mm/zsmalloc: remove unnecessary check
ZS_SIZE_CLASSES is calc by:
((ZS_MAX_ALLOC_SIZE - ZS_MIN_ALLOC_SIZE) / ZS_SIZE_CLASS_DELTA + 1)
So when i is in [0, ZS_SIZE_CLASSES - 1), the size:
size = ZS_MIN_ALLOC_SIZE + i * ZS_SIZE_CLASS_DELTA
will not be greater than ZS_MAX_ALLOC_SIZE
This patch removes the unnecessary check.
--- mm/zsmalloc.c | 2 -- 1 file changed, 2 deletions(-)
mm/zsmalloc.c +0 -2
@@ -973,8 +973,6 @@ struct zs_pool *zs_create_pool(gfp_t flags)struct size_class *prev_class; size =ZS_MIN_ALLOC_SIZE + i *ZS_SIZE_CLASS_DELTA ; -if (size >ZS_MAX_ALLOC_SIZE ) - size =ZS_MAX_ALLOC_SIZE ; pages_per_zspage =get_pages_per_zspage (size);/*
Signature · 7 lines
1.7.9.5 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Minchan Kim
maintainerQuoted 8 lines · Mahendran Ganesh
ZS_SIZE_CLASSESis calc by:
((ZS_MAX_ALLOC_SIZE-ZS_MIN_ALLOC_SIZE) /ZS_SIZE_CLASS_DELTA+ 1)So when i is in [0,
ZS_SIZE_CLASSES- 1), the size:
size =ZS_MIN_ALLOC_SIZE+ i *ZS_SIZE_CLASS_DELTA
will not be greater thanZS_MAX_ALLOC_SIZEThis patch removes the unnecessary check.
It depends on ZS_MIN_ALLOC_SIZE.
For example, we would change min to 8 but MAX is still 4096. ZS_SIZE_CLASSES is (4096 - 8) / 16 + 1 = 256 so 8 + 255 * 16 = 4088, which exceeds the max.
Quoted 27 lines
Signed-off-by Mahendran Ganesh <[email protected]>--- mm/zsmalloc.c | 2 -- 1 file changed, 2 deletions(-)mm/zsmalloc.c +0
-2@@ -973,8 +973,6 @@ struct zs_pool *zs_create_pool(gfp_t flags)struct size_class *prev_class; size =ZS_MIN_ALLOC_SIZE + i *ZS_SIZE_CLASS_DELTA ; -if (size >ZS_MAX_ALLOC_SIZE ) - size =ZS_MAX_ALLOC_SIZE ; pages_per_zspage =get_pages_per_zspage (size);/* Signature · 7 lines
1.7.9.5 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Signature · 2 lines
Kind regards, Minchan Kim
Hello
2014-11-21 11:54 GMT+08:00 Minchan Kim <[email protected]>:
Quoted 8 lines · Mahendran Ganesh
Quoted 7 lines
ZS_SIZE_CLASSESis calc by:
((ZS_MAX_ALLOC_SIZE-ZS_MIN_ALLOC_SIZE) /ZS_SIZE_CLASS_DELTA+ 1)So when i is in [0,
ZS_SIZE_CLASSES- 1), the size:
size =ZS_MIN_ALLOC_SIZE+ i *ZS_SIZE_CLASS_DELTA
will not be greater thanZS_MAX_ALLOC_SIZE
Quoted 6 lines
Quoted 1 line
This patch removes the unnecessary check.
It depends on
ZS_MIN_ALLOC_SIZE.
For example, we would change min to 8 but MAX is still 4096.ZS_SIZE_CLASSESis (4096 - 8) / 16 + 1 = 256 so 8 + 255 * 16 = 4088, which exceeds the max.
Here, 4088 is less than MAX(4096).
ZS_SIZE_CLASSES = (MAX - MIN) / Delta + 1
So, I think the value of
MIN + (ZS_SIZE_CLASSES - 1) * Delta =
MIN + ((MAX - MIN) / Delta) * Delta =
MAX
will not exceed the MAX
Thanks.
Quoted 23 lines
Quoted 23 lines
Signed-off-by Mahendran Ganesh <[email protected]>--- mm/zsmalloc.c | 2 -- 1 file changed, 2 deletions(-)mm/zsmalloc.c +0
-3@@ -973,8 +973,6 @@ struct zs_pool *zs_create_pool(gfp_t flags)struct size_class *prev_class; size =ZS_MIN_ALLOC_SIZE + i *ZS_SIZE_CLASS_DELTA ; -if (size >ZS_MAX_ALLOC_SIZE ) - size =ZS_MAX_ALLOC_SIZE ; pages_per_zspage =get_pages_per_zspage (size);/* -- 1.7.9.5
Quoted 9 lines
Quoted 5 lines
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>--
Kind regards,
Minchan Kim
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 17 lines · Ganesh Mahendran
Hello
2014-11-21 11:54 GMT+08:00 Minchan Kim <[email protected]>:
Quoted 8 lines · Mahendran Ganesh
Quoted 7 lines
ZS_SIZE_CLASSESis calc by:
((ZS_MAX_ALLOC_SIZE-ZS_MIN_ALLOC_SIZE) /ZS_SIZE_CLASS_DELTA+ 1)So when i is in [0,
ZS_SIZE_CLASSES- 1), the size:
size =ZS_MIN_ALLOC_SIZE+ i *ZS_SIZE_CLASS_DELTA
will not be greater thanZS_MAX_ALLOC_SIZEQuoted 6 lines
Quoted 1 line
This patch removes the unnecessary check.
It depends on
ZS_MIN_ALLOC_SIZE.
For example, we would change min to 8 but MAX is still 4096.ZS_SIZE_CLASSESis (4096 - 8) / 16 + 1 = 256 so 8 + 255 * 16 = 4088, which exceeds the max.
Quoted 8 lines
Here, 4088 is less than MAX(4096).
ZS_SIZE_CLASSES= (MAX - MIN) / Delta + 1
So, I think the value of
MIN + (ZS_SIZE_CLASSES- 1) * Delta =
MIN + ((MAX - MIN) / Delta) * Delta =
MAX
will not exceed the MAX
You're right. It was complext math for me.
I should go back to elementary school.
Thanks!
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Minchan Kim
maintainerQuoted 27 lines · Minchan Kim
Quoted 17 lines · Ganesh Mahendran
Hello
2014-11-21 11:54 GMT+08:00 Minchan Kim <[email protected]>:
Quoted 8 lines · Mahendran Ganesh
Quoted 7 lines
ZS_SIZE_CLASSESis calc by:
((ZS_MAX_ALLOC_SIZE-ZS_MIN_ALLOC_SIZE) /ZS_SIZE_CLASS_DELTA+ 1)So when i is in [0,
ZS_SIZE_CLASSES- 1), the size:
size =ZS_MIN_ALLOC_SIZE+ i *ZS_SIZE_CLASS_DELTA
will not be greater thanZS_MAX_ALLOC_SIZEQuoted 6 lines
Quoted 1 line
This patch removes the unnecessary check.
It depends on
ZS_MIN_ALLOC_SIZE.
For example, we would change min to 8 but MAX is still 4096.ZS_SIZE_CLASSESis (4096 - 8) / 16 + 1 = 256 so 8 + 255 * 16 = 4088, which exceeds the max.Quoted 8 lines
Here, 4088 is less than MAX(4096).
ZS_SIZE_CLASSES= (MAX - MIN) / Delta + 1
So, I think the value of
MIN + (ZS_SIZE_CLASSES- 1) * Delta =
MIN + ((MAX - MIN) / Delta) * Delta =
MAX
will not exceed the MAX
Quoted 6 lines
You're right. It was complext math for me.
I should go back to elementary school.Thanks!
Acked-by Minchan Kim <[email protected]>
I catch a nasty cold but above my poor math makes me think more. ZS_SIZE_CLASSES is broken. In above my example, current code cannot allocate 4096 size class so we should correct ZS_SIZE_CLASSES at first.
zs_size_classes = zs_max - zs_min / delta + 1;
if ((zs_max - zs_min) % delta)
zs_size_classes += 1;
Then, we need to code piece you removed.
As well, we need to fix below.
- area->vm_buf = (char *)__get_free_page(GFP_KERNEL);
+ area->vm_buf = kmalloc(ZS_MAX_ALLOC_SIZE);
Hope I am sane in this time :(
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Hello Minchan
2014-11-21 18:32 GMT+08:00 Minchan Kim <[email protected]>:
Quoted 35 lines · Minchan Kim
Quoted 27 lines · Ganesh Mahendran
Quoted 17 lines
Hello
2014-11-21 11:54 GMT+08:00 Minchan Kim <[email protected]>:
Quoted 8 lines · Mahendran Ganesh
Quoted 7 lines
ZS_SIZE_CLASSESis calc by:
((ZS_MAX_ALLOC_SIZE-ZS_MIN_ALLOC_SIZE) /ZS_SIZE_CLASS_DELTA+ 1)So when i is in [0,
ZS_SIZE_CLASSES- 1), the size:
size =ZS_MIN_ALLOC_SIZE+ i *ZS_SIZE_CLASS_DELTA
will not be greater thanZS_MAX_ALLOC_SIZEQuoted 6 lines
Quoted 1 line
This patch removes the unnecessary check.
It depends on
ZS_MIN_ALLOC_SIZE.
For example, we would change min to 8 but MAX is still 4096.ZS_SIZE_CLASSESis (4096 - 8) / 16 + 1 = 256 so 8 + 255 * 16 = 4088, which exceeds the max.Quoted 8 lines
Here, 4088 is less than MAX(4096).
ZS_SIZE_CLASSES= (MAX - MIN) / Delta + 1
So, I think the value of
MIN + (ZS_SIZE_CLASSES- 1) * Delta =
MIN + ((MAX - MIN) / Delta) * Delta =
MAX
will not exceed the MAXQuoted 6 lines
You're right. It was complext math for me.
I should go back to elementary school.Thanks!
Acked-by Minchan Kim <[email protected]>
Quoted 8 lines
I catch a nasty cold but above my poor math makes me think more.
ZS_SIZE_CLASSESis broken. In above my example, current code cannot allocate 4096 size class so we should correctZS_SIZE_CLASSESat first.
zs_size_classes=zs_max-zs_min/ delta + 1;
if ((zs_max-zs_min) % delta)zs_size_classes += 1;
Yes, you are right.
When the zs_min is less than delta, we can not allocate PAGE_SIZE size class.
Quoted 6 lines
Then, we need to code piece you removed.
As well, we need to fix below.-
area->vm_buf= (char *)__get_free_page(GFP_KERNEL);
+area->vm_buf=kmalloc(ZS_MAX_ALLOC_SIZE);
If our purpose is to allocate the max obj size as len of PAGE_SIZE, we do not need to
change this line. Since the ZS_MAX_ALLOC_SIZE will always be PAGE_SIZE
Thanks.
Quoted 2 lines
Hope I am sane in this time :(
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Minchan Kim
maintainerHello Ganesh,
Quoted 50 lines · Ganesh Mahendran
Hello Minchan
2014-11-21 18:32 GMT+08:00 Minchan Kim <[email protected]>:
Quoted 35 lines · Minchan Kim
Quoted 27 lines · Ganesh Mahendran
Quoted 17 lines
Hello
2014-11-21 11:54 GMT+08:00 Minchan Kim <[email protected]>:
Quoted 8 lines · Mahendran Ganesh
Quoted 7 lines
ZS_SIZE_CLASSESis calc by:
((ZS_MAX_ALLOC_SIZE-ZS_MIN_ALLOC_SIZE) /ZS_SIZE_CLASS_DELTA+ 1)So when i is in [0,
ZS_SIZE_CLASSES- 1), the size:
size =ZS_MIN_ALLOC_SIZE+ i *ZS_SIZE_CLASS_DELTA
will not be greater thanZS_MAX_ALLOC_SIZEQuoted 6 lines
Quoted 1 line
This patch removes the unnecessary check.
It depends on
ZS_MIN_ALLOC_SIZE.
For example, we would change min to 8 but MAX is still 4096.ZS_SIZE_CLASSESis (4096 - 8) / 16 + 1 = 256 so 8 + 255 * 16 = 4088, which exceeds the max.Quoted 8 lines
Here, 4088 is less than MAX(4096).
ZS_SIZE_CLASSES= (MAX - MIN) / Delta + 1
So, I think the value of
MIN + (ZS_SIZE_CLASSES- 1) * Delta =
MIN + ((MAX - MIN) / Delta) * Delta =
MAX
will not exceed the MAXQuoted 6 lines
You're right. It was complext math for me.
I should go back to elementary school.Thanks!
Acked-by Minchan Kim <[email protected]>Quoted 8 lines
I catch a nasty cold but above my poor math makes me think more.
ZS_SIZE_CLASSESis broken. In above my example, current code cannot allocate 4096 size class so we should correctZS_SIZE_CLASSESat first.
zs_size_classes=zs_max-zs_min/ delta + 1;
if ((zs_max-zs_min) % delta)zs_size_classes += 1;Yes, you are right.
When thezs_minis less than delta, we can not allocatePAGE_SIZEsize class.Quoted 1 line
Quoted 8 lines
Quoted 5 lines
Then, we need to code piece you removed.
As well, we need to fix below.-
area->vm_buf= (char *)__get_free_page(GFP_KERNEL);
+area->vm_buf=kmalloc(ZS_MAX_ALLOC_SIZE);If our purpose is to allocate the max obj size as len of
PAGE_SIZE, we do not need to
change this line. Since theZS_MAX_ALLOC_SIZEwill always bePAGE_SIZE
No, please don't assume ZS_MAX_ALLOC_SIZE is PAGE_SIZE forever. Some reason could make buffer larger than PAGE_SIZE.
For example, we might put allocator's metadata into each object's head/tail.
Signature · 8 lines
Kind regards, Minchan Kim -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>