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 69FC0CA9EA0 for ; Fri, 18 Oct 2019 14:40:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 42208222C3 for ; Fri, 18 Oct 2019 14:40:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="jFSOqBde" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2634141AbfJROkc (ORCPT ); Fri, 18 Oct 2019 10:40:32 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:26970 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2410018AbfJROkc (ORCPT ); Fri, 18 Oct 2019 10:40:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571409630; 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=lqBYAyfvGqVBfvQQyb/0J8hd/48vyEbBcTT/es8g2a8=; b=jFSOqBdeeUyrapoZYGsbTVp11SJVvfBO8VNUYHi0z8AsGXOH6lnHRVag7veTte8IuRFhj2 sTTkySeSGH/174pwPIGqHmAjI9HNO01V5xEZzC906uQ05lbQaR8ZooZUxZPahCTRpnDjxc 05o3KNOMz790eJ21+KUQpHRKQrW1PCI= Received: from mail-lf1-f72.google.com (mail-lf1-f72.google.com [209.85.167.72]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-12-FShSDlISMPm3bVlutHFqSA-1; Fri, 18 Oct 2019 10:40:28 -0400 Received: by mail-lf1-f72.google.com with SMTP id c7so1327757lfh.9 for ; Fri, 18 Oct 2019 07:40:28 -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=B/zTxrtPVbDPMk1jNIRjvApKrsIv0Uj3+z7s63i2jdw=; b=cWddvK9qx15r/f/3sliMVEOkgOQsP3kD6xxaakHm0hasy6B8/wAfRA3OKCwsOiOI8Y 0mcX70btzMTZSaP2VHXZvQj8OontRbjO2LKxlI+pXb2i/fNphfm/E2XhEBIu6ktBxMVT zkh/L6K0SmqGrzNiL332Q7BOGNQSnEBS1GgmJJH6zs9U67WXBt6N5cjnrvldwwQxzpuo 6/IpOjHIubXMEZnf/1ukrrelI+IRzAy25LPlJMk4mVTuE92nBuu6ap6+bwC8CukRzgQV 1yJsEjascZt1nRM31p6WodH9rvm1NJf4X9FHx1+xc5Tyc5FYUE9h6Iah8m8XjTJnzsvf MkDA== X-Gm-Message-State: APjAAAXeYDCY8mzCNeAALkUovI0eBIM7GlHEuT1CuhUJUfcQPOX6HByg mj0pMqLRAEVZnS4nCdMFdGqY3MF6oZLCeYNQVR8VnFgecQSDQIWU3Q3GQcSuB3uJ/xUSMhAkS3e IdYyB+7hk+WlW2J9xnAWQUqgWg/Y= X-Received: by 2002:a2e:5dd5:: with SMTP id v82mr6545681lje.54.1571409627129; Fri, 18 Oct 2019 07:40:27 -0700 (PDT) X-Google-Smtp-Source: APXvYqxolQE2snCfRFv7NPp6VkDcPkPnM67ptbRrwbO/RDkqMvooRv8yklzlnAGDuCtp1Rd02Oj9BA== X-Received: by 2002:a2e:5dd5:: with SMTP id v82mr6545664lje.54.1571409626863; Fri, 18 Oct 2019 07:40:26 -0700 (PDT) Received: from alrua-x1.borgediget.toke.dk ([2a00:7660:6da:443::2]) by smtp.gmail.com with ESMTPSA id d25sm2572501lfj.15.2019.10.18.07.40.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Oct 2019 07:40:26 -0700 (PDT) Received: by alrua-x1.borgediget.toke.dk (Postfix, from userid 1000) id 6A8AC1804B6; Fri, 18 Oct 2019 16:40:25 +0200 (CEST) Subject: [PATCH v3 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: Fri, 18 Oct 2019 16:40:25 +0200 Message-ID: <157140962534.2866668.1182822483250825739.stgit@toke.dk> In-Reply-To: <157140962094.2866668.3383184317264069493.stgit@toke.dk> References: <157140962094.2866668.3383184317264069493.stgit@toke.dk> User-Agent: StGit/0.20 MIME-Version: 1.0 X-MC-Unique: FShSDlISMPm3bVlutHFqSA-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 | 19 +++++++++++++++++++ 2 files changed, 57 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..bd8284f04361 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3539,9 +3539,14 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee8021= 1_hw *hw, =09struct ieee80211_tx_data tx; =09ieee80211_tx_result r; =09struct ieee80211_vif *vif =3D txq->vif; +=09u8 ac =3D txq->ac; +=09u32 airtime; =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 +3657,20 @@ 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=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 that to 2**10. +=09=09=09 */ +=09=09=09info->tx_time_est =3D min_t(u32, airtime >> 2, 1 << 10); +=09=09=09ieee80211_sta_update_pending_airtime(local, tx.sta, ac, +=09=09=09=09=09=09=09 airtime, false); +=09=09} +=09} + =09return skb; =20 out: From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120] helo=us-smtp-1.mimecast.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iLTQe-0008LQ-TC for ath10k@lists.infradead.org; Fri, 18 Oct 2019 14:40:34 +0000 Received: by mail-lj1-f199.google.com with SMTP id l15so1124710lje.17 for ; Fri, 18 Oct 2019 07:40:28 -0700 (PDT) Subject: [PATCH v3 4/4] mac80211: Use Airtime-based Queue Limits (AQL) on packet dequeue From: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= Date: Fri, 18 Oct 2019 16:40:25 +0200 Message-ID: <157140962534.2866668.1182822483250825739.stgit@toke.dk> In-Reply-To: <157140962094.2866668.3383184317264069493.stgit@toke.dk> References: <157140962094.2866668.3383184317264069493.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 KysrKysrKysrKysrKysKIG5ldC9tYWM4MDIxMS90eC5jICAgICB8ICAgMTkgKysrKysrKysrKysr KysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA1NyBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEv bmV0L21hYzgwMjExL3N0YXR1cy5jIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCmluZGV4IGFiOGJh NTgzNWNhMC4uOTA1YjRhZmQ0NTdkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhdHVzLmMK KysrIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCkBAIC02NzYsNiArNjc2LDMzIEBAIHN0YXRpYyB2 b2lkIGllZWU4MDIxMV9yZXBvcnRfdXNlZF9za2Ioc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9j YWwsCiAJaWYgKGRyb3BwZWQpCiAJCWFja2VkID0gZmFsc2U7CiAKKwlpZiAoaW5mby0+dHhfdGlt ZV9lc3QpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisJCXN0cnVj dCBzdGFfaW5mbyAqc3RhID0gTlVMTDsKKwkJdTggKnFjLCBhYzsKKwkJaW50IHRpZDsKKworCQly Y3VfcmVhZF9sb2NrKCk7CisKKwkJc2RhdGEgPSBpZWVlODAyMTFfc2RhdGFfZnJvbV9za2IobG9j YWwsIHNrYik7CisJCWlmIChzZGF0YSkKKwkJCXN0YSA9IHN0YV9pbmZvX2dldF9ic3Moc2RhdGEs IHNrYl9tYWNfaGVhZGVyKHNrYikpOworCisJCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRy LT5mcmFtZV9jb250cm9sKSkgeworCQkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsK KwkJCXRpZCA9IHFjWzBdICYgMHhmOworCQkJYWMgPSBpZWVlODAyMTFfYWNfZnJvbV90aWQodGlk KTsKKwkJfSBlbHNlIHsKKwkJCWFjID0gSUVFRTgwMjExX0FDX0JFOworCQl9CisKKwkJaWVlZTgw MjExX3N0YV91cGRhdGVfcGVuZGluZ19haXJ0aW1lKGxvY2FsLCBzdGEsIGFjLAorCQkJCQkJICAg ICBpbmZvLT50eF90aW1lX2VzdCA8PCAyLAorCQkJCQkJICAgICB0cnVlKTsKKwkJcmN1X3JlYWRf dW5sb2NrKCk7CisKKwl9CisKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfSU5URkxf TUxNRV9DT05OX1RYKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwog CkBAIC05MzAsNiArOTU3LDE3IEBAIHN0YXRpYyB2b2lkIF9faWVlZTgwMjExX3R4X3N0YXR1cyhz dHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCXRpZCA9IHFjWzBdICYgMHhmOwogCQl9CiAKKwkJ aWYgKGluZm8tPnR4X3RpbWVfZXN0KSB7CisJCQkvKiBEbyB0aGlzIGhlcmUgdG8gYXZvaWQgdGhl IGV4cGVuc2l2ZSBsb29rdXAgb2YgdGhlIHN0YQorCQkJICogaW4gaWVlZTgwMjExX3JlcG9ydF91 c2VkX3NrYigpLgorCQkJICovCisJCQlpZWVlODAyMTFfc3RhX3VwZGF0ZV9wZW5kaW5nX2FpcnRp bWUobG9jYWwsIHN0YSwKKwkJCQkJCQkgICAgIGllZWU4MDIxMV9hY19mcm9tX3RpZCh0aWQpLAor CQkJCQkJCSAgICAgaW5mby0+dHhfdGltZV9lc3QgPDwgMiwKKwkJCQkJCQkgICAgIHRydWUpOwor CQkJaW5mby0+dHhfdGltZV9lc3QgPSAwOworCQl9CisKIAkJaWYgKCFhY2tlZCAmJiBpZWVlODAy MTFfaXNfYmFja19yZXEoZmMpKSB7CiAJCQl1MTYgY29udHJvbDsKIApkaWZmIC0tZ2l0IGEvbmV0 L21hYzgwMjExL3R4LmMgYi9uZXQvbWFjODAyMTEvdHguYwppbmRleCAxMjY1M2Q4NzNiOGMuLmJk ODI4NGYwNDM2MSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3R4LmMKKysrIGIvbmV0L21hYzgw MjExL3R4LmMKQEAgLTM1MzksOSArMzUzOSwxNCBAQCBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjEx X3R4X2RlcXVldWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJc3RydWN0IGllZWU4MDIxMV90 eF9kYXRhIHR4OwogCWllZWU4MDIxMV90eF9yZXN1bHQgcjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmID0gdHhxLT52aWY7CisJdTggYWMgPSB0eHEtPmFjOworCXUzMiBhaXJ0aW1lOwogCiAJ V0FSTl9PTl9PTkNFKHNvZnRpcnFfY291bnQoKSA9PSAwKTsKIAorCWlmICghaWVlZTgwMjExX3R4 cV9haXJ0aW1lX2NoZWNrKGh3LCB0eHEpKQorCQlyZXR1cm4gTlVMTDsKKwogYmVnaW46CiAJc3Bp bl9sb2NrX2JoKCZmcS0+bG9jayk7CiAKQEAgLTM2NTIsNiArMzY1NywyMCBAQCBzdHJ1Y3Qgc2tf YnVmZiAqaWVlZTgwMjExX3R4X2RlcXVldWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJfQog CiAJSUVFRTgwMjExX1NLQl9DQihza2IpLT5jb250cm9sLnZpZiA9IHZpZjsKKworCWlmIChsb2Nh bC0+YWlydGltZV9mbGFncyAmIEFJUlRJTUVfVVNFX0FRTCkgeworCQlhaXJ0aW1lID0gaWVlZTgw MjExX2NhbGNfZXhwZWN0ZWRfdHhfYWlydGltZShodywgdmlmLCB0eHEtPnN0YSwKKwkJCQkJCQkg ICAgIHNrYi0+bGVuKTsKKwkJaWYgKGFpcnRpbWUpIHsKKwkJCS8qIFdlIG9ubHkgaGF2ZSAxMCBi aXRzIGluIHR4X3RpbWVfZXN0LCBzbyBzdG9yZSBhaXJ0aW1lCisJCQkgKiBpbiBpbmNyZW1lbnRz IG9mIDQgdXMgYW5kIGNsYW1wIHRoYXQgdG8gMioqMTAuCisJCQkgKi8KKwkJCWluZm8tPnR4X3Rp bWVfZXN0ID0gbWluX3QodTMyLCBhaXJ0aW1lID4+IDIsIDEgPDwgMTApOworCQkJaWVlZTgwMjEx X3N0YV91cGRhdGVfcGVuZGluZ19haXJ0aW1lKGxvY2FsLCB0eC5zdGEsIGFjLAorCQkJCQkJCSAg ICAgYWlydGltZSwgZmFsc2UpOworCQl9CisJfQorCiAJcmV0dXJuIHNrYjsKIAogb3V0OgoKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmF0aDEwayBtYWls aW5nIGxpc3QKYXRoMTBrQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVh ZC5vcmcvbWFpbG1hbi9saXN0aW5mby9hdGgxMGsK