From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 73407CA9EAB for ; Sat, 19 Oct 2019 11:37:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 411B421D7C for ; Sat, 19 Oct 2019 11:37:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BWcOvuLN" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726276AbfJSLh1 (ORCPT ); Sat, 19 Oct 2019 07:37:27 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:32409 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725912AbfJSLh0 (ORCPT ); Sat, 19 Oct 2019 07:37:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571485045; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MVaudQUuQCI+ljMWLLAsex2zEz8cPUhBc2aoUxPRkR8=; b=BWcOvuLNv5sd3XrirToRijYY47SKmawEq67pkT1OMXCnwQdWSd3bTeGjy62B3W5BSk4E+o wfPek17boDv3Z1Wo0UlGmMf3RHSucmJHliD+ujH7u6mmmWWoY3dX5uIth7amXxNmGdSA1I ekb94G5xkt3eIjEseeXtclveKH/GuTE= Received: from mail-lj1-f198.google.com (mail-lj1-f198.google.com [209.85.208.198]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-206-BjThIq7eM0Gx-bXcFrpW7Q-1; Sat, 19 Oct 2019 07:37:22 -0400 Received: by mail-lj1-f198.google.com with SMTP id m81so1620377lje.4 for ; Sat, 19 Oct 2019 04:37:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:date:message-id:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=KwtZFfw3+zEIBpCSK3JjIjdY2khNQMsybmZnMAvVGWM=; b=oxXi5RR2dKIcq19W184KbDHr5EfrPod6SK2wOBtfb+O1KySWIYtYp3zIBOAYaz5H5H MJvqi40q/HD37W64Vjuw8FyIx42mkZxLh0mckJJclTG2f0UWtcJsWvUqt21XxeZiVUf7 3rdlbjUGPxENWFlK3sfHUgTGeGW+dCNL/dUikvR85XJtPmu1OsFEGZtBaj67n9LkrjL/ dJaMpHscHVRbzZ2XoTIxz2skWTW/dyj0LAx7zrMEg46J8P5VrrHaDGykWjnPZWgXyedI zR2g61ixazDrHzicSz20NjOkv/MvtCuyOVe9thiJdkRJedtC8y7Imy6xl7Q6nvehy8vU kdzA== X-Gm-Message-State: APjAAAWIaeCixlBoZ/GjlsB7sfSjg6dYipxsIvwPIm0lL5Cisk9U/f1t HCvYeA9uL2vSn2WbqPjRXIXWJIlpy6zkKj3za6cw2DBpOZFDimEQNhEHJtSJGW2Pbi2VCYu4Yl6 UNhndvqlHaRVl/JV+WhepmdeKMGQ= X-Received: by 2002:a19:9146:: with SMTP id y6mr645542lfj.11.1571485040858; Sat, 19 Oct 2019 04:37:20 -0700 (PDT) X-Google-Smtp-Source: APXvYqy6A2s0kb12rWbr+kZlB9sAojMXKwZLl1GcZkznDPvWiSSK5d9yqvGSQlvsPztMK75+Z9uVsw== X-Received: by 2002:a19:9146:: with SMTP id y6mr645532lfj.11.1571485040619; Sat, 19 Oct 2019 04:37:20 -0700 (PDT) Received: from alrua-x1.borgediget.toke.dk (borgediget.toke.dk. [85.204.121.218]) by smtp.gmail.com with ESMTPSA id h3sm5459652ljf.12.2019.10.19.04.37.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Oct 2019 04:37:19 -0700 (PDT) Received: by alrua-x1.borgediget.toke.dk (Postfix, from userid 1000) id BD12A1804C8; Sat, 19 Oct 2019 13:37:18 +0200 (CEST) Subject: [PATCH v4 4/4] mac80211: Use Airtime-based Queue Limits (AQL) on packet dequeue From: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= To: Johannes Berg Cc: linux-wireless@vger.kernel.org, make-wifi-fast@lists.bufferbloat.net, ath10k@lists.infradead.org, John Crispin , Lorenzo Bianconi , Felix Fietkau , Kan Yan , Rajkumar Manoharan , Kevin Hayes Date: Sat, 19 Oct 2019 13:37:18 +0200 Message-ID: <157148503865.2989444.7118792679603045723.stgit@toke.dk> In-Reply-To: <157148503415.2989444.7391437309981941226.stgit@toke.dk> References: <157148503415.2989444.7391437309981941226.stgit@toke.dk> User-Agent: StGit/0.20 MIME-Version: 1.0 X-MC-Unique: BjThIq7eM0Gx-bXcFrpW7Q-1 X-Mimecast-Spam-Score: 0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Toke H=C3=B8iland-J=C3=B8rgensen The previous commit added the ability to throttle stations when they queue too much airtime in the hardware. This commit enables the functionality by calculating the expected airtime usage of each packet that is dequeued from the TXQs in mac80211, and accounting that as pending airtime. The estimated airtime for each skb is stored in the tx_info, so we can subtract the same amount from the running total when the skb is freed or recycled. The throttling mechanism relies on this accounting to be accurate (i.e., that we are not freeing skbs without subtracting any airtime they were accounted for), so we put the subtraction into ieee80211_report_used_skb(). As an optimisation, we also subtract the airtime on regular TX completion, zeroing out the value stored in the packet afterwards, to avoid having to do an expensive lookup of the station from the packet data on every packet. This patch does *not* include any mechanism to wake a throttled TXQ again, on the assumption that this will happen anyway as a side effect of whatever freed the skb (most commonly a TX completion). Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen --- net/mac80211/status.c | 38 ++++++++++++++++++++++++++++++++++++++ net/mac80211/tx.c | 21 +++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/net/mac80211/status.c b/net/mac80211/status.c index ab8ba5835ca0..905b4afd457d 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c @@ -676,6 +676,33 @@ static void ieee80211_report_used_skb(struct ieee80211= _local *local, =09if (dropped) =09=09acked =3D false; =20 +=09if (info->tx_time_est) { +=09=09struct ieee80211_sub_if_data *sdata; +=09=09struct sta_info *sta =3D NULL; +=09=09u8 *qc, ac; +=09=09int tid; + +=09=09rcu_read_lock(); + +=09=09sdata =3D ieee80211_sdata_from_skb(local, skb); +=09=09if (sdata) +=09=09=09sta =3D sta_info_get_bss(sdata, skb_mac_header(skb)); + +=09=09if (ieee80211_is_data_qos(hdr->frame_control)) { +=09=09=09qc =3D ieee80211_get_qos_ctl(hdr); +=09=09=09tid =3D qc[0] & 0xf; +=09=09=09ac =3D ieee80211_ac_from_tid(tid); +=09=09} else { +=09=09=09ac =3D IEEE80211_AC_BE; +=09=09} + +=09=09ieee80211_sta_update_pending_airtime(local, sta, ac, +=09=09=09=09=09=09 info->tx_time_est << 2, +=09=09=09=09=09=09 true); +=09=09rcu_read_unlock(); + +=09} + =09if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) { =09=09struct ieee80211_sub_if_data *sdata; =20 @@ -930,6 +957,17 @@ static void __ieee80211_tx_status(struct ieee80211_hw = *hw, =09=09=09tid =3D qc[0] & 0xf; =09=09} =20 +=09=09if (info->tx_time_est) { +=09=09=09/* Do this here to avoid the expensive lookup of the sta +=09=09=09 * in ieee80211_report_used_skb(). +=09=09=09 */ +=09=09=09ieee80211_sta_update_pending_airtime(local, sta, +=09=09=09=09=09=09=09 ieee80211_ac_from_tid(tid), +=09=09=09=09=09=09=09 info->tx_time_est << 2, +=09=09=09=09=09=09=09 true); +=09=09=09info->tx_time_est =3D 0; +=09=09} + =09=09if (!acked && ieee80211_is_back_req(fc)) { =09=09=09u16 control; =20 diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 12653d873b8c..b8ff56d1d661 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3542,6 +3542,9 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211= _hw *hw, =20 =09WARN_ON_ONCE(softirq_count() =3D=3D 0); =20 +=09if (!ieee80211_txq_airtime_check(hw, txq)) +=09=09return NULL; + begin: =09spin_lock_bh(&fq->lock); =20 @@ -3652,6 +3655,24 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee8021= 1_hw *hw, =09} =20 =09IEEE80211_SKB_CB(skb)->control.vif =3D vif; + +=09if (local->airtime_flags & AIRTIME_USE_AQL) { +=09=09u32 airtime; + +=09=09airtime =3D ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta, +=09=09=09=09=09=09=09 skb->len); +=09=09if (airtime) { +=09=09=09/* We only have 10 bits in tx_time_est, so store airtime +=09=09=09 * in increments of 4 us and clamp the maximum to 2**12-1 +=09=09=09 */ +=09=09=09airtime =3D min_t(u32, airtime, 4095) & ~3U; +=09=09=09info->tx_time_est =3D airtime >> 2; +=09=09=09ieee80211_sta_update_pending_airtime(local, tx.sta, +=09=09=09=09=09=09=09 txq->ac, airtime, +=09=09=09=09=09=09=09 false); +=09=09} +=09} + =09return skb; =20 out: From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from us-smtp-1.mimecast.com ([205.139.110.61] helo=us-smtp-delivery-1.mimecast.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iLn30-0003tq-4G for ath10k@lists.infradead.org; Sat, 19 Oct 2019 11:37:27 +0000 Received: by mail-lj1-f197.google.com with SMTP id x13so1612451ljj.18 for ; Sat, 19 Oct 2019 04:37:22 -0700 (PDT) Subject: [PATCH v4 4/4] mac80211: Use Airtime-based Queue Limits (AQL) on packet dequeue From: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= Date: Sat, 19 Oct 2019 13:37:18 +0200 Message-ID: <157148503865.2989444.7118792679603045723.stgit@toke.dk> In-Reply-To: <157148503415.2989444.7391437309981941226.stgit@toke.dk> References: <157148503415.2989444.7391437309981941226.stgit@toke.dk> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "ath10k" Errors-To: ath10k-bounces+kvalo=adurom.com@lists.infradead.org To: Johannes Berg Cc: Kan Yan , Rajkumar Manoharan , Kevin Hayes , make-wifi-fast@lists.bufferbloat.net, linux-wireless@vger.kernel.org, ath10k@lists.infradead.org, John Crispin , Lorenzo Bianconi , Felix Fietkau RnJvbTogVG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2VuIDx0b2tlQHJlZGhhdC5jb20+CgpUaGUgcHJl dmlvdXMgY29tbWl0IGFkZGVkIHRoZSBhYmlsaXR5IHRvIHRocm90dGxlIHN0YXRpb25zIHdoZW4g dGhleSBxdWV1ZQp0b28gbXVjaCBhaXJ0aW1lIGluIHRoZSBoYXJkd2FyZS4gVGhpcyBjb21taXQg ZW5hYmxlcyB0aGUgZnVuY3Rpb25hbGl0eSBieQpjYWxjdWxhdGluZyB0aGUgZXhwZWN0ZWQgYWly dGltZSB1c2FnZSBvZiBlYWNoIHBhY2tldCB0aGF0IGlzIGRlcXVldWVkIGZyb20KdGhlIFRYUXMg aW4gbWFjODAyMTEsIGFuZCBhY2NvdW50aW5nIHRoYXQgYXMgcGVuZGluZyBhaXJ0aW1lLgoKVGhl IGVzdGltYXRlZCBhaXJ0aW1lIGZvciBlYWNoIHNrYiBpcyBzdG9yZWQgaW4gdGhlIHR4X2luZm8s IHNvIHdlIGNhbgpzdWJ0cmFjdCB0aGUgc2FtZSBhbW91bnQgZnJvbSB0aGUgcnVubmluZyB0b3Rh bCB3aGVuIHRoZSBza2IgaXMgZnJlZWQgb3IKcmVjeWNsZWQuIFRoZSB0aHJvdHRsaW5nIG1lY2hh bmlzbSByZWxpZXMgb24gdGhpcyBhY2NvdW50aW5nIHRvIGJlCmFjY3VyYXRlIChpLmUuLCB0aGF0 IHdlIGFyZSBub3QgZnJlZWluZyBza2JzIHdpdGhvdXQgc3VidHJhY3RpbmcgYW55CmFpcnRpbWUg dGhleSB3ZXJlIGFjY291bnRlZCBmb3IpLCBzbyB3ZSBwdXQgdGhlIHN1YnRyYWN0aW9uIGludG8K aWVlZTgwMjExX3JlcG9ydF91c2VkX3NrYigpLiBBcyBhbiBvcHRpbWlzYXRpb24sIHdlIGFsc28g c3VidHJhY3QgdGhlCmFpcnRpbWUgb24gcmVndWxhciBUWCBjb21wbGV0aW9uLCB6ZXJvaW5nIG91 dCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZQpwYWNrZXQgYWZ0ZXJ3YXJkcywgdG8gYXZvaWQgaGF2 aW5nIHRvIGRvIGFuIGV4cGVuc2l2ZSBsb29rdXAgb2YgdGhlCnN0YXRpb24gZnJvbSB0aGUgcGFj a2V0IGRhdGEgb24gZXZlcnkgcGFja2V0LgoKVGhpcyBwYXRjaCBkb2VzICpub3QqIGluY2x1ZGUg YW55IG1lY2hhbmlzbSB0byB3YWtlIGEgdGhyb3R0bGVkIFRYUSBhZ2FpbiwKb24gdGhlIGFzc3Vt cHRpb24gdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGFueXdheSBhcyBhIHNpZGUgZWZmZWN0IG9mIHdo YXRldmVyCmZyZWVkIHRoZSBza2IgKG1vc3QgY29tbW9ubHkgYSBUWCBjb21wbGV0aW9uKS4KClNp Z25lZC1vZmYtYnk6IFRva2UgSMO4aWxhbmQtSsO4cmdlbnNlbiA8dG9rZUByZWRoYXQuY29tPgot LS0KIG5ldC9tYWM4MDIxMS9zdGF0dXMuYyB8ICAgMzggKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKIG5ldC9tYWM4MDIxMS90eC5jICAgICB8ICAgMjEgKysrKysrKysrKysr KysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDU5IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQg YS9uZXQvbWFjODAyMTEvc3RhdHVzLmMgYi9uZXQvbWFjODAyMTEvc3RhdHVzLmMKaW5kZXggYWI4 YmE1ODM1Y2EwLi45MDViNGFmZDQ1N2QgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGF0dXMu YworKysgYi9uZXQvbWFjODAyMTEvc3RhdHVzLmMKQEAgLTY3Niw2ICs2NzYsMzMgQEAgc3RhdGlj IHZvaWQgaWVlZTgwMjExX3JlcG9ydF91c2VkX3NrYihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICps b2NhbCwKIAlpZiAoZHJvcHBlZCkKIAkJYWNrZWQgPSBmYWxzZTsKIAorCWlmIChpbmZvLT50eF90 aW1lX2VzdCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKKwkJc3Ry dWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOworCQl1OCAqcWMsIGFjOworCQlpbnQgdGlkOworCisJ CXJjdV9yZWFkX2xvY2soKTsKKworCQlzZGF0YSA9IGllZWU4MDIxMV9zZGF0YV9mcm9tX3NrYihs b2NhbCwgc2tiKTsKKwkJaWYgKHNkYXRhKQorCQkJc3RhID0gc3RhX2luZm9fZ2V0X2JzcyhzZGF0 YSwgc2tiX21hY19oZWFkZXIoc2tiKSk7CisKKwkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3Fvcyho ZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCQlxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIp OworCQkJdGlkID0gcWNbMF0gJiAweGY7CisJCQlhYyA9IGllZWU4MDIxMV9hY19mcm9tX3RpZCh0 aWQpOworCQl9IGVsc2UgeworCQkJYWMgPSBJRUVFODAyMTFfQUNfQkU7CisJCX0KKworCQlpZWVl ODAyMTFfc3RhX3VwZGF0ZV9wZW5kaW5nX2FpcnRpbWUobG9jYWwsIHN0YSwgYWMsCisJCQkJCQkg ICAgIGluZm8tPnR4X3RpbWVfZXN0IDw8IDIsCisJCQkJCQkgICAgIHRydWUpOworCQlyY3VfcmVh ZF91bmxvY2soKTsKKworCX0KKwogCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9JTlRG TF9NTE1FX0NPTk5fVFgpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7 CiAKQEAgLTkzMCw2ICs5NTcsMTcgQEAgc3RhdGljIHZvaWQgX19pZWVlODAyMTFfdHhfc3RhdHVz KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJdGlkID0gcWNbMF0gJiAweGY7CiAJCX0KIAor CQlpZiAoaW5mby0+dHhfdGltZV9lc3QpIHsKKwkJCS8qIERvIHRoaXMgaGVyZSB0byBhdm9pZCB0 aGUgZXhwZW5zaXZlIGxvb2t1cCBvZiB0aGUgc3RhCisJCQkgKiBpbiBpZWVlODAyMTFfcmVwb3J0 X3VzZWRfc2tiKCkuCisJCQkgKi8KKwkJCWllZWU4MDIxMV9zdGFfdXBkYXRlX3BlbmRpbmdfYWly dGltZShsb2NhbCwgc3RhLAorCQkJCQkJCSAgICAgaWVlZTgwMjExX2FjX2Zyb21fdGlkKHRpZCks CisJCQkJCQkJICAgICBpbmZvLT50eF90aW1lX2VzdCA8PCAyLAorCQkJCQkJCSAgICAgdHJ1ZSk7 CisJCQlpbmZvLT50eF90aW1lX2VzdCA9IDA7CisJCX0KKwogCQlpZiAoIWFja2VkICYmIGllZWU4 MDIxMV9pc19iYWNrX3JlcShmYykpIHsKIAkJCXUxNiBjb250cm9sOwogCmRpZmYgLS1naXQgYS9u ZXQvbWFjODAyMTEvdHguYyBiL25ldC9tYWM4MDIxMS90eC5jCmluZGV4IDEyNjUzZDg3M2I4Yy4u YjhmZjU2ZDFkNjYxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdHguYworKysgYi9uZXQvbWFj ODAyMTEvdHguYwpAQCAtMzU0Miw2ICszNTQyLDkgQEAgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIx MV90eF9kZXF1ZXVlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCiAJV0FSTl9PTl9PTkNFKHNv ZnRpcnFfY291bnQoKSA9PSAwKTsKIAorCWlmICghaWVlZTgwMjExX3R4cV9haXJ0aW1lX2NoZWNr KGh3LCB0eHEpKQorCQlyZXR1cm4gTlVMTDsKKwogYmVnaW46CiAJc3Bpbl9sb2NrX2JoKCZmcS0+ bG9jayk7CiAKQEAgLTM2NTIsNiArMzY1NSwyNCBAQCBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjEx X3R4X2RlcXVldWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJfQogCiAJSUVFRTgwMjExX1NL Ql9DQihza2IpLT5jb250cm9sLnZpZiA9IHZpZjsKKworCWlmIChsb2NhbC0+YWlydGltZV9mbGFn cyAmIEFJUlRJTUVfVVNFX0FRTCkgeworCQl1MzIgYWlydGltZTsKKworCQlhaXJ0aW1lID0gaWVl ZTgwMjExX2NhbGNfZXhwZWN0ZWRfdHhfYWlydGltZShodywgdmlmLCB0eHEtPnN0YSwKKwkJCQkJ CQkgICAgIHNrYi0+bGVuKTsKKwkJaWYgKGFpcnRpbWUpIHsKKwkJCS8qIFdlIG9ubHkgaGF2ZSAx MCBiaXRzIGluIHR4X3RpbWVfZXN0LCBzbyBzdG9yZSBhaXJ0aW1lCisJCQkgKiBpbiBpbmNyZW1l bnRzIG9mIDQgdXMgYW5kIGNsYW1wIHRoZSBtYXhpbXVtIHRvIDIqKjEyLTEKKwkJCSAqLworCQkJ YWlydGltZSA9IG1pbl90KHUzMiwgYWlydGltZSwgNDA5NSkgJiB+M1U7CisJCQlpbmZvLT50eF90 aW1lX2VzdCA9IGFpcnRpbWUgPj4gMjsKKwkJCWllZWU4MDIxMV9zdGFfdXBkYXRlX3BlbmRpbmdf YWlydGltZShsb2NhbCwgdHguc3RhLAorCQkJCQkJCSAgICAgdHhxLT5hYywgYWlydGltZSwKKwkJ CQkJCQkgICAgIGZhbHNlKTsKKwkJfQorCX0KKwogCXJldHVybiBza2I7CiAKIG91dDoKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwphdGgxMGsgbWFpbGlu ZyBsaXN0CmF0aDEwa0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vYXRoMTBrCg==