goto out;
 
                if (last) {
+                       if (nft_set_elem_expired(&f->mt[b].e->ext))
+                               goto next_match;
                        if ((genmask &&
                             !nft_set_elem_active(&f->mt[b].e->ext, genmask)))
                                goto next_match;
 static void *nft_pipapo_get(const struct net *net, const struct nft_set *set,
                            const struct nft_set_elem *elem, unsigned int flags)
 {
-       struct nft_pipapo_elem *ret;
-
-       ret = pipapo_get(net, set, (const u8 *)elem->key.val.data,
+       return pipapo_get(net, set, (const u8 *)elem->key.val.data,
                         nft_genmask_cur(net));
-       if (IS_ERR(ret))
-               return ret;
-
-       if (nft_set_elem_expired(&ret->ext))
-               return ERR_PTR(-ENOENT);
-
-       return ret;
 }
 
 /**
                                const struct nft_set *set,
                                const struct nft_set_elem *elem)
 {
-       struct nft_pipapo_elem *e;
-
-       e = pipapo_get(net, set, (const u8 *)elem->key.val.data, 0);
-       if (IS_ERR(e))
-               return;
+       struct nft_pipapo_elem *e = elem->priv;
 
        nft_set_elem_change_active(net, set, &e->ext);
 }
 
        data = (const u8 *)nft_set_ext_key(&e->ext);
 
-       e = pipapo_get(net, set, data, 0);
-       if (IS_ERR(e))
-               return;
-
        while ((rules_f0 = pipapo_rules_same_key(m->f, first_rule))) {
                union nft_pipapo_map_bucket rulemap[NFT_PIPAPO_MAX_FIELDS];
                const u8 *match_start, *match_end;