/arch/x86/mach-generic/

value='ecrts-pgm-final'>ecrts-pgm-final The LITMUS^RT kernel.Bjoern Brandenburg
aboutsummaryrefslogblamecommitdiffstats
path: root/mm/hugetlb_cgroup.c
blob: a67c26e0f360211f21fdb6b19f0f54fc9d3fe726 (plain) (tree)



























                                                                          



                                                        




                                                                             
                                                                      


             

                                                                         
                                                                        






                                                                      

                                                  
 
                                                         

 
                                                                         

                







                                                                                

                                                                
 

                                                                                     
                




                                                          
                              










                                                                          
                                                                    


                                        
                                                


                        







                                                                 
                                                                            





                                                         
                                                                    




























                                                                            
                                                                       
 
                                                                   

                          
                    

            


                                                                               
                                                                            




                                                   
                                                  

 


















                                                                      
                                             











                                                                         
                                             






                                                                  
                                       













                                                                  
                                           






















                                                                      

                                                                   
 
                      
                                                                   



                                          
                                                                

 

                                                                         


                               
                                                                          
 


                                                 








                                                                       
                                                                     

                              
                                                                         





                                                                       
                             

 

                                                                         

                               
                                                                          
 

                                                 











                                                                
                             












                                                              
                                                      











                                                                       
                                                
                                          




                                                                       
                                                




                                                                           
                                          
                                                




                                                                
                                          
                                                




                                         

                                                               














                                                                          

 



                                                                   


                                                                         
                                                 



                                      
                                                      


                                                  


                                                 
                                                           
                                   


               
                                            


                                                     
  
/*
 *
 * Copyright IBM Corporation, 2012
 * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2.1 of the GNU Lesser General Public License
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it would be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#include <linux/cgroup.h>
#include <linux/slab.h>
#include <linux/hugetlb.h>
#include <linux/hugetlb_cgroup.h>

struct hugetlb_cgroup {
	struct cgroup_subsys_state css;
	/*
	 * the counter to account for hugepages from hugetlb.
	 */
	struct res_counter hugepage[HUGE_MAX_HSTATE];
};

#define MEMFILE_PRIVATE(x, val)	(((x) << 16) | (val))
#define MEMFILE_IDX(val)	(((val) >> 16) & 0xffff)
#define MEMFILE_ATTR(val)	((val) & 0xffff)

static struct hugetlb_cgroup *root_h_cgroup __read_mostly;

static inline
struct hugetlb_cgroup *hugetlb_cgroup_from_css(struct cgroup_subsys_state *s)
{
	return s ? container_of(s, struct hugetlb_cgroup, css) : NULL;
}

static inline
struct hugetlb_cgroup *hugetlb_cgroup_from_task(struct task_struct *task)
{
	return hugetlb_cgroup_from_css(task_css(task, hugetlb_cgrp_id));
}

static inline bool hugetlb_cgroup_is_root(struct hugetlb_cgroup *h_cg)
{
	return (h_cg == root_h_cgroup);
}

static inline struct hugetlb_cgroup *
parent_hugetlb_cgroup(struct hugetlb_cgroup *h_cg)
{
	return hugetlb_cgroup_from_css(h_cg->css.parent);
}

static inline bool hugetlb_cgroup_have_usage(struct hugetlb_cgroup *h_cg)
{
	int idx;

	for (idx = 0; idx < hugetlb_max_hstate; idx++) {
		if ((res_counter_read_u64(&h_cg->hugepage[idx], RES_USAGE)) > 0)
			return true;
	}
	return false;
}

static struct cgroup_subsys_state *
hugetlb_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
{
	struct hugetlb_cgroup *parent_h_cgroup = hugetlb_cgroup_from_css(parent_css);
	struct hugetlb_cgroup *h_cgroup;
	int idx;

	h_cgroup = kzalloc(sizeof(*h_cgroup), GFP_KERNEL);
	if (!h_cgroup)
		return ERR_PTR(-ENOMEM);