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 30547ECE588 for ; Tue, 15 Oct 2019 17:19:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EF4D120854 for ; Tue, 15 Oct 2019 17:19:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="OLYFNKrd" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730879AbfJORTJ (ORCPT ); Tue, 15 Oct 2019 13:19:09 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:56694 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730579AbfJORTI (ORCPT ); Tue, 15 Oct 2019 13:19:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571159947; 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=GyvbrDu8qEmiyON3oCp/2+bOvx6xuJkqb2dCqG+bTwY=; b=OLYFNKrd+y1DoVjsXyeK4O1rxkkNiGXWoDOsvDuT3zxblaGxW3dad9ECDFFryVbemCAL4N 35B23nliB2jQUkAxcBKBnFUxu7Oq4Ys5awnyZYge1RK4VS5+12pqpGI8QOp+bnrG50maBH ioiPA6cZ4Sh4+ITH0E/uXbjE1nwfc4E= Received: from mail-lf1-f70.google.com (mail-lf1-f70.google.com [209.85.167.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-8-zgcfJpMMOBKvoISG6ZCRDQ-1; Tue, 15 Oct 2019 13:19:05 -0400 Received: by mail-lf1-f70.google.com with SMTP id m17so3926219lfl.11 for ; Tue, 15 Oct 2019 10:19:05 -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=mshGTrJaOuTUiekVjuspbBrpGAw6s+TpOZLBOSqMh18=; b=JPM9+oiTILupgolDTp4bFkGF/w7bM6/Bmsf0lkVAI6g8u7dzHM2BRxqyTyTwgkJqsD k1VZoX4SGrJCqjYVwcZT9yIQqkUCvirNU9PRjoOFhUJnOKNm4ggdtzwbfVtuiuiPpTXp kLONuDuDZi0rHHCLR9p+EJOrwKsl3vgVMyLeHi6fprlo3tvuyW687e30A3WRyBx7xr4h 1ebrli1K5ISXiiJ7UgVgacFBxgmcAkPL7YsPIDpk6rOz3PD5S8J+rLvMWcOZTmaqzLL5 0pswRMh0+U2O5haTi9At/JWKZV6fgFZYLtgdUl3+Tpm2pLSeVKN9hgRXIXcN4jlBvFv8 dKww== X-Gm-Message-State: APjAAAVzd6xiGXc0J0eIQ+uCF2fn2XxbaqApfyXbou11gZBxFZIcWgeK PgjrunioXy410VMpXIyHk5b8BkDO7xQj8MOztOgNC8oKSAF7HFNj5R389Sg56Y+6DFt1ndqiRho CXyE+0yWTQ65Ci4b7BZvl1q64Iok= X-Received: by 2002:ac2:5df0:: with SMTP id z16mr14300264lfq.36.1571159943774; Tue, 15 Oct 2019 10:19:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqwtmWhVJzibU3fbFh0zzmpTOwLDpwyRfz8OIjlJgF3lnE3XdYDXQ1Jt6j749UmjRgzPR7qwpg== X-Received: by 2002:ac2:5df0:: with SMTP id z16mr14300247lfq.36.1571159943542; Tue, 15 Oct 2019 10:19:03 -0700 (PDT) Received: from alrua-x1.borgediget.toke.dk (borgediget.toke.dk. [85.204.121.218]) by smtp.gmail.com with ESMTPSA id z18sm5130432ljh.17.2019.10.15.10.19.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 10:19:02 -0700 (PDT) Received: by alrua-x1.borgediget.toke.dk (Postfix, from userid 1000) id F1C501803A8; Tue, 15 Oct 2019 19:19:01 +0200 (CEST) Subject: [PATCH v2 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: Tue, 15 Oct 2019 19:19:01 +0200 Message-ID: <157115994190.2500430.14955682016008497593.stgit@toke.dk> In-Reply-To: <157115993755.2500430.12214017471129215800.stgit@toke.dk> References: <157115993755.2500430.12214017471129215800.stgit@toke.dk> User-Agent: StGit/0.20 MIME-Version: 1.0 X-MC-Unique: zgcfJpMMOBKvoISG6ZCRDQ-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 | 16 ++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/net/mac80211/status.c b/net/mac80211/status.c index ab8ba5835ca0..ce990a1e9043 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->status.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->status.tx_time_est, +=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->status.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->status.tx_time_est, +=09=09=09=09=09=09=09 true); +=09=09=09info->status.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 405f622b3fe0..b6b47171b340 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,17 @@ 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 + 38); +=09=09if (airtime) { +=09=09=09info->control.tx_time_est =3D airtime; +=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 ([205.139.110.120] helo=us-smtp-1.mimecast.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iKQTW-0006zF-Sb for ath10k@lists.infradead.org; Tue, 15 Oct 2019 17:19:12 +0000 Received: by mail-lj1-f198.google.com with SMTP id i18so4044685ljg.14 for ; Tue, 15 Oct 2019 10:19:05 -0700 (PDT) Subject: [PATCH v2 4/4] mac80211: Use Airtime-based Queue Limits (AQL) on packet dequeue From: =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= Date: Tue, 15 Oct 2019 19:19:01 +0200 Message-ID: <157115994190.2500430.14955682016008497593.stgit@toke.dk> In-Reply-To: <157115993755.2500430.12214017471129215800.stgit@toke.dk> References: <157115993755.2500430.12214017471129215800.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 KysrKysrKysrKysrKysKIG5ldC9tYWM4MDIxMS90eC5jICAgICB8ICAgMTYgKysrKysrKysrKysr KysrKwogMiBmaWxlcyBjaGFuZ2VkLCA1NCBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvbmV0 L21hYzgwMjExL3N0YXR1cy5jIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCmluZGV4IGFiOGJhNTgz NWNhMC4uY2U5OTBhMWU5MDQzIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhdHVzLmMKKysr IGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCkBAIC02NzYsNiArNjc2LDMzIEBAIHN0YXRpYyB2b2lk IGllZWU4MDIxMV9yZXBvcnRfdXNlZF9za2Ioc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWws CiAJaWYgKGRyb3BwZWQpCiAJCWFja2VkID0gZmFsc2U7CiAKKwlpZiAoaW5mby0+c3RhdHVzLnR4 X3RpbWVfZXN0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCQlz dHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IE5VTEw7CisJCXU4ICpxYywgYWM7CisJCWludCB0aWQ7CisK KwkJcmN1X3JlYWRfbG9jaygpOworCisJCXNkYXRhID0gaWVlZTgwMjExX3NkYXRhX2Zyb21fc2ti KGxvY2FsLCBza2IpOworCQlpZiAoc2RhdGEpCisJCQlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNk YXRhLCBza2JfbWFjX2hlYWRlcihza2IpKTsKKworCQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9z KGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhk cik7CisJCQl0aWQgPSBxY1swXSAmIDB4ZjsKKwkJCWFjID0gaWVlZTgwMjExX2FjX2Zyb21fdGlk KHRpZCk7CisJCX0gZWxzZSB7CisJCQlhYyA9IElFRUU4MDIxMV9BQ19CRTsKKwkJfQorCisJCWll ZWU4MDIxMV9zdGFfdXBkYXRlX3BlbmRpbmdfYWlydGltZShsb2NhbCwgc3RhLCBhYywKKwkJCQkJ CSAgICAgaW5mby0+c3RhdHVzLnR4X3RpbWVfZXN0LAorCQkJCQkJICAgICB0cnVlKTsKKwkJcmN1 X3JlYWRfdW5sb2NrKCk7CisKKwl9CisKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhf SU5URkxfTUxNRV9DT05OX1RYKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNk YXRhOwogCkBAIC05MzAsNiArOTU3LDE3IEBAIHN0YXRpYyB2b2lkIF9faWVlZTgwMjExX3R4X3N0 YXR1cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCXRpZCA9IHFjWzBdICYgMHhmOwogCQl9 CiAKKwkJaWYgKGluZm8tPnN0YXR1cy50eF90aW1lX2VzdCkgeworCQkJLyogRG8gdGhpcyBoZXJl IHRvIGF2b2lkIHRoZSBleHBlbnNpdmUgbG9va3VwIG9mIHRoZSBzdGEKKwkJCSAqIGluIGllZWU4 MDIxMV9yZXBvcnRfdXNlZF9za2IoKS4KKwkJCSAqLworCQkJaWVlZTgwMjExX3N0YV91cGRhdGVf cGVuZGluZ19haXJ0aW1lKGxvY2FsLCBzdGEsCisJCQkJCQkJICAgICBpZWVlODAyMTFfYWNfZnJv bV90aWQodGlkKSwKKwkJCQkJCQkgICAgIGluZm8tPnN0YXR1cy50eF90aW1lX2VzdCwKKwkJCQkJ CQkgICAgIHRydWUpOworCQkJaW5mby0+c3RhdHVzLnR4X3RpbWVfZXN0ID0gMDsKKwkJfQorCiAJ CWlmICghYWNrZWQgJiYgaWVlZTgwMjExX2lzX2JhY2tfcmVxKGZjKSkgewogCQkJdTE2IGNvbnRy b2w7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90eC5jIGIvbmV0L21hYzgwMjExL3R4LmMK aW5kZXggNDA1ZjYyMmIzZmUwLi5iNmI0NzE3MWIzNDAgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIx MS90eC5jCisrKyBiL25ldC9tYWM4MDIxMS90eC5jCkBAIC0zNTM5LDkgKzM1MzksMTQgQEAgc3Ry dWN0IHNrX2J1ZmYgKmllZWU4MDIxMV90eF9kZXF1ZXVlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3 LAogCXN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSB0eDsKIAlpZWVlODAyMTFfdHhfcmVzdWx0IHI7 CiAJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHR4cS0+dmlmOworCXU4IGFjID0gdHhxLT5h YzsKKwl1MzIgYWlydGltZTsKIAogCVdBUk5fT05fT05DRShzb2Z0aXJxX2NvdW50KCkgPT0gMCk7 CiAKKwlpZiAoIWllZWU4MDIxMV90eHFfYWlydGltZV9jaGVjayhodywgdHhxKSkKKwkJcmV0dXJu IE5VTEw7CisKIGJlZ2luOgogCXNwaW5fbG9ja19iaCgmZnEtPmxvY2spOwogCkBAIC0zNjUyLDYg KzM2NTcsMTcgQEAgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV90eF9kZXF1ZXVlKHN0cnVjdCBp ZWVlODAyMTFfaHcgKmh3LAogCX0KIAogCUlFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+Y29udHJvbC52 aWYgPSB2aWY7CisKKwlpZiAobG9jYWwtPmFpcnRpbWVfZmxhZ3MgJiBBSVJUSU1FX1VTRV9BUUwp IHsKKwkJYWlydGltZSA9IGllZWU4MDIxMV9jYWxjX2V4cGVjdGVkX3R4X2FpcnRpbWUoaHcsIHZp ZiwgdHhxLT5zdGEsCisJCQkJCQkJICAgICBza2ItPmxlbiArIDM4KTsKKwkJaWYgKGFpcnRpbWUp IHsKKwkJCWluZm8tPmNvbnRyb2wudHhfdGltZV9lc3QgPSBhaXJ0aW1lOworCQkJaWVlZTgwMjEx X3N0YV91cGRhdGVfcGVuZGluZ19haXJ0aW1lKGxvY2FsLCB0eC5zdGEsIGFjLAorCQkJCQkJCSAg ICAgYWlydGltZSwgZmFsc2UpOworCQl9CisJfQorCiAJcmV0dXJuIHNrYjsKIAogb3V0OgoKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmF0aDEwayBtYWls aW5nIGxpc3QKYXRoMTBrQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVh ZC5vcmcvbWFpbG1hbi9saXN0aW5mby9hdGgxMGsK