Re: [PATCH v2 1/5] kernel-shark-qt: Add kshark_get_X_easy() functions.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On  2.10.2018 23:44, Steven Rostedt wrote:
> On Mon,  1 Oct 2018 16:59:17 +0300
> Yordan Karadzhov <ykaradzhov@xxxxxxxxxx> wrote:
> 
>> From: "Yordan Karadzhov (VMware)" <y.karadz@xxxxxxxxx>
>>
>> The kshark_get_X_easy() functions allow for an easy access to the
>> tep_record's fields. Using these functions can be inefficient if you
>> need access to more than one of the fields of the record.
>>
>> Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@xxxxxxxxx>
>> ---
>>   kernel-shark-qt/src/libkshark.c | 185 ++++++++++++++++++++++++++++++++
>>   kernel-shark-qt/src/libkshark.h |  12 +++
>>   2 files changed, 197 insertions(+)
>>
>> diff --git a/kernel-shark-qt/src/libkshark.c b/kernel-shark-qt/src/libkshark.c
>> index 506511d..a7983eb 100644
>> --- a/kernel-shark-qt/src/libkshark.c
>> +++ b/kernel-shark-qt/src/libkshark.c
>> @@ -888,6 +888,191 @@ static const char *kshark_get_info(struct tep_handle *pe,
>>   	return seq.buffer;
>>   }
>>   
>> +/**
>> + * @brief This function allows for an easy access to the original value of the
>> + *	  Process Id as recorded in the tep_record object. The record is read
>> + *	  from the file only in the case of an entry being touched by a plugin.
>> + *	  Be aware that using the kshark_get_X_easy functions can be
>> + *	  inefficient if you need an access to more than one of the data fields
>> + *	  of the record.
>> + *
>> + * @param entry: Input location for the KernelShark entry.
>> + *
>> + * @returns The original value of the Process Id as recorded in the
>> + *	    tep_record object on success, otherwise negative error code.
>> + */
>> +int kshark_get_pid_easy(struct kshark_entry *entry)
>> +{
>> +	struct kshark_context *kshark_ctx = NULL;
>> +	struct tep_record *data;
>> +	int pid;
>> +
>> +	if (!kshark_instance(&kshark_ctx))
>> +		return -EFAULT;
> 
> Perhaps this should return -ENODEV;
> 
>> +
>> +	if (entry->visible & KS_PLUGIN_UNTOUCHED_MASK) {
> 
> What's the "UNTOUCHED_MASK" mean?

We use the KS_PLUGIN_UNTOUCHED_MASK to check the flag (bit)
which indicates if the entry has been touched and potential modified by 
a plugin callback function. If the bit is set this means untouched.

This flag (bit) gets set when we load the data ( libkshark.c / 
get_records())

	entry->visible = 0xFF;

...

	/* Execute all plugin-provided actions (if any). */
	evt_handler = kshark_ctx->event_handlers;
	while ((evt_handler = kshark_find_event_handler(evt_handler,
						entry->event_id))) {
		evt_handler->event_func(kshark_ctx, rec, entry);
		evt_handler = evt_handler->next;
		if (!evt_handler)
			entry->visible &= ~KS_PLUGIN_UNTOUCHED_MASK;
	}

> 
>> +		pid = entry->pid;
>> +	} else {

In this case the entry has been touched by a plugin. Because of this we 
do not trust the value of "entry->pid".

>> +		data = kshark_read_at(kshark_ctx, entry->offset);
>> +		pid = tep_data_pid(kshark_ctx->pevent, data);
>> +		free_record(data);
> 
> Would it be possible to do:
> 
> 		entry->visible |= KS_PLUGIN_UNTOUCHED_MASK;
> 		entry->pid = pid;
> 
> ?
> 
> Of course this depends on what that mask means.
> 
>> +	}
>> +
>> +	return pid;
>> +}
>> +




[Index of Archives]     [Linux USB Development]     [Linux USB Development]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux