[Click] AMD64

Eddie Kohler kohler at cs.ucla.edu
Sun Jul 24 17:02:30 EDT 2005


Hi Qinghua,

By the way, I think the current Click CVS sources should work on AMD64, thanks 
to your patches and Felipe and Adam's.  There are several changes relative to 
your fixes below.  So I'd be interested in your experiences with it!

Eddie


Qinghua(Kevin) Ye wrote:
> Hi Adam,
> 
> I have been working on AMD64  and kernel 2.6.11.6 smp based on the CVS
> version on May.20. The following is some minor modifications for the Linux
> Kernel module. I am still testing on it and plan to report it to Eddie once
> I finish testing. Since you are also working on this, let's share
> information.
> 
> The patch for 2.6.11.6 on my server has some minor problem. But they are
> obvious. I will give it at the end.
> 
> Eddie, could you check that if there are any incorrect modifications?
> Thanks.
> 
> Modifications for the type problem:
> 1. In lib/glue.cc, modify void *operator new(unsigned sz) throw ()
> 
> to operator new(size_t sz) throw ()
> 
>    Reason: The size_t in i386 is unsigned int, but in x86_64 is unsigned
> long. We put here size_t to compatible with both
> 
>    Modify void * operator new[](unsigned sz) throw () to operator
> new[](size_t sz) throw ()
> 
> 2. In elements/linxumodule/cpuqueue.cc,for function String
> CPUQueue::read_handler(Element *e, void *thunk)
> 
>    Change int which = reinterpret_cast<int>(thunk);
> 
>    to
> 
>       long which = reinterpret_cast<long>(thunk);
> 
> 3. In elements/linuxmodule/fromdevice.cc",
> 
>  In static String FromDevice_read_stats(Element *e, void *thunk)
> 
>     Change     int which = reinterpret_cast<int>(thunk);
> 
>     to     long which = reinterpret_cast<long>(thunk);
> 
> 4. in elements/linuxmodule/polldevice.cc",
> 
>  In static String PollDevice_read_stats(Element *e, void *thunk)
> 
>     Change     int which = reinterpret_cast<int>(thunk);
> 
>     to      long which = reinterpret_cast<long>(thunk);
> 
> 5. In elements/linuxmodule/rtcycles.cc",
> 
>         In static String FromDevice_read_stats(Element *e, void *thunk)
> 
>     Change     int which = reinterpret_cast<int>(thunk);
> 
>                          to      long which = reinterpret_cast<long>(thunk);
> 
> 6. /linuxmodule/clickfs.c
> 
>  Change  #define FILP_STRINGNO(filp)
> (reinterpret_cast<int>((filp)->private_data))
> 
> To: #define FILP_STRINGNO(filp)
> (reinterpret_cast<long>((filp)->private_data))
> 
> 
> Modifications for the 64 bit int problem:
> 1. include/click/string.hh
> 
>  Change  #if HAVE_INT64_TYPES && !HAVE_64_BIT_LONG
> 
>  To #if HAVE_INT64_TYPES && (!HAVE_64_BIT_LONG||defined(__KERNEL__))
> 
> 2. include/click/straccum.hh
> 
>  Change  #if HAVE_INT64_TYPES && !HAVE_64_BIT_LONG
> 
>  To #if HAVE_INT64_TYPES && (!HAVE_64_BIT_LONG||defined(__KERNEL__))
> 
> 3. lib/string.cc
> 
>  Change  #if HAVE_INT64_TYPES && !HAVE_64_BIT_LONG
> 
>  To #if HAVE_INT64_TYPES && (!HAVE_64_BIT_LONG||defined(__KERNEL__))
> 
> 4. lib/straccum.cc
> 
>  Change  #if HAVE_INT64_TYPES && !HAVE_64_BIT_LONG
> 
>  To #if HAVE_INT64_TYPES && (!HAVE_64_BIT_LONG||defined(__KERNEL__))
> 
> 5. /linuxmodule/proclikefs.c
> 
> comment the line #include <linux/modversions.h>
> 
> 
> Support for SMP:
> 1.      In include/click/atomic.hh, modify inline uint32_t
> atomic_uint32_t::read_and_add(uint32_t delta)
> after #else in line 85
> 
> 
> 
> /* Modified by Qinghua Ye, to add support for __x86_64__ */
> 
> #if defined(__x86_64__)
> 
> #  if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
> 
>     asm volatile (LOCK "xaddl %0,%1"
> 
>                   : "=r" (delta), "=m" (_val.counter)
> 
>                   : "0" (delta), "m" (_val.counter));
> 
> #  else
> 
>     asm volatile (LOCK "xaddl %0,%1"
> 
>                   : "=r" (delta), "=m" (__atomic_fool_gcc(&_val))
> 
>                   : "0" (delta), "m" (__atomic_fool_gcc(&_val)));
> 
> #  endif
> 
>     return delta;
> 
> # else
> 
> ...
> 
> ...
> 
> #endif
> 
> 2.     include/click/atomic.hh, modify inline
> atomic_uint32_t::compare_and_swap(uint32_t test_value, uint32_t new_value)
> 
> after #else
> 
> /* Modified by Qinghua Ye*/
> 
> # if defined(__x86_64__)
> 
> #  if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
> 
>     asm (LOCK "cmpxchgl %2,%0"
> 
>          : "=m" (_val.counter), "=a" (old_value)
> 
>          : "r" (new_value), "m" (_val.counter), "a" (test_value)
> 
>          // : "eax", "cc", "memory");
> 
>          : "cc", "memory");
> 
> #  else
> 
>     asm (LOCK "cmpxchgl %2,%0"
> 
>          : "=m" (__atomic_fool_gcc(&_val)), "=a" (old_value)
> 
>          : "r" (new_value), "m" (__atomic_fool_gcc(&_val)), "a" (test_value)
> 
>          // : "eax", "cc", "memory");
> 
>          : "cc", "memory");
> 
> #  endif
> 
> #else
> 
> ....
> 
> # endif
> 
> #endif
> 
> return old_value;
> 
> }
> 
> 3.     In include/click/sync.hh, modify inline Spinlock::Spinlock() as:
> 
> /* Modify by Qinghua Ye*/
> 
> #if ((!defined(__i386__))&&(!defined(__x86_64__)))
> 
> # error "no multithread support for non i386 or x86_64 click"
> 
> #endif
> 
> 
> Modifications on patched kernel 2.6.11.6
>     1. include/asm-x86_64/mmu_context.h
> 57c57
> 
>     < asm volatile("movq %0,%%cr3" : "r" (__pa(next->pgd)) : "memory");
>     ---
> 
>     > asm volatile("movq %0,%%cr3" :: "r" (__pa(next->pgd)) : "memory");
> 
>     2. include/asm-x86_64/mmu_context.h
> 7,9d6
> 
> < #ifdef __KERNEL__
> 
> 15a13,14
> 
> 
>>#ifdef CONFIG_SMP
> 
> 
>     3.include/asm-x86_64/thread_info.h
> 
> 63c63
> 
> < ti = (void *)(read_pda(kernelstack) + PDA_STACKOFFSET - THREAD_SIZE);
> 
> ---
> 
> 
>>ti = (struct thread_info *)(read_pda(kernelstack) + PDA_STACKOFFSET -
> 
> THREAD_SIZE);
> 
>     4.include/linux/fs.h
> 
> 1644c1644
> 
> < struct simple_transaction_argresp *ar = file->private_data;
> 
> ---
> 
> 
>>struct simple_transaction_argresp *ar = (struct simple_transaction_argresp
> 
> *)file->private_data;
> 
>     5.include/net/sock.h
> 1017,1018c1017,1018
> 
> < unsigned int csum = csum_and_copy_from_user(from,
> 
> < page_address(page) + off,
> 
> ---
> 
> 
>>unsigned int csum = csum_and_copy_from_user((unsigned char *)from,
> 
> 
>>(unsigned char *)page_address(page) + off,
> 
> 
> 1023c1023
> 
> < } else if (copy_from_user(page_address(page) + off, from, copy))
> 
> ---
> 
> 
>>} else if (copy_from_user((unsigned char *)page_address(page) + off, from,
> 
> copy))
> 
> 
> Regards,
> Qinghua(Kevin) Ye
> ----- Original Message ----- 
> From: "Adam Greenhalgh" <a.greenhalgh at cs.ucl.ac.uk>
> To: <click at amsterdam.lcs.mit.edu>
> Sent: Friday, June 03, 2005 10:37 AM
> Subject: [Click] AMD64
> 
> 
> 
>>Hi
>>
>>We are part way through getting click to work on an amd 64 box, has
>>anyone else done this and tested it ?
>>
>>Adam
>>_______________________________________________
>>click mailing list
>>click at amsterdam.lcs.mit.edu
>>https://amsterdam.lcs.mit.edu/mailman/listinfo/click
> 
> 
> 
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click


More information about the click mailing list