summaryrefslogtreecommitdiff
path: root/sys/src/9/port
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-10-21 11:06:35 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-10-21 11:06:35 +0000
commitf9df0bd2821c302cb13b694842e802cd9e2bc402 (patch)
tree208b481906ab328311a8c50254227cc94ee9cc32 /sys/src/9/port
parent2cd313668cea156fd13b54873d7934d9b15d8081 (diff)
kernel: fix freeb() for custom pools
Some ethernet drivers like ethervt6105M maintain a custom pool of Blocks using Block.free callback. To maintain that Block.list pointer is nil when reused, we have to clear it before returning it to the custom pool as the custom pool code is not aware of it. Also, poison Block.list pointer before free().
Diffstat (limited to 'sys/src/9/port')
-rw-r--r--sys/src/9/port/allocb.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/src/9/port/allocb.c b/sys/src/9/port/allocb.c
index bb45551eb..cce846cc9 100644
--- a/sys/src/9/port/allocb.c
+++ b/sys/src/9/port/allocb.c
@@ -107,12 +107,16 @@ freeb(Block *b)
* pool of uncached buffers and provide their own free routine.
*/
if(b->free != nil) {
+ b->next = nil;
+ b->list = nil;
+
b->free(b);
return;
}
/* poison the block in case someone is still holding onto it */
b->next = dead;
+ b->list = dead;
b->rp = dead;
b->wp = dead;
b->lim = dead;