Hi all, I run some lengthy tests to measure cost of inlines in headers under include/, simple coverage calculations yields to 89% but most of the failed compiles are due to preprocessor cutting the tested block away anyway. Test setup: v2.6.24-mm1, make allyesconfig, 32-bit x86, gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-13). Because one inline was tested (function uninlined) at a time, the actual benefits of removing multiple inlines may well be below what the sum of those individually is (especially when something calls __-func with equal name). Ok, here's the top of the list (10000+ bytes): -110805 869 f, 198 +, 111003 -, diff: -110805 skb_put -41525 2066 f, 3370 +, 44895 -, diff: -41525 IS_ERR -36290 42 f, 197 +, 36487 -, diff: -36290 cfi_build_cmd -35698 1234 f, 2391 +, 38089 -, diff: -35698 atomic_dec_and_test -28162 354 f, 3005 +, 31167 -, diff: -28162 skb_pull -23668 392 f, 104 +, 23772 -, diff: -23668 dev_alloc_skb -22212 415 f, 130 +, 22342 -, diff: -22212 __dev_alloc_skb -21593 356 f, 2418 +, 24011 -, diff: -21593 skb_push -19036 478 f, 259 +, 19295 -, diff: -19036 netif_wake_queue -18409 396 f, 6447 +, 24856 -, diff: -18409 __skb_pull -16420 187 f, 103 +, 16523 -, diff: -16420 dst_release -16025 13 f, 280 +, 16305 -, diff: -16025 cfi_send_gen_cmd -14925 486 f, 978 +, 15903 -, diff: -14925 add_timer -14896 199 f, 558 +, 15454 -, diff: -14896 sg_page -12870 36 f, 121 +, 12991 -, diff: -12870 le_key_k_type -12310 692 f, 7215 +, 19525 -, diff: -12310 signal_pending -11640 251 f, 118 +, 11758 -, diff: -11640 __skb_trim -11059 111 f, 293 +, 11352 -, diff: -11059 __nlmsg_put -10976 209 f, 123 +, 11099 -, diff: -10976 skb_trim -10344 125 f, 462 +, 10806 -, diff: -10344 pskb_may_pull -10061 300 f, 1163 +, 11224 -, diff: -10061 try_module_get -10008 75 f, 341 +, 10349 -, diff: -10008 nlmsg_put ~250 are in 1000+ bytes category and ~440 in 500+. Full list has some entries without number because given config ...
~500 files changed
...
kernel/uninlined.c:
skb_put | +104
1 function changed, 104 bytes added, diff: +104
vmlinux.o:
869 functions changed, 198 bytes added, 111003 bytes removed, diff: -110805
This change is INCOMPLETE, I think that the call to current_text_addr()
should be rethought but I don't have a clue how to do that.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
include/linux/skbuff.h | 20 +-------------------
net/core/skbuff.c | 21 +++++++++++++++++++++
2 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 412672a..5925435 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -896,25 +896,7 @@ static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
return tmp;
}
-/**
- * skb_put - add data to a buffer
- * @skb: buffer to use
- * @len: amount of data to add
- *
- * This function extends the used data area of the buffer. If this would
- * exceed the total buffer size the kernel will panic. A pointer to the
- * first byte of the extra data is returned.
- */
-static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
-{
- unsigned char *tmp = skb_tail_pointer(skb);
- SKB_LINEAR_ASSERT(skb);
- skb->tail += len;
- skb->len += len;
- if (unlikely(skb->tail > skb->end))
- skb_over_panic(skb, len, current_text_addr());
- return tmp;
-}
+extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
{
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 4e35422..661d439 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -857,6 +857,27 @@ free_skb:
return err;
}
+/**
+ * skb_put - add data to a buffer
+ * @skb: buffer to use
+ * @len: amount of data to add
+ *
+ * This function extends the used data area of the buffer. If this would
+ * exceed the total buffer size the ...-28162 354 funcs, 3005 +, 31167 -, diff: -28162 --- skb_pull
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
include/linux/skbuff.h | 15 +--------------
net/core/skbuff.c | 16 ++++++++++++++++
2 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 5925435..a9f8f15 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -930,20 +930,7 @@ static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
return skb->data += len;
}
-/**
- * skb_pull - remove data from the start of a buffer
- * @skb: buffer to use
- * @len: amount of data to remove
- *
- * This function removes data from the start of a buffer, returning
- * the memory to the headroom. A pointer to the next data in the buffer
- * is returned. Once the data has been pulled future pushes will overwrite
- * the old data.
- */
-static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
-{
- return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
-}
+extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 661d439..14f462b 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -878,6 +878,22 @@ unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
}
EXPORT_SYMBOL(skb_put);
+/**
+ * skb_pull - remove data from the start of a buffer
+ * @skb: buffer to use
+ * @len: amount of data to remove
+ *
+ * This function removes data from the start of a buffer, returning
+ * the memory to the headroom. A pointer to the next data in the buffer
+ * is returned. Once the data has been pulled future pushes will overwrite
+ * the old data.
+ */
+unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
+{
+ return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
+}
+EXPORT_SYMBOL(skb_pull);
+
/* ...-23668 392 funcs, 104 +, 23772 -, diff: -23668 --- dev_alloc_skb
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
include/linux/skbuff.h | 17 +----------------
net/core/skbuff.c | 18 ++++++++++++++++++
2 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index a9f8f15..df3cce2 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1269,22 +1269,7 @@ static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
return skb;
}
-/**
- * dev_alloc_skb - allocate an skbuff for receiving
- * @length: length to allocate
- *
- * Allocate a new &sk_buff and assign it a usage count of one. The
- * buffer has unspecified headroom built in. Users should allocate
- * the headroom they think they need without accounting for the
- * built in space. The built in space is used for optimisations.
- *
- * %NULL is returned if there is no free memory. Although this function
- * allocates memory it can be called from an interrupt.
- */
-static inline struct sk_buff *dev_alloc_skb(unsigned int length)
-{
- return __dev_alloc_skb(length, GFP_ATOMIC);
-}
+extern struct sk_buff *dev_alloc_skb(unsigned int length);
extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
unsigned int length, gfp_t gfp_mask);
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 14f462b..081bffb 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -263,6 +263,24 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
return skb;
}
+/**
+ * dev_alloc_skb - allocate an skbuff for receiving
+ * @length: length to allocate
+ *
+ * Allocate a new &sk_buff and assign it a usage count of one. The
+ * buffer has unspecified headroom built in. Users should allocate
+ * the headroom they think they need without accounting for the
+ * built in space. The built in space is used for optimisations.
+ *
+ * %NULL is returned if there is no free memory. Although this ...-21593 356 funcs, 2418 +, 24011 -, diff: -21593 --- skb_push
Again, current_text_addr() needs to addressed.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
include/linux/skbuff.h | 18 +-----------------
net/core/skbuff.c | 19 +++++++++++++++++++
2 files changed, 20 insertions(+), 17 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index df3cce2..c11f248 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -905,23 +905,7 @@ static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
return skb->data;
}
-/**
- * skb_push - add data to the start of a buffer
- * @skb: buffer to use
- * @len: amount of data to add
- *
- * This function extends the used data area of the buffer at the buffer
- * start. If this would exceed the total buffer headroom the kernel will
- * panic. A pointer to the first byte of the extra data is returned.
- */
-static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len)
-{
- skb->data -= len;
- skb->len += len;
- if (unlikely(skb->data<skb->head))
- skb_under_panic(skb, len, current_text_addr());
- return skb->data;
-}
+extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
{
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 081bffb..05d43fd 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -897,6 +897,25 @@ unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
EXPORT_SYMBOL(skb_put);
/**
+ * skb_push - add data to the start of a buffer
+ * @skb: buffer to use
+ * @len: amount of data to add
+ *
+ * This function extends the used data area of the buffer at the buffer
+ * start. If this would exceed the total buffer headroom the kernel will
+ * panic. A pointer to the first byte of the extra data is returned.
+ */
+unsigned char *skb_push(struct sk_buff *skb, unsigned int len)
+{
+ skb->data -= ...Codiff stats:
-16420 187 funcs, 103 +, 16523 -, diff: -16420 --- dst_release
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
include/net/dst.h | 10 +---------
net/core/dst.c | 10 ++++++++++
2 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/include/net/dst.h b/include/net/dst.h
index e3ac7d0..bf33471 100644
--- a/include/net/dst.h
+++ b/include/net/dst.h
@@ -158,15 +158,7 @@ struct dst_entry * dst_clone(struct dst_entry * dst)
return dst;
}
-static inline
-void dst_release(struct dst_entry * dst)
-{
- if (dst) {
- WARN_ON(atomic_read(&dst->__refcnt) < 1);
- smp_mb__before_atomic_dec();
- atomic_dec(&dst->__refcnt);
- }
-}
+extern void dst_release(struct dst_entry *dst);
/* Children define the path of the packet through the
* Linux networking. Thus, destinations are stackable.
diff --git a/net/core/dst.c b/net/core/dst.c
index 7deef48..cc2e724 100644
--- a/net/core/dst.c
+++ b/net/core/dst.c
@@ -259,6 +259,16 @@ again:
return NULL;
}
+void dst_release(struct dst_entry *dst)
+{
+ if (dst) {
+ WARN_ON(atomic_read(&dst->__refcnt) < 1);
+ smp_mb__before_atomic_dec();
+ atomic_dec(&dst->__refcnt);
+ }
+}
+EXPORT_SYMBOL(dst_release);
+
/* Dirty hack. We did it in 2.2 (in __dst_free),
* we have _very_ good reasons not to repeat
* this mistake in 2.3, but we have no choice
--
1.5.2.2
--
-10976 209 funcs, 123 +, 11099 -, diff: -10976 --- skb_trim
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
include/linux/skbuff.h | 16 +---------------
net/core/skbuff.c | 16 ++++++++++++++++
2 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index c11f248..75d8a66 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1156,21 +1156,7 @@ static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
skb_set_tail_pointer(skb, len);
}
-/**
- * skb_trim - remove end from a buffer
- * @skb: buffer to alter
- * @len: new length
- *
- * Cut the length of a buffer down by removing data from the tail. If
- * the buffer is already under the length specified it is not modified.
- * The skb must be linear.
- */
-static inline void skb_trim(struct sk_buff *skb, unsigned int len)
-{
- if (skb->len > len)
- __skb_trim(skb, len);
-}
-
+extern void skb_trim(struct sk_buff *skb, unsigned int len);
static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
{
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 05d43fd..b57cadb 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -931,6 +931,22 @@ unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
}
EXPORT_SYMBOL(skb_pull);
+/**
+ * skb_trim - remove end from a buffer
+ * @skb: buffer to alter
+ * @len: new length
+ *
+ * Cut the length of a buffer down by removing data from the tail. If
+ * the buffer is already under the length specified it is not modified.
+ * The skb must be linear.
+ */
+void skb_trim(struct sk_buff *skb, unsigned int len)
+{
+ if (skb->len > len)
+ __skb_trim(skb, len);
+}
+EXPORT_SYMBOL(skb_trim);
+
/* Trims skb to length len. It can change skb pointers.
*/
--
1.5.2.2
--
I added inline to sctp_add_cmd and appropriate comment there to avoid adding another call into the call chain. This works at least with "gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-13)". Alternatively, __sctp_add_cmd could be introduced to .h. net/sctp/sm_statefuns.c: sctp_sf_cookie_wait_prm_abort | -125 sctp_sf_cookie_wait_prm_shutdown | -75 sctp_sf_do_9_1_prm_abort | -75 sctp_sf_shutdown_sent_prm_abort | -50 sctp_sf_pdiscard | -25 sctp_stop_t1_and_abort | -100 sctp_sf_do_9_2_start_shutdown | -154 __sctp_sf_do_9_1_abort | -50 sctp_send_stale_cookie_err | -29 sctp_sf_abort_violation | -181 sctp_sf_do_9_2_shutdown_ack | -154 sctp_sf_do_9_2_reshutack | -86 sctp_sf_tabort_8_4_8 | -28 sctp_sf_heartbeat | -52 sctp_sf_shut_8_4_5 | -27 sctp_eat_data | -246 sctp_sf_shutdown_sent_abort | -58 sctp_sf_check_restart_addrs | -50 sctp_sf_do_unexpected_init | -110 sctp_sf_sendbeat_8_3 | -107 sctp_sf_unk_chunk | -65 sctp_sf_do_prm_asoc | -129 sctp_sf_do_prm_send | -25 sctp_sf_do_9_2_prm_shutdown | -50 sctp_sf_error_closed | -25 sctp_sf_error_shutdown | -25 sctp_sf_shutdown_pending_prm_abort | -25 sctp_sf_do_prm_requestheartbeat | -28 sctp_sf_do_prm_asconf | -75 sctp_sf_do_6_3_3_rtx | -104 sctp_sf_do_6_2_sack | -25 sctp_sf_t1_init_timer_expire | -133 sctp_sf_t1_cookie_timer_expire | -104 sctp_sf_t2_timer_expire | -161 sctp_sf_t4_timer_expire | -175 sctp_sf_t5_timer_expire | -75 sctp_sf_autoclose_timer_expire | -50 sctp_sf_do_5_2_4_dupcook | -579 sctp_sf_do_4_C | -125 ...
vmlinux.o: 62 functions changed, 66 bytes added, 10935 bytes removed, diff: -10869 ...+ these to lib/jhash.o: jhash_3words: 112 jhash2: 276 jhash: 475 select for networking code might need a more fine-grained approach. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> --- drivers/infiniband/Kconfig | 1 + drivers/net/Kconfig | 1 + fs/Kconfig | 1 + fs/dlm/Kconfig | 1 + fs/gfs2/Kconfig | 1 + include/linux/jhash.h | 99 +------------------------------------ init/Kconfig | 2 + lib/Kconfig | 6 ++ lib/Makefile | 1 + lib/jhash.c | 116 ++++++++++++++++++++++++++++++++++++++++++++ net/Kconfig | 1 + 11 files changed, 134 insertions(+), 96 deletions(-) create mode 100644 lib/jhash.c diff --git a/drivers/infiniband/Kconfig b/drivers/infiniband/Kconfig index a5dc78a..421ab71 100644 --- a/drivers/infiniband/Kconfig +++ b/drivers/infiniband/Kconfig @@ -2,6 +2,7 @@ menuconfig INFINIBAND tristate "InfiniBand support" depends on PCI || BROKEN depends on HAS_IOMEM + select JHASH ---help--- Core support for InfiniBand (IB). Make sure to also select any protocols you wish to use as well as drivers for your diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index f337800..8257648 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -2496,6 +2496,7 @@ config CHELSIO_T3 tristate "Chelsio Communications T3 10Gb Ethernet support" depends on PCI select FW_LOADER + select JHASH help This driver supports Chelsio T3-based gigabit and 10Gb Ethernet adapters. diff --git a/fs/Kconfig b/fs/Kconfig index d731282..693fe71 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -1667,6 +1667,7 @@ config NFSD select LOCKD select SUNRPC select EXPORTFS + select JHASH select NFSD_V2_ACL if NFSD_V3_ACL select NFS_ACL_SUPPORT if NFSD_V2_ACL select NFSD_TCP if ...
It should be possible to use a modular jhash.ko. The things which you have identified as clients of the jhash library are usually loaded as modules. But in the case where someone does (say) NFSD=y we do need jhash.o linked into vmlinux also. This is doable in Kconfig but I always forget how. Adrian, Sam and Randy are the repositories of knowledge here ;) --
On Sat, 23 Feb 2008, Andrew Morton wrote: > On Wed, 20 Feb 2008 15:47:18 +0200 "Ilpo J
Thanks. If it gets messy I'd just put lib/jhash.o in obj-y. I assume it's Sure, I can scrounge around for appropriate reviews and acks and can make sure that nobody's pending work gets disrupted. --
For very small functions like this own modules are quite expensive. First everything gets rounded up to at least one 4K page (or worse on architectures with larger pages). That just wastes some memory. But then since modules live in vmalloc space they also need an own TLB entry, which are notouriously scarce in the kernel because often user space wants to monopolize them all. So if you're unlucky and user space is thrashing the TLB just a single call to this hash function will be an own TLB miss and quite expensive. It would be better to just always link it in for this case. -Andi --
On Wed, 20 Feb 2008, Vlad Yasevich wrote: > Ilpo J
That one was a really silly one. The chance of not calling BUG() in that one case was so small, that it didn't really make any sense from Yeah. If you are going to resubmit, feel free to put my Signed-off-by line. -vlad --
Striking. How can this even happen? A callsite which calls dev_alloc_skb(n) is just equivalent to __dev_alloc_skb(n, GFP_ATOMIC); which means there's like 4 (or 8 if it's long) bytes more on the stack. For a worst case, count in another 8 bytes for push and pop or mov on the stack. But that still does not add up to 23 kb. --
__dev_alloc_skb() is also an inline function which performs some extra work. Which raises the question - if dev_alloc_skb() is uninlined, shouldn't __dev_alloc_skb() be uninline as well? --
I'd like to see the results when {__dev_alloc_skb is externed
and dev_alloc_skb remains inlined}.
--
I think you misunderstood the results, if I uninlined dev_alloc_skb(), it _alone_ was uninlined which basically means that __dev_alloc_skb() that is inline as well is included inside that uninlined function. When both were inlined, they add up to everywhere, and uninlining dev_alloc_skb alone mitigates that for both(!) of them in every place where dev_alloc_skb is being called. Because __dev_alloc_skb call sites are few, most benefits show up already with dev_alloc_skb uninlining alone. On the other hand, if __dev_alloc_skb is uninlined, the size reasoning you used above applies to dev_alloc_skb callsites, and that Of course that could be done as well, however, I wouldn't be too keen to deepen callchain by both of them, ie., uninlined dev_alloc_skb would just contain few bytes which perform the call to __dev_alloc_skb which has the bit larger content due to that "extra work". IMHO the best solution would duplicate the "extra work" to both of them on binary level (obviously not on the source level), e.g., by adding static inline ___dev_alloc_skb() to .h which is inlined to both of the variants. I'm not too sure if inline to __dev_alloc_skb() alone is enough in .c file to result in inlining of __dev_alloc_skb to dev_alloc_skb (with all gcc versions and relevant The results are right under your nose already... ;-) See from the list of the series introduction: http://marc.info/?l=linux-netdev&m=120351526210711&w=2 IMHO more interesting number (which I currently don't have) is the _remaining_ benefits of uninlining __dev_alloc_skb after dev_alloc_skb was first uninlined. -- i. --
I guess __builtin_return_address(0) would work. --
On Wed, 20 Feb 2008 15:47:11 +0200 --
This is a surprise. I expect that the -mm-only profile-likely-unlikely-macros.patch is the cause of this and mainline doesn't have this problem. If true, then this likely/unlikely bloat has probably spread into a lot of your other results and it all should be redone against mainline, sorry :( (I'm not aware of anyone having used profile-likely-unlikely-macros.patch in quite some time. That's unfortunate because it has turned up some fairly flagrant code deoptimisations) --
It surprised me as well, there were something like 10 bytes I just couldn't explain in IS_ERR size (kernel/uninlined.c: IS_ERR | +25). I was to look into it deeper but didn't have the .o's at hand right away, not so trivial to store results of 5000+ build results except some carefully picked textual output :-)... Hmm, I'll add logging for the disassembly of Ahaa, this explain it, I suspected that there was something (un)likely related elsewhere as well, no wonder why I couldn't reproduce the 25 bytes It isn't that troublesome to redo them, it's mainly automatic combined with impatient waiting from my behalf :-)... The spreading problem is probably true, to some extent. I did some runs also with carefully selected CONFIG.*DEBUG.* off under include/net/ earlier, in general it made very little difference, if something bloats, it usually does that regardless of .config. There are probably couple of exceptions when the size is on the boundary where it's very close of being useful to uninline it. One interesting thing in there was that the largest offenders are quite small per call-site but due to vast number of them even a small benefit buys off a lot in kernel wide results. I suspect the differences due to (un)likely will be negligle, because the IS_ERR with all its trivialness is now mostly -15, so anything clearly larger than that will likely still be a win x n (where n is quite large). Anyway, I'll see when I get the new set of tests running... :-) I'd prefer with CONFIG.*DEBUG off to get larger picture about non-debug builds too (especially the scatterlist.h things interest me a lot), do you think that would do as well? Thanks for your comments, I found them very useful. -- i. --
Is there any reason they couldn't just be merged to mainline? I think it's a useful facility. -Andi --
I uninlined those with allyesconfig. I'll anyway try later on without a number of debug related CONFIGs. -- i. --
ummm, now why did we made that decision... I think we decided that it's the sort of thing which one person can run once per few months and that will deliver its full value. I can maintain it in -mm and we're happy - no need to add it to mainline. No strong feelings either way really. It does have the downside that the kernel explodes if someone adds unlikely or likely to the vdso code and I need to occasionally hunt down new additions and revert them in that patch. That makes it a bit of a maintenance burden. --
Apparently nobody has been doing it for a while. :-) Last time I did it it was around the submission time and I actually patched it into mainline kernel to do so. Not particularly hard to do, but sitting in mm-only does make it a bit harder, and there are the vdso problem you just mentioned that Is it possible to catch this automatically, like, by re-defining likely/unlikely to the raw form in specific file(s)? Hua --
Sure it would be possible to define a IN_VDSO symbol in all vdso related files and then do that. Might be useful for other things too. vdso has some very specific requirements. -Andi --
This is a multipart MIME message. --==_Exmh_1204139192_52520 Content-Type: text/plain; charset=us-ascii I think it exploded again, for some other reason... I just gave it a try just for grins-n-giggles. The resulting kernel got loaded by grub, the screen cleared, and about 5 seconds later it rebooted. Never got as far as putting up penguin icons. Tried again with netconsole, early_printk=vga, and initcall_debug, and it *still* didn't live long enough to produce anything resembling output. 2.6.25-rc2-mm1, x86_64 on a Dell Latitude D820 laptop, T7200 Core2 Duo. Attached is my *working* config (I'm using it as I type this). Changing to 'CONFIG_PROFILE_LIKELY=y' and rebuilding produces wreckage.... --==_Exmh_1204139192_52520 Content-Type: text/plain ; name=".config"; charset=us-ascii Content-Description: .config Content-Disposition: attachment; filename=".config" # # Automatically generated make config: don't edit # Linux kernel version: 2.6.25-rc2-mm1 # Wed Feb 27 13:39:22 2008 # CONFIG_64BIT=y # CONFIG_X86_32 is not set CONFIG_X86_64=y CONFIG_X86=y # CONFIG_GENERIC_LOCKBREAK is not set CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_SEMAPHORE_SLEEPERS=y CONFIG_FAST_CMPXCHG_LOCAL=y CONFIG_MMU=y CONFIG_ZONE_DMA=y # CONFIG_QUICKLIST is not set CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_IOMAP=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_HWEIGHT=y # CONFIG_GENERIC_GPIO is not set CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set # CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not ...
