static inline void _free_pages_ok(unsigned long map_nr, unsigned long order) { struct free_mem_area_struct *area = free_mem_area + order; unsigned long index = map_nr >> (1 + order); unsigned long mask = (~0UL) << order; #define list(x) (g_mem_map+(x)) map_nr &= mask; g_nr_free_pages -= mask; while (mask + (1 << (NR_MEM_LISTS-1))) { if (!test_and_change_bit(index, area->map)) break; remove_mem_queue(area,list(map_nr ^ -mask)); mask <<= 1; area++; index >>= 1; map_nr &= mask; } add_mem_queue(area, list(map_nr)); #undef list }
static void ixgb_led_blink_callback(unsigned long data) { struct ixgb_adapter *adapter = (struct ixgb_adapter *)data; if (test_and_change_bit(IXGB_LED_ON, &adapter->led_status)) ixgb_led_off(&adapter->hw); else ixgb_led_on(&adapter->hw); mod_timer(&adapter->blink_timer, jiffies + IXGB_ID_INTERVAL); }
static void e1000_led_blink_callback(unsigned long data) { struct e1000_adapter *adapter = (struct e1000_adapter *) data; if(test_and_change_bit(E1000_LED_ON, &adapter->led_status)) e1000_led_off(&adapter->hw); else e1000_led_on(&adapter->hw); mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL); }
void buddy_put_free_pages(u32 addr, u8 order) { u8 start_order; u32 bitmap_idx; struct buddy_area_s *area = &buddy_alloc.buddy_area[order]; struct page_desc_s *page_desc; struct page_desc_s *page_buddy_desc; u32 page_idx = virt_to_page(addr); u32 page_buddy_idx; u32 page_mask; u32 flags; spin_lock_irqsave(&buddy_alloc.buddy_lock, flags); page_mask = (~0UL) << order; for (start_order = order; start_order < BUDDY_ALLOC_MAX_AREAS; start_order++) { bitmap_idx = page_idx >> (start_order + 1); if (!test_and_change_bit(bitmap_idx, area->area_bitmap)) { break; } page_buddy_idx = page_idx ^ (1 + ~page_mask); page_buddy_desc = &system_pages[page_buddy_idx]; list_del(&page_buddy_desc->page_list); area->free_units--; area++; page_mask <<= 1; page_idx &= page_mask; } page_desc = &system_pages[page_idx]; list_add(&page_desc->page_list, &area->area_list); area->free_units++; spin_unlock_irqrestore(&buddy_alloc.buddy_lock, flags); }