Fixing ABD struct allocation for FreeBSD
In the event we are allocating a gang ABD in FreeBSD we are passing 0 to abd_alloc_struct(); however, this led to an allocation of ABD scatter with 0 chunks. This left the gang ABD allocation 24 bytes smaller than it should have been. Reviewed-by: Matt Macy <mmacy@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Co-authored-by: Matt Macy <mmacy@FreeBSD.org> Signed-off-by: Brian Atkinson <batkinson@lanl.gov> Closes #10431
This commit is contained in:
parent
c13facb9c4
commit
0a03495e3e
|
@ -198,8 +198,15 @@ abd_t *
|
||||||
abd_alloc_struct(size_t size)
|
abd_alloc_struct(size_t size)
|
||||||
{
|
{
|
||||||
size_t chunkcnt = abd_chunkcnt_for_bytes(size);
|
size_t chunkcnt = abd_chunkcnt_for_bytes(size);
|
||||||
size_t abd_size = offsetof(abd_t,
|
/*
|
||||||
abd_u.abd_scatter.abd_chunks[chunkcnt]);
|
* In the event we are allocating a gang ABD, the size passed in
|
||||||
|
* will be 0. We must make sure to set abd_size to the size of an
|
||||||
|
* ABD struct as opposed to an ABD scatter with 0 chunks. The gang
|
||||||
|
* ABD struct allocation accounts for an additional 24 bytes over
|
||||||
|
* a scatter ABD with 0 chunks.
|
||||||
|
*/
|
||||||
|
size_t abd_size = MAX(sizeof (abd_t),
|
||||||
|
offsetof(abd_t, abd_u.abd_scatter.abd_chunks[chunkcnt]));
|
||||||
abd_t *abd = kmem_alloc(abd_size, KM_PUSHPAGE);
|
abd_t *abd = kmem_alloc(abd_size, KM_PUSHPAGE);
|
||||||
ASSERT3P(abd, !=, NULL);
|
ASSERT3P(abd, !=, NULL);
|
||||||
list_link_init(&abd->abd_gang_link);
|
list_link_init(&abd->abd_gang_link);
|
||||||
|
@ -212,8 +219,10 @@ abd_alloc_struct(size_t size)
|
||||||
void
|
void
|
||||||
abd_free_struct(abd_t *abd)
|
abd_free_struct(abd_t *abd)
|
||||||
{
|
{
|
||||||
size_t chunkcnt = abd_is_linear(abd) ? 0 : abd_scatter_chunkcnt(abd);
|
size_t chunkcnt = abd_is_linear(abd) || abd_is_gang(abd) ? 0 :
|
||||||
int size = offsetof(abd_t, abd_u.abd_scatter.abd_chunks[chunkcnt]);
|
abd_scatter_chunkcnt(abd);
|
||||||
|
int size = MAX(sizeof (abd_t),
|
||||||
|
offsetof(abd_t, abd_u.abd_scatter.abd_chunks[chunkcnt]));
|
||||||
mutex_destroy(&abd->abd_mtx);
|
mutex_destroy(&abd->abd_mtx);
|
||||||
ASSERT(!list_link_active(&abd->abd_gang_link));
|
ASSERT(!list_link_active(&abd->abd_gang_link));
|
||||||
kmem_free(abd, size);
|
kmem_free(abd, size);
|
||||||
|
|
Loading…
Reference in New Issue