@@ -117,23 +117,24 @@ struct vregion *vregion_create(size_t lifetime_size, size_t interim_size)
117117 return NULL ;
118118 }
119119
120- /*
121- * Align up lifetime sizes and interim sizes to nearest page, the
122- * vregion structure is stored in lifetime area so account for its size too.
123- */
124- lifetime_size += sizeof (* vr );
120+ /* Align up lifetime sizes and interim sizes to nearest page */
125121 lifetime_size = ALIGN_UP (lifetime_size , CONFIG_MM_DRV_PAGE_SIZE );
126122 interim_size = ALIGN_UP (interim_size , CONFIG_MM_DRV_PAGE_SIZE );
127123 total_size = lifetime_size + interim_size ;
128124
125+ vr = rmalloc (0 , sizeof (* vr ));
126+ if (!vr )
127+ return NULL ;
128+
129129 /* allocate pages for vregion */
130130 pages = total_size / CONFIG_MM_DRV_PAGE_SIZE ;
131131 vregion_base = vpage_alloc (pages );
132- if (!vregion_base )
132+ if (!vregion_base ) {
133+ rfree (vr );
133134 return NULL ;
135+ }
134136
135137 /* init vregion - place it at the start of the lifetime region */
136- vr = (struct vregion * )(vregion_base + interim_size );
137138 vr -> base = vregion_base ;
138139 vr -> size = total_size ;
139140 vr -> pages = pages ;
@@ -147,9 +148,8 @@ struct vregion *vregion_create(size_t lifetime_size, size_t interim_size)
147148 vr -> lifetime .base = vr -> base + interim_size ;
148149
149150 /* set alloc ptr addresses for lifetime linear partitions */
150- vr -> lifetime .ptr = vr -> lifetime .base +
151- ALIGN_UP (sizeof (* vr ), CONFIG_DCACHE_LINE_SIZE ); /* skip vregion struct */
152- vr -> lifetime .used = ALIGN_UP (sizeof (* vr ), CONFIG_DCACHE_LINE_SIZE );
151+ vr -> lifetime .ptr = vr -> lifetime .base ;
152+ vr -> lifetime .used = 0 ;
153153
154154 /* init interim heaps */
155155 k_heap_init (& vr -> interim .heap , vr -> interim .heap .heap .init_mem , interim_size );
@@ -205,6 +205,7 @@ struct vregion *vregion_put(struct vregion *vr)
205205 LOG_DBG ("destroy %p size %#zx pages %u" , (void * )vr -> base , vr -> size , vr -> pages );
206206 LOG_DBG (" lifetime used %zu free count %d" , vr -> lifetime .used , vr -> lifetime .free_count );
207207 vpage_free (vr -> base );
208+ rfree (vr );
208209
209210 return NULL ;
210211}
0 commit comments