Details
-
Improvement
-
Resolution: Fixed
-
Minor
-
None
-
3
-
9223372036854775807
Description
The OBD_FREE(ptr) macro will internally (via OBD_FREE_PRE()) assert that ptr != NULL, even though the kernel accepts kfree(NULL) without complaint.
It would make sense to remove the LASSERT(ptr) call from OBD_FREE_PRE() and change the callers to silently accept this case:
#define OBD_FREE(ptr, size) \ if (likely(ptr)) { \ OBD_FREE_PRE(ptr, size, "kfreed"); \ POISON(ptr, 0x5a, size); \ kfree(ptr); \ POISON_PTR(ptr); \ } #define OBD_SLAB_FREE(ptr, slab, size) \ if (likely(ptr)) { \ OBD_FREE_PRE(ptr, size, "slab-freed"); \ POISON(ptr, 0x5a, size); \ kmem_cache_free(slab, ptr); \ POISON_PTR(ptr); \ }
It isn't strictly needed for OBD_FREE_LARGE() since is_vmalloc_addr(ptr) will return false for a NULL pointer and fall back to OBD_FREE().
Attachments
Issue Links
Activity
Fix Version/s | New: Lustre 2.16.0 [ 15190 ] | |
Resolution | New: Fixed [ 1 ] | |
Status | Original: Open [ 1 ] | New: Resolved [ 5 ] |
Description |
Original:
The {{OBD_FREE(ptr)}} macro will internally (via {{{}OBD_FREE_PRE(){}}}) assert that {{{}ptr != NULL{}}}, even though the kernel accepts {{kfree(NULL)}} without complaint.
It would make sense to remove the {{LASSERT(ptr)}} call from {{OBD_FREE_PRE()}} and change the callers to silently accept this case: {code:java} #define OBD_FREE(ptr, size) \ if (likely(ptr)) { \ OBD_FREE_PRE(ptr, size, "kfreed"); \ POISON(ptr, 0x5a, size); \ kfree(ptr); \ POISON_PTR(ptr); \ } #define OBD_SLAB_FREE(ptr, slab, size) \ if (likely(ptr)) { \ OBD_FREE_PRE(ptr, size, "slab-freed"); \ POISON(ptr, 0x5a, size); \ kmem_cache_free(slab, ptr); \ POISON_PTR(ptr); \ } {code} It isn't strictly needed for {{OBD_SLAB_FREE()}} since {{is_vmalloc_addr(ptr)}} will return false for a NULL pointer and fall back to {{OBD_FREE()}}. |
New:
The {{OBD_FREE(ptr)}} macro will internally (via {{{}OBD_FREE_PRE(){}}}) assert that {{{}ptr != NULL{}}}, even though the kernel accepts {{kfree(NULL)}} without complaint.
It would make sense to remove the {{LASSERT(ptr)}} call from {{OBD_FREE_PRE()}} and change the callers to silently accept this case: {code:java} #define OBD_FREE(ptr, size) \ if (likely(ptr)) { \ OBD_FREE_PRE(ptr, size, "kfreed"); \ POISON(ptr, 0x5a, size); \ kfree(ptr); \ POISON_PTR(ptr); \ } #define OBD_SLAB_FREE(ptr, slab, size) \ if (likely(ptr)) { \ OBD_FREE_PRE(ptr, size, "slab-freed"); \ POISON(ptr, 0x5a, size); \ kmem_cache_free(slab, ptr); \ POISON_PTR(ptr); \ } {code} It isn't strictly needed for {{OBD_FREE_LARGE()}} since {{is_vmalloc_addr(ptr)}} will return false for a NULL pointer and fall back to {{{}OBD_FREE(){}}}. |
Assignee | Original: WC Triage [ wc-triage ] | New: Arshad Hussain [ arshad512 ] |
Labels | New: easy |
Landed for 2.16