This still does not work, still searching for more bugs here. Patch 1) Remove skip logic from __nft_table_flush(), before we hit ERESTART. Better do not preventively skip table flush. Patch 2) Keeps the original cache, while we introduce a new cache that is used when we hit ERESTART. Patch 3) Remove NFT_COMPAT_TABLE_ADD case from refresh transaction, I don't find a scenario for this. Patch 4) Reevaluate based on the existing cache, not on the previous object state. Original commit doesn't mention, but NFT_COMPAT_CHAIN_USER_ADD only makes sense to me to do the special handling from h->noflush. I can still see the test still fails most of the time with: line 5: CHAIN_USER_ADD failed (File exists): chain UC-0 which should not happen if table exists, because a flush should have happened before. Pablo Neira Ayuso (4): nft: don't check for table existence from __nft_table_flush() nft: keep original cache in case of ERESTART nft: don't skip table addition from ERESTART nft: don't care about previous state in RESTART iptables/nft.c | 77 +++++++++++++++++++++++++++++++--------------------------- iptables/nft.h | 3 ++- 2 files changed, 43 insertions(+), 37 deletions(-) -- 2.11.0