"\t           -:[<group>/]<event>\n"
 #ifdef CONFIG_KPROBE_EVENTS
        "\t    place: [<module>:]<symbol>[+<offset>]|<memaddr>\n"
-  "place (kretprobe): [<module>:]<symbol>[+<offset>]|<memaddr>\n"
+  "place (kretprobe): [<module>:]<symbol>[+<offset>]%return|<memaddr>\n"
 #endif
 #ifdef CONFIG_UPROBE_EVENTS
   "   place (uprobe): <path>:<offset>[(ref_ctr_offset)]\n"
 
         *      p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
         *  - Add kretprobe:
         *      r[MAXACTIVE][:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
+        *    Or
+        *      p:[GRP/]EVENT] [MOD:]KSYM[+0]%return [FETCHARGS]
+        *
         * Fetch args:
         *  $retval     : fetch return value
         *  $stack      : fetch stack address
        switch (argv[0][0]) {
        case 'r':
                is_return = true;
-               flags |= TPARG_FL_RETURN;
                break;
        case 'p':
                break;
                symbol = kstrdup(argv[1], GFP_KERNEL);
                if (!symbol)
                        return -ENOMEM;
+
+               tmp = strchr(symbol, '%');
+               if (tmp) {
+                       if (!strcmp(tmp, "%return")) {
+                               *tmp = '\0';
+                               is_return = true;
+                       } else {
+                               trace_probe_log_err(tmp - symbol, BAD_ADDR_SUFFIX);
+                               goto parse_error;
+                       }
+               }
+
                /* TODO: support .init module functions */
                ret = traceprobe_split_symbol_offset(symbol, &offset);
                if (ret || offset < 0 || offset > UINT_MAX) {
                        trace_probe_log_err(0, BAD_PROBE_ADDR);
                        goto parse_error;
                }
+               if (is_return)
+                       flags |= TPARG_FL_RETURN;
                if (kprobe_on_func_entry(NULL, symbol, offset))
                        flags |= TPARG_FL_FENTRY;
                if (offset && is_return && !(flags & TPARG_FL_FENTRY)) {
 
        C(MAXACT_TOO_BIG,       "Maxactive is too big"),                \
        C(BAD_PROBE_ADDR,       "Invalid probed address or symbol"),    \
        C(BAD_RETPROBE,         "Retprobe address must be an function entry"), \
+       C(BAD_ADDR_SUFFIX,      "Invalid probed address suffix"), \
        C(NO_GROUP_NAME,        "Group name is not specified"),         \
        C(GROUP_TOO_LONG,       "Group name is too long"),              \
        C(BAD_GROUP_NAME,       "Group name must follow the same rules as C identifiers"), \