+ pile = cake->owner;
+ if (embedded_pile(pile)) {
+ return &cake->free_list[index];
+ }
+
+ id_acc = 0;
+ cake_fl = cake->fl;
+ while (index >= CAKE_FL_MAXLEN)
+ {
+ index -= CAKE_FL_MAXLEN;
+ id_acc += CAKE_FL_MAXLEN;
+
+ if (cake_fl->next) {
+ cake_fl = cake_fl->next;
+ continue;
+ }
+
+ cake_fl = __alloc_fl(id_acc, pile->pieces_per_cake);
+ cake_fl->next = cake_fl;
+ }
+
+ return &cake_fl->indices[index];
+}
+
+static inline struct cake_s*
+__create_cake_extern(struct cake_pile* pile)
+{
+ struct cake_s* cake;
+
+ cake = cake_grab(&cakes);
+ if (unlikely(!cake)) {
+ return NULL;
+ }
+
+ cake->first_piece = __alloc_cake_pages(pile->pg_per_cake);
+ cake->fl = __alloc_fl(0, pile->pieces_per_cake);
+ cake->next_free = 0;
+
+ return cake;
+}
+
+static inline struct cake_s*
+__create_cake_embed(struct cake_pile* pile)
+{
+ struct cake_s* cake;
+
+ cake = __alloc_cake_pages(pile->pg_per_cake);
+ if (unlikely(!cake)) {