Merge branch 'tizen_2.4' into tizen_2.4_dev
[kernel/swap-modules.git] / us_manager / sspt / sspt_file.c
index ab02ce1..27a8a2b 100644 (file)
@@ -52,29 +52,37 @@ static int calculation_hash_bits(int cnt)
  */
 struct sspt_file *sspt_file_create(struct dentry *dentry, int page_cnt)
 {
+       int i, table_size;
        struct sspt_file *obj = kmalloc(sizeof(*obj), GFP_ATOMIC);
 
-       if (obj) {
-               int i, table_size;
-               INIT_LIST_HEAD(&obj->list);
-               obj->proc = NULL;
-               obj->dentry = dentry;
-               obj->loaded = 0;
-               obj->vm_start = 0;
-               obj->vm_end = 0;
+       if (obj == NULL)
+               return NULL;
+
+       INIT_LIST_HEAD(&obj->list);
+       obj->proc = NULL;
+       obj->dentry = dentry;
+       obj->loaded = 0;
+       obj->vm_start = 0;
+       obj->vm_end = 0;
 
-               obj->page_probes_hash_bits = calculation_hash_bits(page_cnt);
-               table_size = (1 << obj->page_probes_hash_bits);
+       obj->page_probes_hash_bits = calculation_hash_bits(page_cnt);
+       table_size = (1 << obj->page_probes_hash_bits);
 
-               obj->page_probes_table =
+       obj->page_probes_table =
                        kmalloc(sizeof(*obj->page_probes_table)*table_size,
                                GFP_ATOMIC);
 
-               for (i = 0; i < table_size; ++i)
-                       INIT_HLIST_HEAD(&obj->page_probes_table[i]);
-       }
+       if (obj->page_probes_table == NULL)
+               goto err;
+
+       for (i = 0; i < table_size; ++i)
+               INIT_HLIST_HEAD(&obj->page_probes_table[i]);
 
        return obj;
+
+err:
+       kfree(obj);
+       return NULL;
 }
 
 /**
@@ -136,7 +144,8 @@ static struct sspt_page *sspt_find_page_or_new(struct sspt_file *file,
 
        if (page == NULL) {
                page = sspt_page_create(offset);
-               sspt_add_page(file, page);
+               if (page)
+                       sspt_add_page(file, page);
        }
 
        return page;
@@ -196,6 +205,22 @@ void sspt_file_add_ip(struct sspt_file *file, struct img_ip *img_ip)
        probe_info_init(ip->desc->type, ip);
 }
 
+void sspt_file_on_each_ip(struct sspt_file *file,
+                         void (*func)(struct us_ip *, void *), void *data)
+{
+       int i;
+       const int table_size = (1 << file->page_probes_hash_bits);
+       struct sspt_page *page;
+       struct hlist_head *head;
+       DECLARE_NODE_PTR_FOR_HLIST(node);
+
+       for (i = 0; i < table_size; ++i) {
+               head = &file->page_probes_table[i];
+               swap_hlist_for_each_entry(page, node, head, hlist)
+                       sspt_page_on_each_ip(page, func, data);
+       }
+}
+
 /**
  * @brief Get sspt_page from sspt_file (look)
  *