*/
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;
}
/**
if (page == NULL) {
page = sspt_page_create(offset);
- sspt_add_page(file, page);
+ if (page)
+ sspt_add_page(file, page);
}
return page;
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)
*