none
CentOS 6.5 и динамическая память RRS feed

  • Вопрос

  • Гипервизор 2012 R2, гостевая CentOS 6.5. Настройки динамической памяти: startup 1024 Мб, min 512 Мб, max 4096 Мб.

    После загрузки гостевой OS занято около 310 Мб памяти, выделено 512 Мб.

    Запускаю простую тестовую программу, которая запрашивает 512 Мб памяти через malloc():

    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    int main(int argc, char** argv)
    {
        unsigned long mem;
        mem = 1024 * 1024 * 512;
        char* ptr = malloc(mem);
        while(1)
        {
            memset(ptr, 0, mem);
            sleep(120);
        }
    }
    
    

    После третьего запуска начинает срабатывать OOM killer, память выталкивается в swap и ядро падает в панику, хотя лимит динамической памяти еще далеко не исчерпан.

    Собственно вопрос, почему так происходит, если везде утверждается, что динамическая память в CentOS 6.5 полностью поддерживается, включая hot-add.

    Может, есть какие-нибудь рекомендации по настройке dynamic memory в гостевых машинах Linux?

    8 декабря 2013 г. 14:16

Ответы

  • > Есть какие-нибудь идеи как заставить это работать? 

    K. Y. Srinivasan считает что

     udev отрабатывает правило недостаточно быстро Ж-(

    можно пробовать перекомпилировать ядро с патчами

    https://bugzilla.redhat.com/show_bug.cgi?id=979257

    Bug 979257 - [Hyper-V][RHEL6.5][RFE]in-kernel online support for memory hot-add

    ==

    K. Y. Srinivasan 2013-09-12 15:27:34 EDT

    Created attachment 796988 [details]
    Patch to support in-kernel onlining The current machinery for hot-adding memory requires having user level to bring the memory segments online. Export the necessary functionality to bring the memory segment online without involving user space code.
    Comment 22 K. Y. Srinivasan 2013-09-12 15:28:46 EDT
    Created attachment 796989 [details]
    patch to online memory in the balloon driver Leverage the newly exported functionality to bring memory online without involving user level code.

    ==

    ~

    
    

    ==

    ~

    ==

    From e6a55e3b6feb3b3fcd7d3047294ddbdb09ea3a32 Mon Sep 17 00:00:00 2001
    From: K. Y. Srinivasan 
    Date: Wed, 24 Jul 2013 13:29:55 -0700
    Subject: [PATCH 1/2] Drivers: base: memory: Export functionality for "in kernel" onlining of memory
    The current machinery for hot-adding memory requires having user
    level to bring the memory segments online. Export the necessary functionality
    to bring the memory segment online without involving user space code.
    Signed-off-by: K. Y. Srinivasan
    --- drivers/base/memory.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/memory.h | 5 +++++ 2 files changed, 40 insertions(+), 0 deletions(-) diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 2b7813e..a7140b3 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -541,6 +541,41 @@ struct memory_block *find_memory_block(struct mem_section *section) return find_memory_block_hinted(section, NULL); } +/* + * Given the start pfn of a memory block; bring the memory + * block online. This API would be useful for drivers that may + * want to bring "online" the memory that has been hot-added. + */ + +int online_memory_block(unsigned long start_pfn) +{ + struct mem_section *cur_section; + struct memory_block *cur_memory_block; + int ret_val = -EINVAL; + + cur_section = __pfn_to_section(start_pfn); + + if (!valid_section(cur_section)) + return ret_val; + + mutex_lock(&mem_sysfs_mutex); + cur_memory_block = find_memory_block(cur_section); + + if (!cur_memory_block) { + mutex_unlock(&mem_sysfs_mutex); + return ret_val; + } + + lock_device_hotplug(); + ret_val = memory_block_change_state(cur_memory_block, MEM_ONLINE, + MEM_OFFLINE, ONLINE_KEEP); + unlock_device_hotplug(); + mutex_unlock(&mem_sysfs_mutex); + + return ret_val; +} +EXPORT_SYMBOL_GPL(online_memory_block); + static struct attribute *memory_memblk_attrs[] = { &dev_attr_phys_index.attr, &dev_attr_end_phys_index.attr, diff --git a/include/linux/memory.h b/include/linux/memory.h index 85c31a8..7d0d2a6 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -109,12 +109,17 @@ static inline int memory_isolate_notify(unsigned long val, void *v) { return 0; } +static inline int online_memory_block(unsigned long start_pfn) +{ + return 0; +} #else extern int register_memory_notifier(struct notifier_block *nb); extern void unregister_memory_notifier(struct notifier_block *nb); extern int register_memory_isolate_notifier(struct notifier_block *nb); extern void unregister_memory_isolate_notifier(struct notifier_block *nb); extern int register_new_memory(int, struct mem_section *); +extern int online_memory_block(unsigned long start_pfn); #ifdef CONFIG_MEMORY_HOTREMOVE extern int unregister_memory_section(struct mem_section *); #endif -- 1.7.4.1


    ==

    +

    ==

    From 44d530995f891ede6b46f1c6ed8929982c46efce Mon Sep 17 00:00:00 2001
    From: K. Y. Srinivasan 
    Date: Wed, 24 Jul 2013 13:45:16 -0700
    Subject: [PATCH 2/2] Drivers: hv: balloon: Online the hot-added memory "in context"
    Leverage the newly exported functionality to bring memory online
    without involving user level code.
    Signed-off-by: K. Y. Srinivasan
    ---
     drivers/hv/hv_balloon.c |   20 +++-----------------
     1 files changed, 3 insertions(+), 17 deletions(-)
    diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c
    index 2d094cf..c2eec17 100644
    --- a/drivers/hv/hv_balloon.c
    +++ b/drivers/hv/hv_balloon.c
    @@ -515,11 +515,6 @@ struct hv_dynmem_device {
     	bool host_specified_ha_region;
     
     	/*
    -	 * State to synchronize hot-add.
    -	 */
    -	struct completion  ol_waitevent;
    -	bool ha_waiting;
    -	/*
     	 * This thread handles hot-add
     	 * requests from the host as well as notifying
     	 * the host with regards to memory pressure in
    @@ -581,9 +576,6 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size,
     
     		has->covered_end_pfn +=  processed_pfn;
     
    -		init_completion(&dm_device.ol_waitevent);
    -		dm_device.ha_waiting = true;
    -
     		nid = memory_add_physaddr_to_nid(PFN_PHYS(start_pfn));
     		ret = add_memory(nid, PFN_PHYS((start_pfn)),
     				(HA_CHUNK << PAGE_SHIFT));
    @@ -606,12 +598,10 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size,
     		}
     
     		/*
    -		 * Wait for the memory block to be onlined.
    -		 * Since the hot add has succeeded, it is ok to
    -		 * proceed even if the pages in the hot added region
    -		 * have not been "onlined" within the allowed time.
    +		 * Before proceeding to hot add the next segment,
    +		 * online the segment that has been hot added.
     		 */
    -		wait_for_completion_timeout(&dm_device.ol_waitevent, 5*HZ);
    +		online_memory_block(start_pfn);
     
     	}
     
    @@ -625,10 +615,6 @@ static void hv_online_page(struct page *pg)
     	unsigned long cur_start_pgp;
     	unsigned long cur_end_pgp;
     
    -	if (dm_device.ha_waiting) {
    -		dm_device.ha_waiting = false;
    -		complete(&dm_device.ol_waitevent);
    -	}
     
     	list_for_each(cur, &dm_device.ha_region_list) {
     		has = list_entry(cur, struct hv_hotadd_state, list);
    -- 
    1.7.4.1


    ==

    ~





    • Помечено в качестве ответа Nikolay Pushkarev 11 декабря 2013 г. 19:19
    • Изменено Victor Miasnikov 12 декабря 2013 г. 9:01
    11 декабря 2013 г. 15:22
  • Посидел, помониторил udev.

    В результате получилось вот такое правило:

    SUBSYSTEM=="memory", ACTION=="add", DEVPATH=="/devices/system/memory/memory[1-9]*", RUN+="/bin/cp /sys$devpath/../memory0/state /sys$devpath/state"

    Срабатывает достаточно быстро, чтобы драйвер balloon успел подхватить online состояние. Тем не менее, пару-тройку гигабайт свопа все-таки добавить не помешает. И не забывайте указывать параметр ядра numa=off.

    Конечно, лучше перекомпилять ядро, но лень ))

    В общем, меня все (пока) устраивает в таком виде. Всем спасибо, особенно Victor Miasnikov


    • Изменено Nikolay Pushkarev 11 декабря 2013 г. 19:18
    • Помечено в качестве ответа Nikolay Pushkarev 11 декабря 2013 г. 19:18
    11 декабря 2013 г. 19:14
  • Странно, что родная конструкция вида

    SUBSYSTEM=="memory", ACTION=="add", ATTR{state}="online"

    срабатывает как-то через раз, с ней было бы гораздо проще.

    В результате сделал программку, которая работает еще быстрее чем /bin/cp, в силу своей тупости:

    putarg.c

    #include <stdio.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <string.h>
    
    int main(int argc, char** argv) {
      int i, fd;
      if (argc < 2) return 0;
      if ((fd = open(argv[1], O_RDWR)) < 0) return 1;
      for (i = 2; i < argc; i++) {
        if (write(fd, argv[i], strlen(argv[i])) < 0) {
          close(fd);
          return i;
        }
      }
      close(fd);
      return 0;
    }
    

    Первый аргумент - имя файла, все последующие (если есть) - это текстовые строки, которые пишутся в этот файл.

    Компилируем: gcc -o putarg -s putarg.c

    Получившийся бинарник кладем куда-нибудь в доступное место, типа /usr/bin, или куда хотите.

    Сейчас правило udev с использованием putarg можно записать так:

    SUBSYSTEM=="memory", ACTION=="add", RUN+="/usr/bin/putarg /sys$devpath/state online"

    Работает исключительно быстро.

    • Помечено в качестве ответа Nikolay Pushkarev 12 декабря 2013 г. 13:03
    12 декабря 2013 г. 12:58

Все ответы

  • Здравствуйте Николай,

    Виртуалку создаете как 1вого типа?


    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий. Не забывайте помечать сообщения как ответы и полезные, если они Вам помогли.

    9 декабря 2013 г. 14:11
    Модератор
  • Gen1, конечно.

    9 декабря 2013 г. 18:44
  • ~

    ~

    Гипервизор 2012 R2, гостевая CentOS 6.5. Настройки динамической памяти: startup 1024 Мб, min 512 Мб, max 4096 Мб.

    После загрузки гостевой OS занято около 310 Мб памяти, выделено 512 Мб.

    Запускаю простую тестовую программу, которая запрашивает 512 Мб памяти через malloc():

    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    int main(int argc, char** argv)
    {
        unsigned long mem;
        mem = 1024 * 1024 * 512;
        char* ptr = malloc(mem);
        while(1)
        {
            memset(ptr, 0, mem);
            sleep(120);
        }
    }

    После третьего запуска начинает срабатывать OOM killer, память выталкивается в swap и ядро падает в панику, хотя лимит динамической памяти еще далеко не исчерпан.

    Собственно вопрос, почему так происходит, если везде утверждается, что динамическая память в CentOS 6.5 полностью поддерживается, включая hot-add.

    Может, есть какие-нибудь рекомендации по настройке dynamic memory в гостевых машинах Linux?

    ~

     М.б. "not accepted" разработчиками патч

    ~

    Bug 979257 - [Hyper-V][RHEL6.5][RFE]in-kernel online support for memory hot-add

     +

    Dynamic Memory on Linux VM

     +

    http://vvm.blog.tut.by/2013/09/11/linux-hyper-v-dynamic-memory-hot-add/ 


    10 декабря 2013 г. 6:49
  •  To All ( у  Nikolay Pushkarev -- так и есть ) :

     И "Startup, Max and Min parameters will have to aligned to 128MB"

    http://blogs.technet.com/b/virtualization/archive/2013/07/24/enabling-linux-support-on-windows-server-2012-r2-hyper-v.aspx

     Comment 2

    ==

     . . .

    Dynamic Memory should work on Server 2008 R2. The only caveat will be that the values for Startup, Max and Min parameters will have to aligned to 128MB. More of this information will be contained in soon to be released notes.

    Go ahead and try out a SLES 11 SP3

    ==


    2013-12-11 :

    RHEL 6.5 / CentOS 6.5 ; RHEL 6.4 / CentOS 6.4 include support for Hyper-V drivers

    Michael Kelley say:

    ==

    Documentation on the features available in the different Linux distros is now available on the Microsoft TechNet site. See http://technet.microsoft.com/en-us/library/dn531026.aspx for the details of RHEL/CentOS.   Updates for RHEL/CentOS 6.5 have not yet been posted, but will be soon.

    For the 6.4 version, only "ballooning" is available.

    For the 6.5 version, both "hot add" and "ballooning" are available, but there is a udev rule that must be added in order for the hot-add to work and avoid a Linux kernel panic.

      . . .


    Michael Kelley, Lead Program Manager, Open Source Technology Center

    ==


    10 декабря 2013 г. 6:56
  • For the 6.5 version, both "hot add" and "ballooning" are available, but there is a udev rule that must be added in order for the hot-add to work and avoid a Linux kernel panic.

    Создал udev правило:

    SUBSYSTEM=="memory", ACTION=="add", DEVPATH=="/devices/system/memory/memory*[0-9]", TEST=="state", ATTR{state}="online"
    

    Память добавляется, статус памяти переходит в online, но ядро по-прежнему падает. Есть какие-нибудь идеи как заставить это работать? 
    11 декабря 2013 г. 8:27
  • > Есть какие-нибудь идеи как заставить это работать? 

    K. Y. Srinivasan считает что

     udev отрабатывает правило недостаточно быстро Ж-(

    можно пробовать перекомпилировать ядро с патчами

    https://bugzilla.redhat.com/show_bug.cgi?id=979257

    Bug 979257 - [Hyper-V][RHEL6.5][RFE]in-kernel online support for memory hot-add

    ==

    K. Y. Srinivasan 2013-09-12 15:27:34 EDT

    Created attachment 796988 [details]
    Patch to support in-kernel onlining The current machinery for hot-adding memory requires having user level to bring the memory segments online. Export the necessary functionality to bring the memory segment online without involving user space code.
    Comment 22 K. Y. Srinivasan 2013-09-12 15:28:46 EDT
    Created attachment 796989 [details]
    patch to online memory in the balloon driver Leverage the newly exported functionality to bring memory online without involving user level code.

    ==

    ~

    
    

    ==

    ~

    ==

    From e6a55e3b6feb3b3fcd7d3047294ddbdb09ea3a32 Mon Sep 17 00:00:00 2001
    From: K. Y. Srinivasan 
    Date: Wed, 24 Jul 2013 13:29:55 -0700
    Subject: [PATCH 1/2] Drivers: base: memory: Export functionality for "in kernel" onlining of memory
    The current machinery for hot-adding memory requires having user
    level to bring the memory segments online. Export the necessary functionality
    to bring the memory segment online without involving user space code.
    Signed-off-by: K. Y. Srinivasan
    --- drivers/base/memory.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/memory.h | 5 +++++ 2 files changed, 40 insertions(+), 0 deletions(-) diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 2b7813e..a7140b3 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -541,6 +541,41 @@ struct memory_block *find_memory_block(struct mem_section *section) return find_memory_block_hinted(section, NULL); } +/* + * Given the start pfn of a memory block; bring the memory + * block online. This API would be useful for drivers that may + * want to bring "online" the memory that has been hot-added. + */ + +int online_memory_block(unsigned long start_pfn) +{ + struct mem_section *cur_section; + struct memory_block *cur_memory_block; + int ret_val = -EINVAL; + + cur_section = __pfn_to_section(start_pfn); + + if (!valid_section(cur_section)) + return ret_val; + + mutex_lock(&mem_sysfs_mutex); + cur_memory_block = find_memory_block(cur_section); + + if (!cur_memory_block) { + mutex_unlock(&mem_sysfs_mutex); + return ret_val; + } + + lock_device_hotplug(); + ret_val = memory_block_change_state(cur_memory_block, MEM_ONLINE, + MEM_OFFLINE, ONLINE_KEEP); + unlock_device_hotplug(); + mutex_unlock(&mem_sysfs_mutex); + + return ret_val; +} +EXPORT_SYMBOL_GPL(online_memory_block); + static struct attribute *memory_memblk_attrs[] = { &dev_attr_phys_index.attr, &dev_attr_end_phys_index.attr, diff --git a/include/linux/memory.h b/include/linux/memory.h index 85c31a8..7d0d2a6 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -109,12 +109,17 @@ static inline int memory_isolate_notify(unsigned long val, void *v) { return 0; } +static inline int online_memory_block(unsigned long start_pfn) +{ + return 0; +} #else extern int register_memory_notifier(struct notifier_block *nb); extern void unregister_memory_notifier(struct notifier_block *nb); extern int register_memory_isolate_notifier(struct notifier_block *nb); extern void unregister_memory_isolate_notifier(struct notifier_block *nb); extern int register_new_memory(int, struct mem_section *); +extern int online_memory_block(unsigned long start_pfn); #ifdef CONFIG_MEMORY_HOTREMOVE extern int unregister_memory_section(struct mem_section *); #endif -- 1.7.4.1


    ==

    +

    ==

    From 44d530995f891ede6b46f1c6ed8929982c46efce Mon Sep 17 00:00:00 2001
    From: K. Y. Srinivasan 
    Date: Wed, 24 Jul 2013 13:45:16 -0700
    Subject: [PATCH 2/2] Drivers: hv: balloon: Online the hot-added memory "in context"
    Leverage the newly exported functionality to bring memory online
    without involving user level code.
    Signed-off-by: K. Y. Srinivasan
    ---
     drivers/hv/hv_balloon.c |   20 +++-----------------
     1 files changed, 3 insertions(+), 17 deletions(-)
    diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c
    index 2d094cf..c2eec17 100644
    --- a/drivers/hv/hv_balloon.c
    +++ b/drivers/hv/hv_balloon.c
    @@ -515,11 +515,6 @@ struct hv_dynmem_device {
     	bool host_specified_ha_region;
     
     	/*
    -	 * State to synchronize hot-add.
    -	 */
    -	struct completion  ol_waitevent;
    -	bool ha_waiting;
    -	/*
     	 * This thread handles hot-add
     	 * requests from the host as well as notifying
     	 * the host with regards to memory pressure in
    @@ -581,9 +576,6 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size,
     
     		has->covered_end_pfn +=  processed_pfn;
     
    -		init_completion(&dm_device.ol_waitevent);
    -		dm_device.ha_waiting = true;
    -
     		nid = memory_add_physaddr_to_nid(PFN_PHYS(start_pfn));
     		ret = add_memory(nid, PFN_PHYS((start_pfn)),
     				(HA_CHUNK << PAGE_SHIFT));
    @@ -606,12 +598,10 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size,
     		}
     
     		/*
    -		 * Wait for the memory block to be onlined.
    -		 * Since the hot add has succeeded, it is ok to
    -		 * proceed even if the pages in the hot added region
    -		 * have not been "onlined" within the allowed time.
    +		 * Before proceeding to hot add the next segment,
    +		 * online the segment that has been hot added.
     		 */
    -		wait_for_completion_timeout(&dm_device.ol_waitevent, 5*HZ);
    +		online_memory_block(start_pfn);
     
     	}
     
    @@ -625,10 +615,6 @@ static void hv_online_page(struct page *pg)
     	unsigned long cur_start_pgp;
     	unsigned long cur_end_pgp;
     
    -	if (dm_device.ha_waiting) {
    -		dm_device.ha_waiting = false;
    -		complete(&dm_device.ol_waitevent);
    -	}
     
     	list_for_each(cur, &dm_device.ha_region_list) {
     		has = list_entry(cur, struct hv_hotadd_state, list);
    -- 
    1.7.4.1


    ==

    ~





    • Помечено в качестве ответа Nikolay Pushkarev 11 декабря 2013 г. 19:19
    • Изменено Victor Miasnikov 12 декабря 2013 г. 9:01
    11 декабря 2013 г. 15:22
  • Посидел, помониторил udev.

    В результате получилось вот такое правило:

    SUBSYSTEM=="memory", ACTION=="add", DEVPATH=="/devices/system/memory/memory[1-9]*", RUN+="/bin/cp /sys$devpath/../memory0/state /sys$devpath/state"

    Срабатывает достаточно быстро, чтобы драйвер balloon успел подхватить online состояние. Тем не менее, пару-тройку гигабайт свопа все-таки добавить не помешает. И не забывайте указывать параметр ядра numa=off.

    Конечно, лучше перекомпилять ядро, но лень ))

    В общем, меня все (пока) устраивает в таком виде. Всем спасибо, особенно Victor Miasnikov


    • Изменено Nikolay Pushkarev 11 декабря 2013 г. 19:18
    • Помечено в качестве ответа Nikolay Pushkarev 11 декабря 2013 г. 19:18
    11 декабря 2013 г. 19:14
  • ~

    ~

    2013-12-12 10-35 ( TZ Nairorby ) :

    > В общем, меня все (пока) устраивает в таком виде. Всем спасибо

    ~

     Всем спасибо,

    ~

      Yes

    ~

    Всем спасибо, особенно Victor Miasnikov

    ~

    > , особенно Victor Miasnikov

     Пожалуйста!

    ~ ~

    пару-тройку гигабайт свопа все-таки добавить не помешает.
    ~ ~

     На деле:

     Необходимо иметь swap пространство ( Max_Memory - Min_Memory) 

    ~

    ~

     Еще вариант:

    Michael Kelley:

    RHEL 6.5 / CentOS 6.5 ; RHEL 6.4 / CentOS 6.4 include support for Hyper-V drivers

    The VM crash with 6.5 should be fixed by adding the udev rule.  The udev rule looks like: 

    SUBSYSTEM=="memory", ACTION=="add", DEVPATH=="/devices/system/memory/memory*[0-9]", TEST=="/sys$devpath/state", RUN+="/bin/sh -c 'echo online > /sys$devpath/state'"

    ~

    P.S. См. далее:

    ~

    2013-12-12 14-35 ( TZ Nairorby ) :

    ~

    Nikolay Pushkarev :

    ~

     Вариант правила с шеллом я тоже пробовал (фактически с него и начал),

    но /bin/cp работает быстрее.

    ~

     Понятно, спасибо из инф-ию, учтем в работе

    ~



    12 декабря 2013 г. 9:00
  •  Необходимо иметь swap пространство ( Max_Memory - Min_Memory) 

    Откуда такие рекомендации? По самому плохому сценарию?

    Вариант правила с шеллом я тоже пробовал (фактически с него и начал), но /bin/cp работает быстрее.

    Кстати, похоже рано я обрадовался. Решение с udev работает только на x86_64.

    На i686 не помогает ((

    12 декабря 2013 г. 10:06
  • ~

    ~

    VVM>>  Необходимо иметь swap пространство ( Max_Memory - Min_Memory) 

    Откуда такие рекомендации? По самому плохому сценарию?

    ~

    ~

     В общем-то, да: что бы "memory ballon" драйверу было куда вытеснять из RAM


    ~

    ~

    Nikolay Pushkarev say:

     Вариант правила с шеллом я тоже пробовал (фактически с него и начал),

    но /bin/cp работает быстрее.

    ~

     Понятно, спасибо из инф-ию, учтем в работе

    ~

    To Nikolay Pushkarev :

      Кстати, не затруднит опубликовать это еще и в топике

    RHEL 6.5 / CentOS 6.5 ; RHEL 6.4 / CentOS 6.4 include support for Hyper-V drivers

    -- там "обитают" разработчики из MS


    ~

    ~

    2013-12-12 17-27:

    To Nikolay Pushkarev :

    > В результате сделал программку, которая работает еще быстрее чем /bin/cp,  . . . : putarg.c

     Very well . . .

     

    12 декабря 2013 г. 11:31
  • Странно, что родная конструкция вида

    SUBSYSTEM=="memory", ACTION=="add", ATTR{state}="online"

    срабатывает как-то через раз, с ней было бы гораздо проще.

    В результате сделал программку, которая работает еще быстрее чем /bin/cp, в силу своей тупости:

    putarg.c

    #include <stdio.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <string.h>
    
    int main(int argc, char** argv) {
      int i, fd;
      if (argc < 2) return 0;
      if ((fd = open(argv[1], O_RDWR)) < 0) return 1;
      for (i = 2; i < argc; i++) {
        if (write(fd, argv[i], strlen(argv[i])) < 0) {
          close(fd);
          return i;
        }
      }
      close(fd);
      return 0;
    }
    

    Первый аргумент - имя файла, все последующие (если есть) - это текстовые строки, которые пишутся в этот файл.

    Компилируем: gcc -o putarg -s putarg.c

    Получившийся бинарник кладем куда-нибудь в доступное место, типа /usr/bin, или куда хотите.

    Сейчас правило udev с использованием putarg можно записать так:

    SUBSYSTEM=="memory", ACTION=="add", RUN+="/usr/bin/putarg /sys$devpath/state online"

    Работает исключительно быстро.

    • Помечено в качестве ответа Nikolay Pushkarev 12 декабря 2013 г. 13:03
    12 декабря 2013 г. 12:58