On Tue, Sep 29, 2026 at 04:28:19PM +0300, Andrey Drobyshev wrote:
> > But I do see the existance of cpr_resave_fd().  I confess I don't know why
> > it existed and didn't check.  That looks exactly like sometimes we can save
> > the same fd twice, if the 1st one is fd=-1.  Any quick answer?
> 
> AFAICT the sole purpose of cpr_resave_fd() is to be called from
> different sites with the same (name, id, fd), to make sure the key is
> registered in the table.  What it does:
> 
>   - no entry - save it into hash table;
>   - same FD already there - do nothing, table isn't updated;
>   - different FD present - abort as an internal error.
> 
> That means there's no case of injecting the same (name, id) twice into
> the hash table.  That is actually consistent with our patch here.
> 
> I'd leave the code as-is and only reword the comment, if that's fine
> with you.

The whole cpr_resave_fd() API is confusing, I still don't understand why we
need it: we should make sure the fd is always properly inserted, and only
once somehow.. but I agree it's not an issue for the current patch.

Said that, for this patch, IIUC we still should need something like this:

diff --git a/migration/cpr.c b/migration/cpr.c
index bca43e9bf3..d26656c5c1 100644
--- a/migration/cpr.c
+++ b/migration/cpr.c
@@ -173,14 +173,13 @@ int cpr_find_fd(const char *name, int id)
 void cpr_resave_fd(const char *name, int id, int fd)
 {
     CprFd *elem = find_fd(name, id);
-    int old_fd = elem ? elem->fd : -1;

-    if (old_fd < 0) {
+    if (!elem) {
         cpr_save_fd(name, id, fd);
-    } else if (old_fd != fd) {
+    } else if (elem->fd != fd) {
         error_report("internal error: cpr fd '%s' id %d value %d "
                      "already saved with a different value %d",
-                     name, id, fd, old_fd);
+                     name, id, fd, elem->fd);
         g_assert_not_reached();
     }
 }

Otherwise at least from API level some user can inject one fd=-1 entry,
then resave fd with something else causing cpr_save_fd() done twice on the
same (name, id) index, triggering the new assert.

Thanks,

-- 
Peter Xu


Reply via email to