/*
 * Copyright (c) 2015 The Regents of the University of California
 * Valmon Leymarie <leymariv@berkeley.edu>
 * Kevin Klues <klueska@cs.berkeley.edu>
 * See LICENSE for details.
 */

#pragma once

/* Forward declared from packed_corealloc.c. Internal representation of a
 * node in the hierarchy of elements in the cpu topology of the machine (i.e.
 * numa domain, socket, cpu, core, etc.). Needed here to provide a back
 * reference for a sched_pcore to its node in the hierarchy. */
struct sched_pnode;

/* The core request algorithm maintains an internal array of these: the
 * global pcore map. Note the prov_proc and alloc_proc are weak (internal)
 * references, and should only be used as a ref source while the ksched has a
 * valid kref. */
struct sched_pcore {
	TAILQ_ENTRY(sched_pcore)   	prov_next;  /* on a proc's prov list */
	TAILQ_ENTRY(sched_pcore)   	alloc_next; /* on an alloc list (idle)*/
	struct proc                	*prov_proc;
	struct proc                	*alloc_proc;
	struct core_info           	*core_info;
	struct sched_pnode         	*sched_pnode;
};
TAILQ_HEAD(sched_pcore_tailq, sched_pcore);

struct core_request_data {
	struct sched_pcore_tailq  	alloc_me;
	struct sched_pcore_tailq  	prov_alloc_me; 
	struct sched_pcore_tailq  	prov_not_alloc_me;
};

static inline uint32_t spc2pcoreid(struct sched_pcore *spc)
{
	return spc->core_info->core_id;
}

static inline struct sched_pcore *pcoreid2spc(uint32_t pcoreid)
{
	extern struct sched_pcore *all_pcores;

	return &all_pcores[pcoreid];
}
