Received: by 10.223.185.116 with SMTP id b49csp1808796wrg; Sun, 11 Feb 2018 22:02:53 -0800 (PST) X-Google-Smtp-Source: AH8x224EEBntb/B8un7MqwiWEJIYACOseyuZTW18Ib0vhNqf6ERjFnulRMHtsgULs/nF8fS2yeqw X-Received: by 10.98.147.85 with SMTP id b82mr10706919pfe.203.1518415373845; Sun, 11 Feb 2018 22:02:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518415373; cv=none; d=google.com; s=arc-20160816; b=Sk5bXBvTHNJgVPy7NrbxQgKuw4FFnO6DszRi9BaECj1s1XKPF0DQdnmJKHB3qs36n9 pdZTRIl82p9egcjpM7+YgLR3RjSkvSFQ7vNT93+AABHv4Zn/YFaf6gt1Rkc+UvkvmciO VpCKRH210mBcYzYs6gWD44/J1VvOHIIsJFERKH5i2snN4a27v6eRYli2tKHSjRadEQRz KvIjFhJiEv5hrN+Ds8UeUwVInEmIWBp8OR1vmQ0jVP8wcRkwjecQpn8VO8faFQ3mPz8q 7HodzjX+msfY4NiyPqVbIB/wxAJpzfAwhpDnKGN/1xWcF/OmtbUGzWiM/8F6X6t1CUK3 kcWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:subject:message-id:date:from :mime-version:dkim-signature:arc-authentication-results; bh=JVq8+1jqK1PXJYfwjz7Mdf78FbPOdVMAy5e/23M928I=; b=Mwz0H6xl/DG4DzEl90cLAhOIFiOmg9OWnfXtOF3pnVTzUpjkIONvYB4015rvgtmLnu P1COfWRVSLi3EAHbR5L0W8DmTz2SsDFbxkwlV6fotKowoMauYt3nFq1cZVvwBolIwaKa zE28KxUFKAc2N3JPnmo2ZdaQQSGYb+MIrZSjdcW/BS+4k/zgLdqaMHRxLigkTygpPiWH 2xHx4k7CQHUT/EAWugA7TJpEfVFRZHsdVrKW0A93jjnf7xqeqKi6iZ3VEvg84drWpwJ3 JdhZI0OFtN0iAXQJ5g9ya4qbMiKtdefAJDc4hdj4g4CBDhrB17R9uI6imvOZNaO9FANm j95w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kent-edu.20150623.gappssmtp.com header.s=20150623 header.b=cE0LZYQN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q3si5869764pfi.305.2018.02.11.22.02.39; Sun, 11 Feb 2018 22:02:53 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kent-edu.20150623.gappssmtp.com header.s=20150623 header.b=cE0LZYQN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751284AbeBLFIu (ORCPT + 99 others); Mon, 12 Feb 2018 00:08:50 -0500 Received: from mail-oi0-f68.google.com ([209.85.218.68]:37964 "EHLO mail-oi0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751244AbeBLFIs (ORCPT ); Mon, 12 Feb 2018 00:08:48 -0500 Received: by mail-oi0-f68.google.com with SMTP id j15so10235074oii.5 for ; Sun, 11 Feb 2018 21:08:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kent-edu.20150623.gappssmtp.com; s=20150623; h=mime-version:from:date:message-id:subject:to; bh=JVq8+1jqK1PXJYfwjz7Mdf78FbPOdVMAy5e/23M928I=; b=cE0LZYQNnExPsX1Yluy/BDNXSGqYWn/DteXP6g8Q/L1mQbVPQW5HPFJpdd7NNvaAfN 0/4oE0cR+PttgMA0ICnv+Xkb94FNdOqjTh8DIiUsqrZs5gEZkGPGWJP7eWgAN/IZJdlU h52nl3avpWbq+nLuYq4zWQhyF6DNzAcCuHg0JoxwWK72yJE/hWCWtVWKg/OOtvT5CyPb AOsO5I224ie+h2dpGGs+usixfamhtEXnoyWLtYCxq6JxfpEDAe2EbiwNvz0TSyutMjlH YbDNr8gvkCW0/zbvLUaXkptn/4iPiBGst2+6ShbIND5aTA7SJhzBUfTXApPPe3/AHxU7 3row== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=JVq8+1jqK1PXJYfwjz7Mdf78FbPOdVMAy5e/23M928I=; b=g2pUCvGPOjxty7TvSTsKDDgOyyhxYkT618poTlaqxpPFEwoULa8XG79BaPft2iA/cA DVXEvesT+NXL35gVmIL1aaBp0i+VpgcDogab5Ans8ehHyltcOkr7RWJ2Ojj+0KnZOFyl dDbAxtgz3jUL+GsoUhxBompDyilPfSB8S/kDKyJp1d4UqPnBmAuWzBl33w0rnpTm6x3d jH92+qiNIWDs67qRlSL6infB1Iy1//PQhNITMiMIoBqSK7IHzUdhTYKc6WFv343uJIz8 m4zMTjYSIU9/G0KvWcYGMIcIzODoIdcaarA1uUZ79dK/8SM2K/QeAo3VfRC70oYW8592 iDKg== X-Gm-Message-State: APf1xPCDPbk4qgOn+PWCyM6vFXudpbfEtSVj0gBbA7Wco+KgoyZIR9nR 2YGp0o+HRQmnyJX2gCSeQ7vo/T1VCk5fzw+2+c/2IQ== X-Received: by 10.202.240.2 with SMTP id o2mr6536255oih.341.1518412127113; Sun, 11 Feb 2018 21:08:47 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.38.103 with HTTP; Sun, 11 Feb 2018 21:08:46 -0800 (PST) From: "Md. Islam" Date: Mon, 12 Feb 2018 00:08:46 -0500 Message-ID: Subject: [PATCH net-next] trace_events_filter: conditional trace event (tcp_probe full=0) To: tom.zanussi@linux.intel.com, Masami Hiramatsu , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, stephen@networkplumber.org, mathieu.desnoyers@polymtl.ca Content-Type: multipart/mixed; boundary="94eb2c0956107622970564fcdfe7" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --94eb2c0956107622970564fcdfe7 Content-Type: text/plain; charset="UTF-8" Recently tcp_probe kernel module has been replaced by trace_event. Old tcp_probe had full=0 option where it only takes a snapshot only when congestion window is changed. However I did not find such functionality in trace_event. This is why I implemented this "conditional trace_event" where a snapshot is taken only if some field is changed. For instance, following filter will record a snapshot only if snd_cwnd field is changed from the previous snapshot: cd /sys/kernel/debug/tracing echo 1 > events/tcp/tcp_probe/enable echo "(sport == 8554 && snd_cwnd =< 0)" > events/tcp/tcp_probe/filter & cat trace_pipe > /home/tamim/net-next/trace.data This will record a snapshot where source port is 8554 and snd_cwnd is not same as the snd_cwnd in previous snapshot. For lack of better operator, I used "=<" to represent the field on which the filter will be applied. The way it works is, it updates the predicate with new value every time. So the next time, if the field is same as in the predicate, the snapshot is ignored. Initially it checks if the field is 0 or not. diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 61e7f06..8d733fa 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -39,6 +39,7 @@ enum filter_op_ids OP_AND, OP_GLOB, OP_NE, + OP_NE_PREV, OP_EQ, OP_LT, OP_LE, @@ -62,6 +63,7 @@ static struct filter_op filter_ops[] = { { OP_AND, "&&", 2 }, { OP_GLOB, "~", 4 }, { OP_NE, "!=", 4 }, + { OP_NE_PREV, "=<", 4 }, { OP_EQ, "==", 4 }, { OP_LT, "<", 5 }, { OP_LE, "<=", 5 }, @@ -202,6 +204,21 @@ static int filter_pred_##size(struct filter_pred *pred, void *event) \ return match; \ } +#define DEFINE_NE_PREV_PRED(size) \ +static int filter_ne_prev_pred_##size(struct filter_pred *pred, void *event) \ +{ \ + u##size *addr = (u##size *)(event + pred->offset); \ + u##size val = (u##size)pred->val; \ + int match; \ + \ + match = (val == *addr) ^ pred->not; \ + \ + if(match == 1) \ + pred->val = *addr; \ + return match; \ +} + + DEFINE_COMPARISON_PRED(s64); DEFINE_COMPARISON_PRED(u64); DEFINE_COMPARISON_PRED(s32); @@ -216,6 +233,11 @@ DEFINE_EQUALITY_PRED(32); DEFINE_EQUALITY_PRED(16); DEFINE_EQUALITY_PRED(8); +DEFINE_NE_PREV_PRED(64); +DEFINE_NE_PREV_PRED(32); +DEFINE_NE_PREV_PRED(16); +DEFINE_NE_PREV_PRED(8); + /* Filter predicate for fixed sized arrays of characters */ static int filter_pred_string(struct filter_pred *pred, void *event) { @@ -980,7 +1002,7 @@ int filter_assign_type(const char *type) static bool is_legal_op(struct ftrace_event_field *field, enum filter_op_ids op) { if (is_string_field(field) && - (op != OP_EQ && op != OP_NE && op != OP_GLOB)) + (op != OP_EQ && op != OP_NE && op != OP_GLOB && op != OP_NE_PREV)) return false; if (!is_string_field(field) && op == OP_GLOB) return false; @@ -997,6 +1019,8 @@ static filter_pred_fn_t select_comparison_fn(enum filter_op_ids op, case 8: if (op == OP_EQ || op == OP_NE) fn = filter_pred_64; + else if (op == OP_NE_PREV) + fn = filter_ne_prev_pred_64; else if (field_is_signed) fn = pred_funcs_s64[op - PRED_FUNC_START]; else @@ -1005,6 +1029,8 @@ static filter_pred_fn_t select_comparison_fn(enum filter_op_ids op, case 4: if (op == OP_EQ || op == OP_NE) fn = filter_pred_32; + else if (op == OP_NE_PREV) + fn = filter_ne_prev_pred_32; else if (field_is_signed) fn = pred_funcs_s32[op - PRED_FUNC_START]; else @@ -1013,6 +1039,8 @@ static filter_pred_fn_t select_comparison_fn(enum filter_op_ids op, case 2: if (op == OP_EQ || op == OP_NE) fn = filter_pred_16; + else if (op == OP_NE_PREV) + fn = filter_ne_prev_pred_16; else if (field_is_signed) fn = pred_funcs_s16[op - PRED_FUNC_START]; else @@ -1021,6 +1049,8 @@ static filter_pred_fn_t select_comparison_fn(enum filter_op_ids op, case 1: if (op == OP_EQ || op == OP_NE) fn = filter_pred_8; + else if (op == OP_NE_PREV) + fn = filter_ne_prev_pred_8; else if (field_is_signed) fn = pred_funcs_s8[op - PRED_FUNC_START]; else @@ -1088,7 +1118,7 @@ static int init_pred(struct filter_parse_state *ps, } } - if (pred->op == OP_NE) + if (pred->op == OP_NE || pred->op == OP_NE_PREV) pred->not ^= 1; pred->fn = fn; @@ -2197,7 +2227,7 @@ static int ftrace_function_check_pred(struct filter_pred *pred, int leaf) * - only '==' and '!=' is used * - the 'ip' field is used */ - if ((pred->op != OP_EQ) && (pred->op != OP_NE)) + if ((pred->op != OP_EQ) && (pred->op != OP_NE) && (pred->op != OP_NE_PREV)) return -EINVAL; if (strcmp(field->name, "ip")) I'm new to upstream kernel development. Please let me any suggestion. Many thanks Tamim PhD Candidate, Kent State University --94eb2c0956107622970564fcdfe7 Content-Type: text/x-patch; charset="US-ASCII"; name="conditional_traceevent.patch" Content-Disposition: attachment; filename="conditional_traceevent.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_jdjqvjm90 ZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMgYi9rZXJuZWwv dHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jCmluZGV4IDYxZTdmMDYuLjhkNzMzZmEgMTAwNjQ0 Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMKKysrIGIva2VybmVsL3Ry YWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYwpAQCAtMzksNiArMzksNyBAQCBlbnVtIGZpbHRlcl9v cF9pZHMKIAlPUF9BTkQsCiAJT1BfR0xPQiwKIAlPUF9ORSwKKyAgICAgICAgT1BfTkVfUFJFViwg ICAgICAgIAogCU9QX0VRLAogCU9QX0xULAogCU9QX0xFLApAQCAtNjIsNiArNjMsNyBAQCBzdGF0 aWMgc3RydWN0IGZpbHRlcl9vcCBmaWx0ZXJfb3BzW10gPSB7CiAJeyBPUF9BTkQsCSImJiIsCQky IH0sCiAJeyBPUF9HTE9CLAkifiIsCQk0IH0sCiAJeyBPUF9ORSwJIiE9IiwJCTQgfSwKKwl7IE9Q X05FX1BSRVYsICAgIj08IiwJCTQgfSwgICAgICAgIAogCXsgT1BfRVEsCSI9PSIsCQk0IH0sCiAJ eyBPUF9MVCwJIjwiLAkJNSB9LAogCXsgT1BfTEUsCSI8PSIsCQk1IH0sCkBAIC0yMDIsNiArMjA0 LDIxIEBAIHN0YXRpYyBpbnQgZmlsdGVyX3ByZWRfIyNzaXplKHN0cnVjdCBmaWx0ZXJfcHJlZCAq cHJlZCwgdm9pZCAqZXZlbnQpCVwKIAlyZXR1cm4gbWF0Y2g7CQkJCQkJCVwKIH0KIAorI2RlZmlu ZSBERUZJTkVfTkVfUFJFVl9QUkVEKHNpemUpCQkJCQlcCitzdGF0aWMgaW50IGZpbHRlcl9uZV9w cmV2X3ByZWRfIyNzaXplKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQpCVwK K3sJCQkJCQkJCQlcCisJdSMjc2l6ZSAqYWRkciA9ICh1IyNzaXplICopKGV2ZW50ICsgcHJlZC0+ b2Zmc2V0KTsJCVwKKwl1IyNzaXplIHZhbCA9ICh1IyNzaXplKXByZWQtPnZhbDsJCQkJXAorCWlu dCBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisJCQkJCQkJCQlcCisJbWF0Y2ggPSAodmFsID09ICphZGRyKSBeIHByZWQtPm5vdDsJ CQkJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZihtYXRjaCA9PSAxKSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAg IHByZWQtPnZhbCA9ICphZGRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorCXJldHVybiBtYXRjaDsJCQkJCQkJXAorfQorCisKIERFRklORV9DT01QQVJJU09OX1BSRUQo czY0KTsKIERFRklORV9DT01QQVJJU09OX1BSRUQodTY0KTsKIERFRklORV9DT01QQVJJU09OX1BS RUQoczMyKTsKQEAgLTIxNiw2ICsyMzMsMTEgQEAgREVGSU5FX0VRVUFMSVRZX1BSRUQoMzIpOwog REVGSU5FX0VRVUFMSVRZX1BSRUQoMTYpOwogREVGSU5FX0VRVUFMSVRZX1BSRUQoOCk7CiAKK0RF RklORV9ORV9QUkVWX1BSRUQoNjQpOworREVGSU5FX05FX1BSRVZfUFJFRCgzMik7CitERUZJTkVf TkVfUFJFVl9QUkVEKDE2KTsKK0RFRklORV9ORV9QUkVWX1BSRUQoOCk7CisKIC8qIEZpbHRlciBw cmVkaWNhdGUgZm9yIGZpeGVkIHNpemVkIGFycmF5cyBvZiBjaGFyYWN0ZXJzICovCiBzdGF0aWMg aW50IGZpbHRlcl9wcmVkX3N0cmluZyhzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQsIHZvaWQgKmV2 ZW50KQogewpAQCAtOTgwLDcgKzEwMDIsNyBAQCBpbnQgZmlsdGVyX2Fzc2lnbl90eXBlKGNvbnN0 IGNoYXIgKnR5cGUpCiBzdGF0aWMgYm9vbCBpc19sZWdhbF9vcChzdHJ1Y3QgZnRyYWNlX2V2ZW50 X2ZpZWxkICpmaWVsZCwgZW51bSBmaWx0ZXJfb3BfaWRzIG9wKQogewogCWlmIChpc19zdHJpbmdf ZmllbGQoZmllbGQpICYmCi0JICAgIChvcCAhPSBPUF9FUSAmJiBvcCAhPSBPUF9ORSAmJiBvcCAh PSBPUF9HTE9CKSkKKwkgICAgKG9wICE9IE9QX0VRICYmIG9wICE9IE9QX05FICYmIG9wICE9IE9Q X0dMT0IgJiYgb3AgIT0gT1BfTkVfUFJFVikpCiAJCXJldHVybiBmYWxzZTsKIAlpZiAoIWlzX3N0 cmluZ19maWVsZChmaWVsZCkgJiYgb3AgPT0gT1BfR0xPQikKIAkJcmV0dXJuIGZhbHNlOwpAQCAt OTk3LDYgKzEwMTksOCBAQCBzdGF0aWMgZmlsdGVyX3ByZWRfZm5fdCBzZWxlY3RfY29tcGFyaXNv bl9mbihlbnVtIGZpbHRlcl9vcF9pZHMgb3AsCiAJY2FzZSA4OgogCQlpZiAob3AgPT0gT1BfRVEg fHwgb3AgPT0gT1BfTkUpCiAJCQlmbiA9IGZpbHRlcl9wcmVkXzY0OworICAgICAgICAgICAgICAg IGVsc2UgaWYgKG9wID09IE9QX05FX1BSRVYpCisJCQlmbiA9IGZpbHRlcl9uZV9wcmV2X3ByZWRf NjQ7CiAJCWVsc2UgaWYgKGZpZWxkX2lzX3NpZ25lZCkKIAkJCWZuID0gcHJlZF9mdW5jc19zNjRb b3AgLSBQUkVEX0ZVTkNfU1RBUlRdOwogCQllbHNlCkBAIC0xMDA1LDYgKzEwMjksOCBAQCBzdGF0 aWMgZmlsdGVyX3ByZWRfZm5fdCBzZWxlY3RfY29tcGFyaXNvbl9mbihlbnVtIGZpbHRlcl9vcF9p ZHMgb3AsCiAJY2FzZSA0OgogCQlpZiAob3AgPT0gT1BfRVEgfHwgb3AgPT0gT1BfTkUpCiAJCQlm biA9IGZpbHRlcl9wcmVkXzMyOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wID09IE9QX05F X1BSRVYpCisJCQlmbiA9IGZpbHRlcl9uZV9wcmV2X3ByZWRfMzI7ICAgICAgICAgICAgICAgIAog CQllbHNlIGlmIChmaWVsZF9pc19zaWduZWQpCiAJCQlmbiA9IHByZWRfZnVuY3NfczMyW29wIC0g UFJFRF9GVU5DX1NUQVJUXTsKIAkJZWxzZQpAQCAtMTAxMyw2ICsxMDM5LDggQEAgc3RhdGljIGZp bHRlcl9wcmVkX2ZuX3Qgc2VsZWN0X2NvbXBhcmlzb25fZm4oZW51bSBmaWx0ZXJfb3BfaWRzIG9w LAogCWNhc2UgMjoKIAkJaWYgKG9wID09IE9QX0VRIHx8IG9wID09IE9QX05FKQogCQkJZm4gPSBm aWx0ZXJfcHJlZF8xNjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChvcCA9PSBPUF9ORV9QUkVW KQorCQkJZm4gPSBmaWx0ZXJfbmVfcHJldl9wcmVkXzE2OyAgICAgICAgICAgICAgICAKIAkJZWxz ZSBpZiAoZmllbGRfaXNfc2lnbmVkKQogCQkJZm4gPSBwcmVkX2Z1bmNzX3MxNltvcCAtIFBSRURf RlVOQ19TVEFSVF07CiAJCWVsc2UKQEAgLTEwMjEsNiArMTA0OSw4IEBAIHN0YXRpYyBmaWx0ZXJf cHJlZF9mbl90IHNlbGVjdF9jb21wYXJpc29uX2ZuKGVudW0gZmlsdGVyX29wX2lkcyBvcCwKIAlj YXNlIDE6CiAJCWlmIChvcCA9PSBPUF9FUSB8fCBvcCA9PSBPUF9ORSkKIAkJCWZuID0gZmlsdGVy X3ByZWRfODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChvcCA9PSBPUF9ORV9QUkVWKQorCQkJ Zm4gPSBmaWx0ZXJfbmVfcHJldl9wcmVkXzg7ICAgICAgICAgICAgICAgIAogCQllbHNlIGlmIChm aWVsZF9pc19zaWduZWQpCiAJCQlmbiA9IHByZWRfZnVuY3Nfczhbb3AgLSBQUkVEX0ZVTkNfU1RB UlRdOwogCQllbHNlCkBAIC0xMDg4LDcgKzExMTgsNyBAQCBzdGF0aWMgaW50IGluaXRfcHJlZChz dHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywKIAkJfQogCX0KIAotCWlmIChwcmVkLT5vcCA9 PSBPUF9ORSkKKwlpZiAocHJlZC0+b3AgPT0gT1BfTkUgfHwgcHJlZC0+b3AgPT0gT1BfTkVfUFJF VikKIAkJcHJlZC0+bm90IF49IDE7CiAKIAlwcmVkLT5mbiA9IGZuOwpAQCAtMjE5Nyw3ICsyMjI3 LDcgQEAgc3RhdGljIGludCBmdHJhY2VfZnVuY3Rpb25fY2hlY2tfcHJlZChzdHJ1Y3QgZmlsdGVy X3ByZWQgKnByZWQsIGludCBsZWFmKQogCQkgKiAgLSBvbmx5ICc9PScgYW5kICchPScgaXMgdXNl ZAogCQkgKiAgLSB0aGUgJ2lwJyBmaWVsZCBpcyB1c2VkCiAJCSAqLwotCQlpZiAoKHByZWQtPm9w ICE9IE9QX0VRKSAmJiAocHJlZC0+b3AgIT0gT1BfTkUpKQorCQlpZiAoKHByZWQtPm9wICE9IE9Q X0VRKSAmJiAocHJlZC0+b3AgIT0gT1BfTkUpICYmIChwcmVkLT5vcCAhPSBPUF9ORV9QUkVWKSkK IAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWlmIChzdHJjbXAoZmllbGQtPm5hbWUsICJpcCIpKQo= --94eb2c0956107622970564fcdfe7--