[PATCH 1/2] makedumpfile/eppic: Add README for eppic scripts
Atsushi Kumagai
kumagai-atsushi at mxc.nes.nec.co.jp
Mon Mar 10 01:26:09 EDT 2014
>Signed-off-by: Aruna Balakrishnaiah <aruna at linux.vnet.ibm.com>
>---
> eppic_scripts/README | 294 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 294 insertions(+)
> create mode 100644 eppic_scripts/README
Thanks Aruna, I'll merge the first ten patches except [10/10]
and this two patches into v1.5.6 as:
[PATCH 01/11] eppic: Scrub executable name for each user process.
[PATCH 02/11] eppic: Scrub filenames of cached dentries.
[PATCH 03/11] eppic: Scrub all entries in the keyring.
[PATCH 04/11] eppic: Clear the message data of all ap_bus requests.
[PATCH 05/11] eppic: Scrub data in tcp socket buffers.
[PATCH 06/11] eppic: Scrub data of udp socket buffers.
[PATCH 07/11] eppic: Scrub data of unix socket buffers.
[PATCH 08/11] eppic: Scrub socket buffers of guest network I/O.
[PATCH 09/11] eppic: Scrub buffers involved in guest block I/O.
[PATCH 10/11] eppic: Add README for eppic scripts.
[PATCH 11/11] eppic: Install sample eppic scripts.
Thanks
Atsushi Kumagai
>diff --git a/eppic_scripts/README b/eppic_scripts/README
>new file mode 100644
>index 0000000..040b3ba
>--- /dev/null
>+++ b/eppic_scripts/README
>@@ -0,0 +1,294 @@
>+===================================
>+ Eppic scripts README
>+==================================
>+
>+The eppic scripts are based on the fedora 19 kernel.
>+
>+1. Eppic script: proc_names.c
>+ Description: Scrubs executable name of each user process
>+
>+ Explanation:
>+ Walks all processes via the tasks lists starting from init_task
>+
>+ extern struct task_struct init_task;
>+
>+ struct task_struct {
>+ ...
>+ struct list_head tasks;
>+ ...
>+ char comm[TASK_COMM_LEN]; /* executable name excluding path */
>+ ...
>+ };
>+
>+ For each user space process clear executable name
>+
>+ struct task_struct *tsk;
>+ list_for_each_entry(tsk, &init_task, tasks) {
>+ if (tsk->mm)
>+ memset(tsk->comm, 0, TASK_COMM_LEN);
>+ }
>+
>+
>+2. Eppic script: dir_names.c
>+ Description: Scrubs filenames of cached dentries
>+
>+ Explanation:
>+ i) iterate over all mounted filesystems
>+
>+ struct vfsmount {
>+ struct list_head mnt_hash;
>+ ...
>+ struct dentry *mnt_root; /* root of the mounted tree */
>+ ...
>+ };
>+
>+ for (u = 0; i < HASH_SIZE; u++) {
>+ struct vfsmount *mnt;
>+ list_for_each_entry(mnt, &mount_hashtable[u], mnt_hash) {
>+ struct dentry *root;
>+ root = mnt->mnt_root;
>+ ...
>+ }
>+ }
>+
>+ ii) recursively walk the dentries of each tree starting from root dentry
>+ and clear d_name and d_iname
>+
>+ struct dentry {
>+ ...
>+ struct qstr d_name;
>+ ...
>+ unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
>+ ...
>+ struct list_head d_subdirs; /* our children */
>+ ...
>+ };
>+
>+ void walk_dentries(struct dentry *dentry)
>+ {
>+ struct dentry *child;
>+ memset(dentry->d_iname, 0, DNAME_INLINE_LEN);
>+ memset(dentry->d_name.name, 0, dentry->d_name.len);
>+ list_for_each_entry(child, &dentry->d_subdirs, d_u.d_child)
>+ walk_dentries(child);
>+ }
>+
>+3. Eppic script: keyring.c
>+ Description: Scrubs all entries in the keyring
>+
>+ Explanation:
>+ Scan the keyring_name_hash hash table
>+
>+ static struct list_head keyring_name_hash[KEYRING_NAME_HASH_SIZE];
>+
>+ for (i = 0; i < KEYRING_NAME_HASH_SIZE; i++)
>+ if (!list_empty(&keyring_name_hash[i])) {
>+ ...
>+ }
>+
>+ For each non-empty list walk all keyring entries
>+
>+ struct key {
>+ ...
>+ struct key_type *type; /* type of key */
>+ ...
>+ unsigned short datalen; /* payload data length */
>+ ...
>+ union {
>+ struct list_head link;
>+ ...
>+ } type_data;
>+ ...
>+ union {
>+ unsigned long value;
>+ void __rcu *rcudata;
>+ void *data;
>+ struct keyring_list __rcu *subscriptions;
>+ } payload;
>+ };
>+
>+ struct key *key;
>+ list_for_each_entry(key, &keyring_name_hash[i], type_data.link) {
>+ ...
>+ }
>+
>+ Clear value/rcudata/data dependent on the type of the key.
>+
>+4. Eppic script: ap_messages.c
>+ Description: Clear the message data of all ap_bus requests
>+
>+ Explanation:
>+ Walk all devices in the LIST_HEAD(ap_device_list);
>+
>+ struct ap_device {
>+ ...
>+ struct list_head list; /* private list of all AP devices. */
>+ ...
>+ struct list_head pendingq; /* List of message sent to AP queue. */
>+ int pendingq_count; /* # requests on pendingq list. */
>+ struct list_head requestq; /* List of message yet to be sent. */
>+ int requestq_count; /* # requests on requestq list. */
>+ ...
>+ };
>+
>+ struct ap_device *device;
>+ list_for_each_entry(device, &ap_device_list, list) {
>+ ...
>+ }
>+
>+ For each ap device walk the pendingq and requestq list
>+
>+ struct ap_message {
>+ struct list_head list; /* Request queueing. */
>+ ...
>+ void *message; /* Pointer to message buffer. */
>+ size_t length; /* Message length. */
>+ ...
>+ };
>+
>+ struct ap_message *apmsg;
>+ list_for_each_entry(apmsg, &device->pendingq, list) {
>+ ...
>+ }
>+ list_for_each_entry(apmsg, &device->requestq, list) {
>+ ...
>+ }
>+
>+ For each message in pendingq and requestq clear the message
>+
>+ memset(apmsg->message, 0, apmsg->length);
>+
>+5. Eppic script: tcp_sk_buf.c
>+ Description: Scrub data in tcp socket buffers
>+
>+ Explanation:
>+ Find tcp domain sockets (struct sock *sk)
>+
>+ tcp sockets:
>+
>+ Iterate from 0 to INET_LHTABLE_SIZE and get inet_list_hashbucket from
>+ tcp_hash_info.listening_hash[<index>]
>+
>+ for (i = 0; i < INET_LHTABLE_SIZE; i++) {
>+ struct inet_listen_hashbucket *ilb = &tcp_hashinfo.listening_hash[i];
>+ }
>+ For each hash bucket iterate over ilb->head null list to get sockets:
>+ struct sock *sk;
>+ sk_nulls_for_each(sk, node, &ilb->head) {
>+ ...
>+ }
>+
>+
>+ For each socket iterate over the socket buffers in
>+ sk_receive_queue and sk_write_queue:
>+
>+ struct sock {
>+ ...
>+ struct sk_buff_head sk_receive_queue;
>+ ...
>+ struct sk_buff_head sk_write_queue;
>+ ...
>+ };
>+
>+ struct sk_buff_head {
>+ struct sk_buff *next;
>+ struct sk_buff *prev;
>+ };
>+
>+ For each struct sk_buff in the two lists clear the memory referenced
>+ by skb->data / skb->data_len:
>+
>+ struct sk_buff {
>+ ...
>+ unsigned int data_len;
>+ ...
>+ unsigned char *data;
>+ ...
>+ };
>+
>+6. Eppic script: udp_sk_buf.c
>+ Description: Scrub data of udp socket buffers
>+
>+ Explanation:
>+ Find all udp sockets (struct sock *sk)
>+
>+ udp sockets:
>+
>+ Iterate from 0 to udp_table->mask and get udp_hslot from hash table:
>+ for (i = 0; i < udp->table->mask; i++) {
>+ struct udp_hslot *hslot = udp_table->hash[i];
>+ ...
>+ }
>+
>+ For each hslot iterate over hslot->head null list to get sockets:
>+ struct sock *sk;
>+ sk_nulls_for_each(sk, node, &hslot->head) {
>+ ...
>+ }
>+
>+ For each socket iterate over the socket buffers in
>+ sk_receive_queue and sk_write_queue.
>+
>+ For each struct sk_buff in the two lists clear the memory referenced
>+ by skb->data / skb->data_len.
>+
>+7. Eppic script: unix_sk_buf.c
>+ Description: Scrub data of unix socket buffers
>+
>+ Explanation:
>+ Iterate from 0 to UNIX_HASH_SIZE and then walk the hlist in
>+ for (i = 0; i < UNIX_HASH_SIZE; i++) {
>+ struct list_head *list = &unix_socket_table[i];
>+ ...
>+ }
>+
>+ Walk each non-empty list in unix_socket_table
>+ struct sock *sk;
>+ sk_for_each(sk, node, &unix_socket_table[i])
>+
>+ For each socket iterate over the socket buffers in
>+ sk_receive_queue and sk_write_queue.
>+
>+ For each struct sk_buff in the two lists clear the memory referenced
>+ by skb->data / skb->data_len.
>+
>+8. Eppic script: vhost_net_buffers.c
>+ Description: Scrub socket buffers of guest network I/O
>+
>+ Explanation:
>+ Scrub socket buffers of guest network I/O
>+
>+ vhost_net instance will be attached to the file's private data.
>+ To get to the right file check the fdtable for each task, if the file
>+ has registered its fops with vhost_net_open, if so we can retreive the
>+ file's private data.
>+
>+ if (task->files->fdt->fd[i]->f_op->open == &vhost_net_open)
>+ struct vhost_net *net = f->private_data;
>+
>+ struct vhost_net_virtqueue *nvq = &net->vqs[VHOST_NET_VQ_MAX];
>+ struct vhost_virtqueue *vq = &nvq->vq;
>+ struct socket *sock = vq->private_data;
>+ struct sock *sk = sock->sk;
>+
>+ struct sk_buff *next = sk->sk_receive_queue.next;
>+ struct sk_buff *prev = sk->sk_receive_queue.prev;
>+
>+ Scrub next->data till the end of the sk_receive_queue and
>+ sk_write_queue list
>+
>+
>+9. Eppic script: vhost_scsi_buffers.c
>+ Description: Scrub buffers involved in guest block I/O
>+
>+ Explanation:
>+ vhost_scsi instance will be attached to the file's private data.
>+ to get to the right file check the fdtable for each task, if the
>+ file has registered its fops with vhost_net_open, if so we can
>+ retreive the file's private data.
>+
>+ if (task->files->fdt->fd[i]->f_op->open == &vhost_scsi_open)
>+ vhost_scsi *vs = task->files->fdt->fd[i]->private_data;
>+
>+ struct vhost_virtqueue *vq = (struct vhost_virtqueue *)vs->vqs[i].vq;
>+ scrub vq->iov[j].iov_base
More information about the kexec
mailing list