* @prog: machine code
  * @prog_len: number of valid instructions in @prog array
  * @__prog_alloc_len: alloc size of @prog array
+ * @stack_size: total amount of stack used
  * @verifier_meta: temporary storage for verifier's insn meta
  * @type: BPF program type
  * @last_bpf_off: address of the last instruction translated from BPF
        unsigned int prog_len;
        unsigned int __prog_alloc_len;
 
+       unsigned int stack_size;
+
        struct nfp_insn_meta *verifier_meta;
 
        enum bpf_prog_type type;
 
                 struct netlink_ext_ack *extack)
 {
        struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv;
-       unsigned int max_mtu;
+       unsigned int max_mtu, max_stack, max_prog_len;
        dma_addr_t dma_addr;
        void *img;
        int err;
                return -EOPNOTSUPP;
        }
 
+       max_stack = nn_readb(nn, NFP_NET_CFG_BPF_STACK_SZ) * 64;
+       if (nfp_prog->stack_size > max_stack) {
+               NL_SET_ERR_MSG_MOD(extack, "stack too large");
+               return -EOPNOTSUPP;
+       }
+
+       max_prog_len = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN);
+       if (nfp_prog->prog_len > max_prog_len) {
+               NL_SET_ERR_MSG_MOD(extack, "program too long");
+               return -EOPNOTSUPP;
+       }
+
        img = nfp_bpf_relo_for_vnic(nfp_prog, nn->app_priv);
        if (IS_ERR(img))
                return PTR_ERR(img);
 
 
 static int nfp_bpf_finalize(struct bpf_verifier_env *env)
 {
-       unsigned int stack_size, stack_needed;
        struct bpf_subprog_info *info;
        struct nfp_prog *nfp_prog;
+       unsigned int max_stack;
        struct nfp_net *nn;
        int i;
 
        }
 
        nn = netdev_priv(env->prog->aux->offload->netdev);
-       stack_size = nn_readb(nn, NFP_NET_CFG_BPF_STACK_SZ) * 64;
-       stack_needed = nfp_bpf_get_stack_usage(nfp_prog, env->prog->len);
-       if (stack_needed > stack_size) {
+       max_stack = nn_readb(nn, NFP_NET_CFG_BPF_STACK_SZ) * 64;
+       nfp_prog->stack_size = nfp_bpf_get_stack_usage(nfp_prog,
+                                                      env->prog->len);
+       if (nfp_prog->stack_size > max_stack) {
                pr_vlog(env, "stack too large: program %dB > FW stack %dB\n",
-                       stack_needed, stack_size);
+                       nfp_prog->stack_size, max_stack);
                return -EOPNOTSUPP;
        }