diff options
author | sirlucjan | 2017-03-20 16:53:29 +0100 |
---|---|---|
committer | sirlucjan | 2017-03-20 16:53:29 +0100 |
commit | 9616eee69667bc054a917453737027a04ca240b3 (patch) | |
tree | c51c2fc876fdc70f8e441e617718c7f7c1680fc6 | |
parent | 0a30b581a4d7f9c71cd2d170356be69294bc93ec (diff) | |
download | aur-9616eee69667bc054a917453737027a04ca240b3.tar.gz |
Add BFQ bugfix && sync with -ARCH
-rw-r--r-- | .SRCINFO | 8 | ||||
-rw-r--r-- | 0006-BFQ-bugfix.patch | 341 | ||||
-rw-r--r-- | 90-linux.hook (renamed from 99-linux.hook) | 0 | ||||
-rw-r--r-- | PKGBUILD | 14 |
4 files changed, 354 insertions, 9 deletions
@@ -1,6 +1,6 @@ pkgbase = linux-rt-bfq pkgver = 4.9.13.12 - pkgrel = 2 + pkgrel = 3 url = http://algo.ing.unimo.it arch = i686 arch = x86_64 @@ -24,9 +24,10 @@ pkgbase = linux-rt-bfq source = fix-race-in-PRT-wait-for-completion-simple-wait-code_Nvidia-RT-160319.patch source = config source = config.x86_64 - source = 99-linux.hook + source = 90-linux.hook source = linux.preset source = 0005-BFQ-update-to-v8r8.patch + source = 0006-BFQ-bugfix.patch source = 0001-tty-n_hdlc-get-rid-of-racy-n_hdlc_tbuf.patch validpgpkeys = ABAF11C65A2970B130ABE3C479BE3E4300411886 validpgpkeys = 647F28654894E3BD457199BE38DBBDC86092693E @@ -43,7 +44,7 @@ pkgbase = linux-rt-bfq sha512sums = 953566f2b74415cd5113882352c8518234c399e0e0a6cc118ddfa259c65d6fc30de00f25b605489d53e0b1f948bc7b3ebf8f20b970538f5bf7de5a7f33a0f641 sha512sums = 8fed8499a52d685e81a1cffac7e6764a3720a923c3a3e4ccec33a4b0145dc84c24172363ff5574608d80c10462a4e824ef1b5ad3e5e5187f816e16adab774700 sha512sums = 93338e0ae23d2832e4dc75b1b4dc6d2ba34d621a71c7951f1e70ddd483d091211b2aa429683b21a7f9cf2152e2d974b6a1a8cc7b0d6549a7f639870b07f5295e - sha512sums = ab781ca0315316043d2074ad925288616ff4935e0c91b09090cd2a2cc392845eddf1c93b5dadda0eb434050459b51a4e2587e5099e6a9204d0d13b7f427d399c + sha512sums = 77d80d50d8c4323ed36fd2097ba9f6b49bb8d7cae59d32ffa76b309758a7e9f972d26fedd77046d88ce2691bb01a07909f8bdc34ba214414be3bc030ee31994d sha512sums = d9d28e02e964704ea96645a5107f8b65cae5f4fb4f537e224e5e3d087fd296cb770c29ac76e0ce95d173bc420ea87fb8f187d616672a60a0cae618b0ef15b8c8 sha512sums = 86f717f596c613db3bc40624fd956ed379b8a2a20d1d99e076ae9061251fe9afba39cf536623eccd970258e124b8c2c05643e3d539f37bd910e02dc5dd498749 sha512sums = e7c8fd3dd50272518323ac5f27e7e911e8138dbe1268865b5cc343e1c84d531e91d3581cd11df9513952d02e213e916d0c28ecd19acf2660519fc040dfaabb94 @@ -51,6 +52,7 @@ pkgbase = linux-rt-bfq sha512sums = d6faa67f3ef40052152254ae43fee031365d0b1524aa0718b659eb75afc21a3f79ea8d62d66ea311a800109bed545bc8f79e8752319cd378eef2cbd3a09aba22 sha512sums = 2dc6b0ba8f7dbf19d2446c5c5f1823587de89f4e28e9595937dd51a87755099656f2acec50e3e2546ea633ad1bfd1c722e0c2b91eef1d609103d8abdc0a7cbaf sha512sums = dab3dba300e276dd552cb86c903af5cac9f7c7954b938ac9c300745a175198c553d84cd3a5e58c350d83160f33b07f6dd20a570da4afdce178464c402ac7829b + sha512sums = 2fbe9ddf40a64f9b80ab3b4868e358ea678b4122742884b7c484041a913757627d1c6b0ee6e2ef46fe90d82e7e29e6332d3b6155d56355d274fdf551f8a8ef70 sha512sums = 397fc751697cc4e2ceb7e6d854f5e7fc115ed8511df406ffe5d8f80afeec385ba64cd28c4666bb206612fdcd7a578b60ca6ff125c2138c615aee6135d86b0197 pkgname = linux-rt-bfq diff --git a/0006-BFQ-bugfix.patch b/0006-BFQ-bugfix.patch new file mode 100644 index 000000000000..68be7f5fe705 --- /dev/null +++ b/0006-BFQ-bugfix.patch @@ -0,0 +1,341 @@ +From 2da7edbb8f54b447c0b7dfa029ee4df580a6030e Mon Sep 17 00:00:00 2001 +From: Paolo Valente <paolo.valente@linaro.org> +Date: Thu, 16 Mar 2017 14:36:41 +0100 +Subject: [PATCH] BUGIFX: remove use of bfq queues after free + +bfq queues occasionally happened to be used after being freed, because +they were accessed after some invocations of bfq_put_queue that could +cause them to be freed. This commit refactors code, when needed, to +avoid any occurrence of such a use-after-free of a bfq queue. This +commit also adds comments to make references to bfq queues easier to +follow. + +Signed-off-by: Paolo Valente <paolo.valente@linaro.org> +--- + block/bfq-cgroup.c | 1 - + block/bfq-iosched.c | 36 ++++++++++++++++++--------- + block/bfq-sched.c | 71 ++++++++++++++++++++++++++++++++++++----------------- + 3 files changed, 73 insertions(+), 35 deletions(-) + +diff --git a/block/bfq-cgroup.c b/block/bfq-cgroup.c +index de045cf..a66a723 100644 +--- a/block/bfq-cgroup.c ++++ b/block/bfq-cgroup.c +@@ -771,7 +771,6 @@ static void bfq_pd_offline(struct blkg_policy_data *pd) + + __bfq_deactivate_entity(entity, false); + bfq_put_async_queues(bfqd, bfqg); +- BUG_ON(entity->tree); + + /* + * @blkg is going offline and will be ignored by +diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c +index 21197f6..f00761b 100644 +--- a/block/bfq-iosched.c ++++ b/block/bfq-iosched.c +@@ -1391,7 +1391,6 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd, + + bfq_bfqq_expire(bfqd, bfqd->in_service_queue, + false, BFQ_BFQQ_PREEMPTED); +- BUG_ON(in_serv->entity.budget < 0); + } + } + +@@ -1560,8 +1559,10 @@ static void bfq_remove_request(struct request *rq) + BUG_ON(bfqq->entity.budget < 0); + + if (bfq_bfqq_busy(bfqq) && bfqq != bfqd->in_service_queue) { ++ BUG_ON(bfqq->ref < 2); /* referred by rq and on tree */ + bfq_del_bfqq_busy(bfqd, bfqq, false); +- /* bfqq emptied. In normal operation, when ++ /* ++ * bfqq emptied. In normal operation, when + * bfqq is empty, bfqq->entity.service and + * bfqq->entity.budget must contain, + * respectively, the service received and the +@@ -1570,7 +1571,8 @@ static void bfq_remove_request(struct request *rq) + * this last removal occurred while bfqq is + * not in service. To avoid inconsistencies, + * reset both bfqq->entity.service and +- * bfqq->entity.budget. ++ * bfqq->entity.budget, if bfqq has still a ++ * process that may issue I/O requests to it. + */ + bfqq->entity.budget = bfqq->entity.service = 0; + } +@@ -2062,7 +2064,8 @@ bfq_merge_bfqqs(struct bfq_data *bfqd, struct bfq_io_cq *bic, + new_bfqq->wr_coeff = bfqq->wr_coeff; + new_bfqq->wr_cur_max_time = bfqq->wr_cur_max_time; + new_bfqq->last_wr_start_finish = bfqq->last_wr_start_finish; +- new_bfqq->wr_start_at_switch_to_srt = bfqq->wr_start_at_switch_to_srt; ++ new_bfqq->wr_start_at_switch_to_srt = ++ bfqq->wr_start_at_switch_to_srt; + if (bfq_bfqq_busy(new_bfqq)) + bfqd->wr_busy_queues++; + new_bfqq->entity.prio_changed = 1; +@@ -2105,6 +2108,7 @@ bfq_merge_bfqqs(struct bfq_data *bfqd, struct bfq_io_cq *bic, + */ + new_bfqq->bic = NULL; + bfqq->bic = NULL; ++ /* release process reference to bfqq */ + bfq_put_queue(bfqq); + } + +@@ -3077,6 +3081,7 @@ static void bfq_bfqq_expire(struct bfq_data *bfqd, + bool slow; + unsigned long delta = 0; + struct bfq_entity *entity = &bfqq->entity; ++ int ref; + + BUG_ON(bfqq != bfqd->in_service_queue); + +@@ -3184,12 +3189,15 @@ static void bfq_bfqq_expire(struct bfq_data *bfqd, + __bfq_bfqq_recalc_budget(bfqd, bfqq, reason); + BUG_ON(bfqq->next_rq == NULL && + bfqq->entity.budget < bfqq->entity.service); ++ ref = bfqq->ref; + __bfq_bfqq_expire(bfqd, bfqq); + +- BUG_ON(!bfq_bfqq_busy(bfqq) && reason == BFQ_BFQQ_BUDGET_EXHAUSTED && ++ BUG_ON(ref > 1 && ++ !bfq_bfqq_busy(bfqq) && reason == BFQ_BFQQ_BUDGET_EXHAUSTED && + !bfq_class_idle(bfqq)); + +- if (!bfq_bfqq_busy(bfqq) && ++ /* mark bfqq as waiting a request only if a bic still points to it */ ++ if (ref > 1 && !bfq_bfqq_busy(bfqq) && + reason != BFQ_BFQQ_BUDGET_TIMEOUT && + reason != BFQ_BFQQ_BUDGET_EXHAUSTED) + bfq_mark_bfqq_non_blocking_wait_rq(bfqq); +@@ -3809,7 +3817,8 @@ static int bfq_dispatch_requests(struct request_queue *q, int force) + * Task holds one reference to the queue, dropped when task exits. Each rq + * in-flight on this queue also holds a reference, dropped when rq is freed. + * +- * Queue lock must be held here. ++ * Queue lock must be held here. Recall not to use bfqq after calling ++ * this function on it. + */ + static void bfq_put_queue(struct bfq_queue *bfqq) + { +@@ -3878,7 +3887,7 @@ static void bfq_exit_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq) + + bfq_put_cooperator(bfqq); + +- bfq_put_queue(bfqq); ++ bfq_put_queue(bfqq); /* release process reference */ + } + + static void bfq_init_icq(struct io_cq *icq) +@@ -3977,6 +3986,7 @@ static void bfq_check_ioprio_change(struct bfq_io_cq *bic, struct bio *bio) + + bfqq = bic_to_bfqq(bic, false); + if (bfqq) { ++ /* release process reference on this queue */ + bfq_put_queue(bfqq); + bfqq = bfq_get_queue(bfqd, bio, BLK_RW_ASYNC, bic); + bic_set_bfqq(bic, bfqq, false); +@@ -4110,7 +4120,7 @@ static struct bfq_queue *bfq_get_queue(struct bfq_data *bfqd, + } + + out: +- bfqq->ref++; ++ bfqq->ref++; /* get a process reference to this queue */ + bfq_log_bfqq(bfqd, bfqq, "get_queue, at end: %p, %d", bfqq, bfqq->ref); + rcu_read_unlock(); + return bfqq; +@@ -4284,10 +4294,14 @@ static void bfq_insert_request(struct request_queue *q, struct request *rq) + bfqq->allocated[rq_data_dir(rq)]--; + new_bfqq->ref++; + bfq_clear_bfqq_just_created(bfqq); +- bfq_put_queue(bfqq); + if (bic_to_bfqq(RQ_BIC(rq), 1) == bfqq) + bfq_merge_bfqqs(bfqd, RQ_BIC(rq), + bfqq, new_bfqq); ++ /* ++ * rq is about to be enqueued into new_bfqq, ++ * release rq reference on bfqq ++ */ ++ bfq_put_queue(bfqq); + rq->elv.priv[1] = new_bfqq; + bfqq = new_bfqq; + } +@@ -4708,7 +4722,7 @@ static void bfq_shutdown_timer_wq(struct bfq_data *bfqd) + } + + static void __bfq_put_async_bfqq(struct bfq_data *bfqd, +- struct bfq_queue **bfqq_ptr) ++ struct bfq_queue **bfqq_ptr) + { + struct bfq_group *root_group = bfqd->root_group; + struct bfq_queue *bfqq = *bfqq_ptr; +diff --git a/block/bfq-sched.c b/block/bfq-sched.c +index 2e9dc59..70aac56 100644 +--- a/block/bfq-sched.c ++++ b/block/bfq-sched.c +@@ -154,7 +154,13 @@ static bool bfq_update_next_in_service(struct bfq_sched_data *sd, + #define for_each_entity(entity) \ + for (; entity ; entity = entity->parent) + +-#define for_each_entity_safe(entity, parent) \ ++/* ++ * For each iteration, compute parent in advance, so as to be safe if ++ * entity is deallocated during the iteration. Such a deallocation may ++ * happen as a consequence of a bfq_put_queue that frees the bfq_queue ++ * containing entity. ++ */ ++#define for_each_entity_safe(entity, parent) \ + for (; entity && ({ parent = entity->parent; 1; }); entity = parent) + + /* +@@ -691,27 +697,31 @@ static void bfq_idle_insert(struct bfq_service_tree *st, + } + + /** +- * bfq_forget_entity - remove an entity from the wfq trees. ++ * bfq_forget_entity - do not consider entity any longer for scheduling + * @st: the service tree. + * @entity: the entity being removed. ++ * @is_in_service: true if entity is currently the in-service entity. + * +- * Update the device status and forget everything about @entity, putting +- * the device reference to it, if it is a queue. Entities belonging to +- * groups are not refcounted. ++ * Forget everything about @entity. In addition, if entity represents ++ * a queue, and the latter is not in service, then release the service ++ * reference to the queue (the one taken through bfq_get_entity). In ++ * fact, in this case, there is really no more service reference to ++ * the queue, as the latter is also outside any service tree. If, ++ * instead, the queue is in service, then __bfq_bfqd_reset_in_service ++ * will take care of putting the reference when the queue finally ++ * stops being served. + */ + static void bfq_forget_entity(struct bfq_service_tree *st, +- struct bfq_entity *entity) ++ struct bfq_entity *entity, ++ bool is_in_service) + { + struct bfq_queue *bfqq = bfq_entity_to_bfqq(entity); +- struct bfq_sched_data *sd; +- + BUG_ON(!entity->on_st); + + entity->on_st = false; + st->wsum -= entity->weight; +- if (bfqq) { +- sd = entity->sched_data; +- bfq_log_bfqq(bfqq->bfqd, bfqq, "forget_entity: %p %d", ++ if (bfqq && !is_in_service) { ++ bfq_log_bfqq(bfqq->bfqd, bfqq, "forget_entity (before): %p %d", + bfqq, bfqq->ref); + bfq_put_queue(bfqq); + } +@@ -726,7 +736,8 @@ static void bfq_put_idle_entity(struct bfq_service_tree *st, + struct bfq_entity *entity) + { + bfq_idle_extract(st, entity); +- bfq_forget_entity(st, entity); ++ bfq_forget_entity(st, entity, ++ entity == entity->sched_data->in_service_entity); + } + + /** +@@ -1082,6 +1093,12 @@ static void __bfq_activate_entity(struct bfq_entity *entity, + */ + entity->start = min_vstart; + st->wsum += entity->weight; ++ /* ++ * entity is about to be inserted into a service tree, ++ * and then set in service: get a reference to make ++ * sure entity does not disappear until it is no ++ * longer in service or scheduled for service. ++ */ + bfq_get_entity(entity); + + BUG_ON(entity->on_st && bfqq); +@@ -1264,27 +1281,27 @@ static bool __bfq_deactivate_entity(struct bfq_entity *entity, + { + struct bfq_sched_data *sd = entity->sched_data; + struct bfq_service_tree *st = bfq_entity_service_tree(entity); +- bool was_in_service = entity == sd->in_service_entity; ++ bool is_in_service = entity == sd->in_service_entity; + + if (!entity->on_st) { /* entity never activated, or already inactive */ + BUG_ON(entity == entity->sched_data->in_service_entity); + return false; + } + +- BUG_ON(was_in_service && entity->tree && entity->tree != &st->active); ++ BUG_ON(is_in_service && entity->tree && entity->tree != &st->active); + +- if (was_in_service) ++ if (is_in_service) + bfq_calc_finish(entity, entity->service); + + if (entity->tree == &st->active) + bfq_active_extract(st, entity); +- else if (!was_in_service && entity->tree == &st->idle) ++ else if (!is_in_service && entity->tree == &st->idle) + bfq_idle_extract(st, entity); + else if (entity->tree) + BUG(); + + if (!ins_into_idle_tree || !bfq_gt(entity->finish, st->vtime)) +- bfq_forget_entity(st, entity); ++ bfq_forget_entity(st, entity, is_in_service); + else + bfq_idle_insert(st, entity); + +@@ -1320,8 +1337,8 @@ static void bfq_deactivate_entity(struct bfq_entity *entity, + + if (!__bfq_deactivate_entity(entity, ins_into_idle_tree)) { + /* +- * Entity is not any tree any more, so, this +- * deactivation is a no-op, and there is ++ * entity is not in any tree any more, so ++ * this deactivation is a no-op, and there is + * nothing to change for upper-level entities + * (in case of expiration, this can never + * happen). +@@ -1821,14 +1838,16 @@ static struct bfq_queue *bfq_get_next_queue(struct bfq_data *bfqd) + + static void __bfq_bfqd_reset_in_service(struct bfq_data *bfqd) + { +- struct bfq_entity *entity = &bfqd->in_service_queue->entity; ++ struct bfq_queue *in_serv_bfqq = bfqd->in_service_queue; ++ struct bfq_entity *in_serv_entity = &in_serv_bfqq->entity; ++ struct bfq_entity *entity = in_serv_entity; + + if (bfqd->in_service_bic) { + put_io_context(bfqd->in_service_bic->icq.ioc); + bfqd->in_service_bic = NULL; + } + +- bfq_clear_bfqq_wait_request(bfqd->in_service_queue); ++ bfq_clear_bfqq_wait_request(in_serv_bfqq); + hrtimer_try_to_cancel(&bfqd->idle_slice_timer); + bfqd->in_service_queue = NULL; + +@@ -1840,6 +1859,14 @@ static void __bfq_bfqd_reset_in_service(struct bfq_data *bfqd) + */ + for_each_entity(entity) + entity->sched_data->in_service_entity = NULL; ++ ++ /* ++ * in_serv_entity is no longer in service, so, if it is in no ++ * service tree either, then release the service reference to ++ * the queue it represents (taken with bfq_get_entity). ++ */ ++ if (!in_serv_entity->on_st) ++ bfq_put_queue(in_serv_bfqq); + } + + static void bfq_deactivate_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq, +@@ -1904,8 +1931,6 @@ static void bfq_del_bfqq_busy(struct bfq_data *bfqd, struct bfq_queue *bfqq, + BUG_ON(bfqq->entity.budget < 0); + + bfq_deactivate_bfqq(bfqd, bfqq, true, expiration); +- +- BUG_ON(bfqq->entity.budget < 0); + } + + /* diff --git a/99-linux.hook b/90-linux.hook index 9851151995bc..9851151995bc 100644 --- a/99-linux.hook +++ b/90-linux.hook @@ -55,7 +55,7 @@ _pkgver=4.9.13 _rtver=12 _rtpatchver=rt${_rtver} pkgver=${_pkgver}.${_rtver} -pkgrel=2 +pkgrel=3 arch=('i686' 'x86_64') url="http://algo.ing.unimo.it" license=('GPL2') @@ -83,11 +83,12 @@ source=("http://www.kernel.org/pub/linux/kernel/v4.x/${_srcname}.tar.xz" # the main kernel config files 'config' 'config.x86_64' # pacman hook for initramfs regeneration - '99-linux.hook' + '90-linux.hook' # standard config files for mkinitcpio ramdisk 'linux.preset' # patches from https://github.com/linusw/linux-bfq/commits/bfq-v8 '0005-BFQ-update-to-v8r8.patch' + '0006-BFQ-bugfix.patch' '0001-tty-n_hdlc-get-rid-of-racy-n_hdlc_tbuf.patch') _kernelname=${pkgbase#linux} @@ -120,7 +121,7 @@ prepare() { ### Patch source with BFQ msg "Patching source with BFQ patches" - for p in "${srcdir}"/000{1,2,3,4,5}-*BFQ*.patch; do + for p in "${srcdir}"/000{1,2,3,4,5,6}-*BFQ*.patch; do msg " $p" patch -Np1 -i "$p" done @@ -277,8 +278,8 @@ _package() { install -D -m644 /dev/stdin "${pkgdir}/etc/mkinitcpio.d/${pkgbase}.preset" # install pacman hook for initramfs regeneration - sed "s|%PKGBASE%|${pkgbase}|g" "${srcdir}/99-linux.hook" | - install -D -m644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/99-${pkgbase}.hook" + sed "s|%PKGBASE%|${pkgbase}|g" "${srcdir}/90-linux.hook" | + install -D -m644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/90-${pkgbase}.hook" # remove build and source links rm -f "${pkgdir}"/lib/modules/${_kernver}/{source,build} @@ -472,7 +473,7 @@ sha512sums=('bf67ff812cc3cb7e5059e82cc5db0d9a7c5637f7ed9a42e4730c715bf7047c81ed3 '953566f2b74415cd5113882352c8518234c399e0e0a6cc118ddfa259c65d6fc30de00f25b605489d53e0b1f948bc7b3ebf8f20b970538f5bf7de5a7f33a0f641' '8fed8499a52d685e81a1cffac7e6764a3720a923c3a3e4ccec33a4b0145dc84c24172363ff5574608d80c10462a4e824ef1b5ad3e5e5187f816e16adab774700' '93338e0ae23d2832e4dc75b1b4dc6d2ba34d621a71c7951f1e70ddd483d091211b2aa429683b21a7f9cf2152e2d974b6a1a8cc7b0d6549a7f639870b07f5295e' - 'ab781ca0315316043d2074ad925288616ff4935e0c91b09090cd2a2cc392845eddf1c93b5dadda0eb434050459b51a4e2587e5099e6a9204d0d13b7f427d399c' + '77d80d50d8c4323ed36fd2097ba9f6b49bb8d7cae59d32ffa76b309758a7e9f972d26fedd77046d88ce2691bb01a07909f8bdc34ba214414be3bc030ee31994d' 'd9d28e02e964704ea96645a5107f8b65cae5f4fb4f537e224e5e3d087fd296cb770c29ac76e0ce95d173bc420ea87fb8f187d616672a60a0cae618b0ef15b8c8' '86f717f596c613db3bc40624fd956ed379b8a2a20d1d99e076ae9061251fe9afba39cf536623eccd970258e124b8c2c05643e3d539f37bd910e02dc5dd498749' 'e7c8fd3dd50272518323ac5f27e7e911e8138dbe1268865b5cc343e1c84d531e91d3581cd11df9513952d02e213e916d0c28ecd19acf2660519fc040dfaabb94' @@ -480,6 +481,7 @@ sha512sums=('bf67ff812cc3cb7e5059e82cc5db0d9a7c5637f7ed9a42e4730c715bf7047c81ed3 'd6faa67f3ef40052152254ae43fee031365d0b1524aa0718b659eb75afc21a3f79ea8d62d66ea311a800109bed545bc8f79e8752319cd378eef2cbd3a09aba22' '2dc6b0ba8f7dbf19d2446c5c5f1823587de89f4e28e9595937dd51a87755099656f2acec50e3e2546ea633ad1bfd1c722e0c2b91eef1d609103d8abdc0a7cbaf' 'dab3dba300e276dd552cb86c903af5cac9f7c7954b938ac9c300745a175198c553d84cd3a5e58c350d83160f33b07f6dd20a570da4afdce178464c402ac7829b' + '2fbe9ddf40a64f9b80ab3b4868e358ea678b4122742884b7c484041a913757627d1c6b0ee6e2ef46fe90d82e7e29e6332d3b6155d56355d274fdf551f8a8ef70' '397fc751697cc4e2ceb7e6d854f5e7fc115ed8511df406ffe5d8f80afeec385ba64cd28c4666bb206612fdcd7a578b60ca6ff125c2138c615aee6135d86b0197') validpgpkeys=( |