cregit-Linux how code gets into the kernel

Release 4.16 drivers/misc/ocxl/pasid.c

// SPDX-License-Identifier: GPL-2.0+
// Copyright 2017 IBM Corp.
#include "ocxl_internal.h"



struct id_range {
	
struct list_head list;
	
u32 start;
	
u32 end;
};

#ifdef DEBUG

static void dump_list(struct list_head *head, char *type_str) { struct id_range *cur; pr_debug("%s ranges allocated:\n", type_str); list_for_each_entry(cur, head, list) { pr_debug("Range %d->%d\n", cur->start, cur->end); } }

Contributors

PersonTokensPropCommitsCommitProp
Frederic Barrat50100.00%1100.00%
Total50100.00%1100.00%

#endif
static int range_alloc(struct list_head *head, u32 size, int max_id, char *type_str) { struct list_head *pos; struct id_range *cur, *new; int rc, last_end; new = kmalloc(sizeof(struct id_range), GFP_KERNEL); if (!new) return -ENOMEM; pos = head; last_end = -1; list_for_each_entry(cur, head, list) { if ((cur->start - last_end) > size) break; last_end = cur->end; pos = &cur->list; } new->start = last_end + 1; new->end = new->start + size - 1; if (new->end > max_id) { kfree(new); rc = -ENOSPC; } else { list_add(&new->list, pos); rc = new->start; } #ifdef DEBUG dump_list(head, type_str); #endif return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Frederic Barrat180100.00%1100.00%
Total180100.00%1100.00%


static void range_free(struct list_head *head, u32 start, u32 size, char *type_str) { bool found = false; struct id_range *cur, *tmp; list_for_each_entry_safe(cur, tmp, head, list) { if (cur->start == start && cur->end == (start + size - 1)) { found = true; list_del(&cur->list); kfree(cur); break; } } WARN_ON(!found); #ifdef DEBUG dump_list(head, type_str); #endif }

Contributors

PersonTokensPropCommitsCommitProp
Frederic Barrat104100.00%1100.00%
Total104100.00%1100.00%


int ocxl_pasid_afu_alloc(struct ocxl_fn *fn, u32 size) { int max_pasid; if (fn->config.max_pasid_log < 0) return -ENOSPC; max_pasid = 1 << fn->config.max_pasid_log; return range_alloc(&fn->pasid_list, size, max_pasid, "afu pasid"); }

Contributors

PersonTokensPropCommitsCommitProp
Frederic Barrat55100.00%1100.00%
Total55100.00%1100.00%


void ocxl_pasid_afu_free(struct ocxl_fn *fn, u32 start, u32 size) { return range_free(&fn->pasid_list, start, size, "afu pasid"); }

Contributors

PersonTokensPropCommitsCommitProp
Frederic Barrat31100.00%1100.00%
Total31100.00%1100.00%


int ocxl_actag_afu_alloc(struct ocxl_fn *fn, u32 size) { int max_actag; max_actag = fn->actag_enabled; return range_alloc(&fn->actag_list, size, max_actag, "afu actag"); }

Contributors

PersonTokensPropCommitsCommitProp
Frederic Barrat37100.00%1100.00%
Total37100.00%1100.00%


void ocxl_actag_afu_free(struct ocxl_fn *fn, u32 start, u32 size) { return range_free(&fn->actag_list, start, size, "afu actag"); }

Contributors

PersonTokensPropCommitsCommitProp
Frederic Barrat31100.00%1100.00%
Total31100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Frederic Barrat513100.00%1100.00%
Total513100.00%1100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.