diff options
Diffstat (limited to 'kernel/trace/trace_events_inject.c')
| -rw-r--r-- | kernel/trace/trace_events_inject.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/trace/trace_events_inject.c b/kernel/trace/trace_events_inject.c index c188045c5f97..d6b4935a78c0 100644 --- a/kernel/trace/trace_events_inject.c +++ b/kernel/trace/trace_events_inject.c @@ -168,10 +168,14 @@ static void *trace_alloc_entry(struct trace_event_call *call, int *size)  			continue;  		if (field->filter_type == FILTER_STATIC_STRING)  			continue; -		if (field->filter_type == FILTER_DYN_STRING) { +		if (field->filter_type == FILTER_DYN_STRING || +		    field->filter_type == FILTER_RDYN_STRING) {  			u32 *str_item;  			int str_loc = entry_size & 0xffff; +			if (field->filter_type == FILTER_RDYN_STRING) +				str_loc -= field->offset + field->size; +  			str_item = (u32 *)(entry + field->offset);  			*str_item = str_loc; /* string length is 0. */  		} else { @@ -214,7 +218,8 @@ static int parse_entry(char *str, struct trace_event_call *call, void **pentry)  			if (field->filter_type == FILTER_STATIC_STRING) {  				strlcpy(entry + field->offset, addr, field->size); -			} else if (field->filter_type == FILTER_DYN_STRING) { +			} else if (field->filter_type == FILTER_DYN_STRING || +				   field->filter_type == FILTER_RDYN_STRING) {  				int str_len = strlen(addr) + 1;  				int str_loc = entry_size & 0xffff;  				u32 *str_item; @@ -229,6 +234,8 @@ static int parse_entry(char *str, struct trace_event_call *call, void **pentry)  				strlcpy(entry + (entry_size - str_len), addr, str_len);  				str_item = (u32 *)(entry + field->offset); +				if (field->filter_type == FILTER_RDYN_STRING) +					str_loc -= field->offset + field->size;  				*str_item = (str_len << 16) | str_loc;  			} else {  				char **paddr;  |