• Haiyue Wang's avatar
    gve: fix the wrong AdminQ buffer queue index check · 1f84a945
    Haiyue Wang authored
    The 'tail' and 'head' are 'unsigned int' type free-running count, when
    'head' is overflow, the 'int i (= tail) < u32 head' will be false:
    
    Only '- loop 0: idx = 63' result is shown, so it needs to use 'int' type
    to compare, it can handle the overflow correctly.
    
    typedef uint32_t u32;
    
    int main()
    {
            u32 tail, head;
            int stail, shead;
            int i, loop;
    
            tail = 0xffffffff;
            head = 0x00000000;
    
            for (i = tail, loop = 0; i < head; i++) {
                    unsigned int idx = i & 63;
    
                    printf("+ loop %d: idx = %u\n", loop++, idx);
            }
    
            stail = tail;
            shead = head;
            for (i = stail, loop = 0; i < shead; i++) {
                    unsigned int idx = i & 63;
    
                    printf("- loop %d: idx = %u\n", loop++, idx);
            }
    
            return 0;
    }
    
    Fixes: 5cdad90d ("gve: Batch AQ commands for creating and destroying queues.")
    Signed-off-by: default avatarHaiyue Wang <haiyue.wang@intel.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1f84a945
gve_adminq.c 27.7 KB